Skip to content

Conversation

@easyhooon
Copy link
Contributor

@easyhooon easyhooon commented Jan 15, 2026

🔗 관련 이슈

📙 작업 설명

  • 이런 무서운 워닝이 뜨는 것 말고는 딱히, 36으로 올렸을때 문제가 되는 부분은 없는 듯 합니다.
image

관련 대응 문서

PD님들과 의논하여 세로 고정을 비활성화할 수는 있을듯 한데, 일단은 protrait 속성이 재대로 적용은 되긴 하므로 홀드하겠습니다..!

🧪 테스트 내역 (선택)

  • 주요 기능 정상 동작 확인
  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

📸 스크린샷 또는 시연 영상 (선택)

기능 미리보기 기능 미리보기
기능 설명 기능 설명

💬 추가 설명 or 리뷰 포인트 (선택)

Summary by CodeRabbit

릴리스 노트

  • Chores
    • Android SDK 36 업데이트 및 라이브러리 의존성 버전 상향
    • 내부 상태 관리 로직 정리

✏️ Tip: You can customize this high-level summary in your review settings.

- circuit 라이브러리내에 kotlinx.collections.immutable 라이브러리가 제외되어 featureConventionPlugin내에 immutable 라이브러리 의존성 추가

- navigation stateOptions 방식 적용
@coderabbitai
Copy link

coderabbitai bot commented Jan 15, 2026

Walkthrough

빌드 구성을 업그레이드하고 불변 컬렉션 라이브러리를 추가했으며, Navigator 상태 관리를 두 개의 불린 플래그에서 단일 enum 옵션으로 리팩토링했습니다. 전체 제어 흐름은 변경되지 않았습니다.

Changes

응집도 / 파일(들) 변경 사항 요약
의존성 추가
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt
kotlinx-collections-immutable 라이브러리 의존성 추가
Navigator 옵션 리팩토링
feature/home/src/main/kotlin/.../HomePresenter.kt, feature/library/src/main/kotlin/.../LibraryPresenter.kt
Navigator.StateOptions.SaveAndRestore 열거형으로 saveState/restoreState 불린 매개변수 통합
라이브러리 버전 업그레이드
gradle/libs.versions.toml
targetSdk/compileSdk 35→36, AGP 8.12.0→8.12.3, Compose BOM 2025.07.00→2026.01.00, Circuit 0.30.0→0.32.0, Kakao 2.22.0→2.23.2, Landscapist 2.5.1→2.8.2, AndroidX 및 신규 라이브러리 추가

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 의존성 갱신하고 옵션 정리하니
더욱 깔끔한 코드로 탈바꿈!
불린 대신 열거형으로 우아하게
버전 올려 최신 기술과 함께
부스팅된 Booket의 미래! 🚀

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ⚠️ Warning PR 제목 'chore: Android Tar'은 불완전하고 의미가 불명확하여 실제 변경사항을 제대로 설명하지 못합니다. 제목을 'chore: Upgrade Android SDK and dependencies' 또는 'chore: Update targetSdk to 36 and library versions'로 변경하여 주요 변경사항을 명확히 드러내세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@easyhooon easyhooon changed the title chore: Android Tar chore: Android Target SDK 36 대응 Jan 15, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@gradle/libs.versions.toml`:
- Around line 4-5: MainActivity is forcing portrait via
android:screenOrientation="portrait" in
feature/main/src/main/AndroidManifest.xml which on SDK 36 will be overridden on
large screens; fix by either (A) making MainActivity/your UI responsive to both
orientations (remove the android:screenOrientation attribute from the
MainActivity element and update layouts to support landscape), or (B) allow
restricted resizability by adding the compat property to the <application>
element: set android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY to
true, or (C) explicitly restrict distribution to small screens via
manifest/device compatibility settings; choose one approach and update the
MainActivity manifest entry and/or the <application> tag accordingly.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f609c4 and 52dd7bd.

📒 Files selected for processing (4)
  • build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt
  • feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt
  • feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt
  • gradle/libs.versions.toml
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-08-28T12:25:54.058Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 174
File: feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/book/BookSearchPresenter.kt:128-133
Timestamp: 2025-08-28T12:25:54.058Z
Learning: In BookSearchPresenter.kt, when a guest user tries to register a book and is redirected to login, the bottom sheet (isBookRegisterBottomSheetVisible) and selection state (selectedBookIsbn, selectedBookStatus) are intentionally kept open/preserved so that when the user returns from login, they can continue from where they left off without losing context.

Applied to files:

  • feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt
  • feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt
📚 Learning: 2025-07-16T16:11:27.044Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 52
File: feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/DelegateNavigator.kt:0-0
Timestamp: 2025-07-16T16:11:27.044Z
Learning: In the Reed-Android project's DelegateNavigator implementation, the pop(), peek(), and peekBackStack() methods should always use childNavigator without branching logic, as they operate on the currently active navigation stack. Only goTo() and resetRoot() methods need to route between childNavigator and rootNavigator based on screen type using isMainTabScreen() function.

Applied to files:

  • feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt
  • feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt
📚 Learning: 2025-07-20T12:34:23.786Z
Learnt from: easyhooon
Repo: YAPP-Github/Reed-Android PR: 61
File: feature/webview/build.gradle.kts:17-21
Timestamp: 2025-07-20T12:34:23.786Z
Learning: Reed-Android 프로젝트에서는 `booket.android.feature` convention plugin을 사용하여 feature 모듈들의 공통 의존성을 관리한다. 이 plugin은 Circuit, Compose, 그리고 core 모듈들의 의존성을 자동으로 포함하므로, 각 feature 모듈의 build.gradle.kts에서는 특별한 의존성(예: libs.logger, libs.kakao.auth)만 별도로 선언하면 된다.

Applied to files:

  • build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt
  • gradle/libs.versions.toml
🧬 Code graph analysis (1)
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt (1)
build-logic/src/main/kotlin/com/ninecraft/booket/convention/Dependencies.kt (1)
  • implementation (6-8)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: ci-build
  • GitHub Check: Compose Stability Check
🔇 Additional comments (5)
build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt (1)

36-36: LGTM! Circuit 라이브러리 업그레이드에 따른 적절한 의존성 추가입니다.

Circuit 0.32.0 버전에서 kotlinx.collections.immutable이 transitive dependency에서 제거되었으므로, feature 모듈에서 persistentListOf, toPersistentList 등을 사용하기 위해 명시적으로 추가하는 것이 올바른 접근입니다. Based on learnings, 이 convention plugin이 feature 모듈들의 공통 의존성을 관리하므로 적절한 위치입니다.

feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt (1)

184-189: LGTM! Circuit 0.32.0 API 변경에 맞춘 적절한 리팩토링입니다.

saveState = true, restoreState = true 두 개의 boolean 플래그를 Navigator.StateOptions.SaveAndRestore 단일 enum 옵션으로 변경하여 가독성과 타입 안전성이 향상되었습니다. HomePresenter와 일관된 패턴을 유지하고 있습니다.

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt (1)

115-120: LGTM! LibraryPresenter와 동일한 패턴으로 일관성 있게 변경되었습니다.

탭 전환 시 상태 저장/복원 로직이 Circuit의 새로운 StateOptions API를 사용하도록 올바르게 마이그레이션되었습니다.

gradle/libs.versions.toml (2)

22-22: Compose BOM 버전이 안정 버전임을 확인했습니다.

androidx-compose-bom = "2026.01.00"은 2026년 1월 14일에 릴리스된 안정 버전(stable)입니다. 버전 선택에 문제가 없습니다.


46-46: Circuit 0.32.0 업그레이드 API 변경 사항이 올바르게 반영되었습니다.

Circuit 0.30.0에서 0.32.0으로의 업그레이드에 따라:

  1. kotlinx.collections.immutable이 transitive dependency에서 제거되어 AndroidFeatureConventionPlugin에서 명시적으로 추가됨
  2. Navigator.resetRoot의 상태 옵션이 boolean 파라미터에서 Navigator.StateOptions enum으로 변경되어 HomePresenter, LibraryPresenter에서 SaveAndRestore 옵션을 사용하도록 업데이트됨

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines +4 to +5
targetSdk = "36"
compileSdk = "36"
Copy link

@coderabbitai coderabbitai bot Jan 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "gradle/libs.versions.toml" -type f

Repository: YAPP-Github/Reed-Android

Length of output: 50


🏁 Script executed:

cat -n gradle/libs.versions.toml | head -60

Repository: YAPP-Github/Reed-Android

Length of output: 1531


🌐 Web query:

Android SDK 36 portrait orientation warning issue

💡 Result:

Short answer: This is expected with Android SDK 36 (Android 16). Apps targeting SDK 36 will have manifest orientation/resize restrictions ignored on large screens (sw600dp and up), so a portrait-locked app can be forced into other orientations or resizable windows on tablets/foldables/Chromebooks. You can either make your UI adaptive, opt out temporarily for compatibility, or limit distribution. (googblogs.com)

What to do (concise):

  • Make layouts adaptive (support both portrait & landscape / windowed sizes). (googblogs.com)
  • Temporary opt-out: add in :

    (Note: opt-out will be ignored for sw>=600dp starting API 37). (stackoverflow.com)
  • If you must stay portrait and cannot adapt: restrict distribution to smaller devices via or exclude devices in Play Console. (stackoverflow.com)

If you want, I can: show the exact manifest snippet, checklist for adapting layouts, or help test with Android 16 emulator images.

Citations:


🏁 Script executed:

find . -name "AndroidManifest.xml" -type f

Repository: YAPP-Github/Reed-Android

Length of output: 146


🏁 Script executed:

rg -i "screenorientation|PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY|supports-screens" --type xml

Repository: YAPP-Github/Reed-Android

Length of output: 158


🏁 Script executed:

rg "screenOrientation|PROPERTY_COMPAT" -A 2 -B 2

Repository: YAPP-Github/Reed-Android

Length of output: 514


SDK 36 업그레이드는 portrait 화면 고정 관련 주요 변경사항이 필요합니다.

Android SDK 36 (Android 16)에서 portrait로 고정된 앱은 큰 화면(sw600dp 이상)에서 강제로 landscape 또는 resizable 상태로 변경됩니다. 현재 feature/main/src/main/AndroidManifest.xml의 MainActivity에 android:screenOrientation="portrait" 설정이 있으나, 이에 대한 완화 조치가 없습니다.

다음 중 하나를 구현하세요:

  1. UI를 반응형으로 변경하여 portrait과 landscape를 모두 지원
  2. application 태그에 호환성 속성 추가: <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  3. 앱 배포를 작은 기기로 제한
🤖 Prompt for AI Agents
In `@gradle/libs.versions.toml` around lines 4 - 5, MainActivity is forcing
portrait via android:screenOrientation="portrait" in
feature/main/src/main/AndroidManifest.xml which on SDK 36 will be overridden on
large screens; fix by either (A) making MainActivity/your UI responsive to both
orientations (remove the android:screenOrientation attribute from the
MainActivity element and update layouts to support landscape), or (B) allow
restricted resizability by adding the compat property to the <application>
element: set android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY to
true, or (C) explicitly restrict distribution to small screens via
manifest/device compatibility settings; choose one approach and update the
MainActivity manifest entry and/or the <application> tag accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 앱 배포를 작은 기기로 제한

이게 가능해? 현재 play console에서 지원하는지 궁금해

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🌐 Web query:

Google Play Console device screen size distribution restriction 2026

💡 Result:

Short answer

  • Google Play Console does let you restrict availability by device (device catalog) and by manifest filters (e.g., the rarely‑recommended ) but Google is moving away from letting apps block large‑screen behavior at runtime — Android 16 removes app-level orientation/resizability locks on large screens and Play’s target‑SDK schedule makes those changes relevant for developers in 2026. [1][2][3][4]

What that means (concise)

  • To exclude specific models or hardware characteristics use the Play Console Device catalog (manual excludes or spec/performance rules). This still controls which devices can see/install your app. [2]
  • Do NOT rely on to control distribution unless you intentionally want to dramatically shrink your install base — it’s an advanced filter and will exclude all unspecified screen/density combos. Use Device catalog excludes instead. [3]
  • Starting with Android 16 (changes rolling into Play requirements in 2026) platform behavior will force apps to be resizable and honor both orientations on “large screen” devices (smallest width ≥600dp). Test and make your app adaptive rather than attempting to block large‑screen devices; Google’s Play target‑SDK deadlines make this effective for many apps in 2026 (target API changes required Aug 2026 for API 36 per Google’s guidance). [1][4]

If you want, I can:

  • show exactly where to exclude devices in the Play Console and screenshots, or
  • scan your manifest for problematic filters and suggest minimal edits.

Sources

  • Android developers blog — Android 16 changes (resizability/orientation, large‑screen behavior). [1]
  • Google Play Console — Device catalog (view/exclude devices). [2]
  • Google Play filters docs — and manifest filtering guidance. [3]
  • Google Play target API requirements / timeline (dates for target SDK changes affecting 2026). [4]

@easyhooon 네, 가능합니다! Play Console에서 Device catalog 기능을 통해 특정 기기나 화면 크기별로 앱 배포를 제한할 수 있습니다.

Play Console의 Device catalog에서 특정 모델을 수동으로 제외하거나 하드웨어 사양/성능 규칙으로 필터링할 수 있습니다.

실제 구현 방법:

  1. Play Console Device catalog 사용 (권장):

    • Play Console → 앱 선택 → Release → Device catalog에서 태블릿/폴더블 기기를 수동으로 제외
    • 화면 크기나 특정 기기 모델 기준으로 필터링 가능
  2. Manifest의 <compatible-screens> (비권장):

    • 이 방식은 지정되지 않은 모든 화면/밀도 조합을 제외하므로 설치 가능 기기가 급격히 줄어듭니다.

다만 주의사항:
Android 16부터 큰 화면(sw600dp 이상) 기기에서는 앱의 orientation/resizability 제한이 플랫폼 수준에서 무시되며, Google의 2026년 target SDK 정책으로 인해 많은 앱에 영향을 줄 예정입니다.

권장 사항:
기기 제한보다는 반응형 UI 구현이 장기적으로 더 나은 선택입니다. Google의 방향성이 앱을 adaptive하게 만드는 것이므로, 현재 portrait 고정을 유지하면서 점진적으로 landscape 지원을 추가하는 것을 고려해보세요.

필요하시면 Play Console의 Device catalog 설정 방법이나 반응형 UI 구현 가이드를 더 자세히 안내해드릴 수 있습니다! 🐰

/)/)

(. .)
( づ💡


🧠 Learnings used
Learnt from: seoyoon513
Repo: YAPP-Github/Reed-Android PR: 204
File: app/src/main/kotlin/com/ninecraft/booket/ReedFirebaseMessagingService.kt:80-91
Timestamp: 2025-10-28T05:53:09.370Z
Learning: Reed-Android 프로젝트의 minSdk는 28이므로, API 26+ (Android O) 이상에서만 사용 가능한 API (예: NotificationChannel)에 대한 런타임 SDK 버전 체크를 제안하지 않아야 함

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants