Skip to content

[Feature/#183] android 15#184

Merged
chanubc merged 17 commits intodevelopfrom
feature/#183-android-15
Oct 19, 2025
Merged

[Feature/#183] android 15#184
chanubc merged 17 commits intodevelopfrom
feature/#183-android-15

Conversation

@chanubc
Copy link
Copy Markdown
Member

@chanubc chanubc commented Oct 18, 2025

✅ 𝗖𝗵𝗲𝗰𝗸-𝗟𝗶𝘀𝘁

  • merge할 브랜치의 위치를 확인해 주세요(main❌/develop⭕)
  • 리뷰가 필요한 경우 리뷰어를 지정해 주세요
  • P1 단계의 리뷰는 필수로 반영합니다.
  • Approve된 PR은 assigner가 머지하고, 수정 요청이 온 경우 수정 후 다시 push를 합니다.

📌 𝗜𝘀𝘀𝘂𝗲𝘀

📎𝗪𝗼𝗿𝗸 𝗗𝗲𝘀𝗰𝗿𝗶𝗽𝘁𝗶𝗼𝗻

  • android 15 대응
  • 상태바 색상 변경 로직 수정
  • enabled edge to edge
  • agp 8.13.0
  • compile sdk 36

📷 𝗦𝗰𝗿𝗲𝗲𝗻𝘀𝗵𝗼𝘁

💬 𝗧𝗼 𝗥𝗲𝘃𝗶𝗲𝘄𝗲𝗿𝘀

ci 왜.안.돼

Summary by CodeRabbit

  • 새로운 기능

    • 에지-투-에지(Edge-to-edge) 디스플레이 지원 추가
  • 개선 사항

    • 상태표시줄·내비게이션 바 투명화 및 시스템 바 패딩 적용(앱 전체 레이아웃 일관성 향상)
    • 메인 화면 레이아웃과 하단 내비게이션 구조 재구성
    • 스플래시 동작이 생명주기 변화에 더 민감하게 동작하도록 개선
    • Android SDK 및 빌드 도구 버전 상향
  • 제거

    • 상태바 색상 설정 유틸 및 일부 공개 UI 확장(뷰 가시성 등) 삭제

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Oct 18, 2025

Walkthrough

compileSdk·minSdk와 빌드 도구가 상향되고 edge‑to‑edge UI가 활성화되었습니다. 여러 Composable/확장 함수가 제거되거나 View로 이동되었고, 액티비티 레이아웃과 테마가 재구성되어 투명 상태바 자리표시자와 inset 기반 처리로 전환되었습니다.

Changes

Cohort / File(s) 변경 요약
Gradle 및 버전 관리
app/build.gradle.kts, gradle/libs.versions.toml, gradle/wrapper/gradle-wrapper.properties, .github/workflows/develop_PR_builder.yml
compileSdk를 버전 카탈로그(libs.versions.compileSdk)로 참조하도록 변경; catalog에서 compileSdk 35→36, minSdk 24→28 및 coreKtx/appcompat/AGP 버전 상향; Gradle wrapper 8.7→8.13 및 워크플로우 빌드 인자 조정.
UI 확장 함수 — 제거
core/ui/src/main/java/com/teamwable/ui/extensions/ContextExt.kt, core/ui/src/main/java/com/teamwable/ui/extensions/FragmentExt.kt, core/ui/src/main/java/com/teamwable/ui/extensions/ViewVisibleExt.kt
Context.statusBarColorOf(...), Fragment.statusBarColorOf(...), View.visible(...) 제거.
UI 확장 함수 — 추가/이동
core/ui/src/main/java/com/teamwable/ui/extensions/ViewExt.kt
fun View.visible(isVisible: Boolean)fun View.setStatusBarColor(@ColorRes resId: Int) 추가: 배경 리소스 설정과 WindowInsets 리스너로 상태바 영역 높이/패딩 조정.
DesignSystem 제거
core/designsystem/src/main/java/com/teamwable/designsystem/extension/system/SetSystemUiColor.kt
Composable 기반 시스템 UI 유틸(SetStatusBarColor, SetLightNavigationBar) 파일 삭제.
테마 변경
core/ui/src/main/res/values/themes.xml
Base.Theme.Wable의 statusBarColor를 흰색에서 투명으로 변경하고 navigationBarColor를 투명으로 설정.
Activity / Compose 변경 (edge‑to‑edge)
feature/main/src/main/java/.../MainActivity.kt, feature/main-compose/src/main/java/.../MainComposeActivity.kt
enableEdgeToEdge() 호출 추가(앱 실행 초기에 엣지‑투‑엣지 활성화); 기존 Composable 기반 시스템 UI 색상 설정 제거 및 View 기반 처리로 전환.
레이아웃 재구성 및 내비게이션 뷰
feature/main/src/main/res/layout/activity_main.xml
루트 레이아웃을 ConstraintLayoutRelativeLayout으로 변경, status_bar_background View 추가 및 내부 ConstraintLayout으로 NavHost/BottomNavigationView 재구성(계층·제약 변경).
Compose 화면 패딩/효과 변경
feature/auth/.../LoginScreen.kt, feature/main-compose/.../MainScreen.kt, feature/main-compose/.../splash/SplashScreen.kt, feature/onboarding/.../FirstLckWatchScreen.kt
statusBarsPadding/navigationBarsPadding modifier 추가; 디자인 시스템의 SetStatusBarColor 사용 제거; SplashRoute의 LaunchedEffect 키를 lifecycleOwner로 변경(재실행 조건 변경).

Sequence Diagram(s)

sequenceDiagram
    autonumber
    actor User
    participant Activity as MainActivity / MainComposeActivity
    participant Edge as enableEdgeToEdge()
    participant Layout as activity_main(status_bar_background View)
    participant Insets as View.setStatusBarColor / WindowInsets
    participant Nav as NavHostFragment / Compose Nav

    User->>Activity: 앱 시작 / 화면 전환
    Activity->>Edge: enableEdgeToEdge()
    Edge-->>Activity: 시스템 바를 엣지‑투‑엣지로 설정
    Activity->>Layout: 레이아웃 초기화 (status_bar_background 포함)
    Note right of Layout #F3F7FF: 상태바 자리표시자를 View로 처리\nWindowInsets 리스너로 높이/패딩 조정
    Nav->>Insets: 목적지 변경 시 색상/높이 적용 요청
    Insets->>Layout: 배경 리소스 설정 및 상단 inset 적용
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 분

Suggested reviewers

  • sohyun127

Poem

🐰 엣지로 퍼진 화면, 바는 투명히 흐르고
버전은 쑥쑥 올라 새 빌드가 반짝이네 ✨
확장함수 옮기고 자리표시자 심어
패딩 맞추니 레이아웃도 편안히 숨쉬네
토끼는 깡충—릴리즈를 향해 뛰어간다 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title Check ✅ Passed 제목 "[Feature/#183] android 15"는 풀 요청의 주요 변경 사항을 명확하게 요약합니다. Android 15 지원 구현이라는 핵심 목표를 간결하고 구체적으로 나타내며, 원시 요약에서 확인되는 모든 주요 변경 사항(compileSdk 36 업그레이드, AGP 8.13.0, Edge-to-Edge 활성화)을 포괄합니다. 제목은 문제 번호 참조도 포함하여 추적 가능성을 높입니다.
Linked Issues Check ✅ Passed 연결된 이슈 #183 "[FEAT] : android 15 대응"은 Android 15 지원 구현이라는 고수준 목표를 제시합니다. 풀 요청은 이 목표에 부합하는 필수 변경 사항들을 포함합니다: compileSdk 35에서 36으로 업그레이드, minSdk 24에서 28로 업그레이드, AGP 8.13.0 업그레이드, Gradle 래퍼 업데이트, Edge-to-Edge 구현, 상태바 색상 처리 리팩토링, 여러 화면에 대한 Edge-to-Edge 호환성 업데이트. 이러한 변경 사항들은 Android 15 호환성을 달성하기 위한 필수적인 구현입니다.
Out of Scope Changes Check ✅ Passed 모든 코드 변경 사항은 Android 15 지원 구현이라는 연결된 이슈의 목표 범위 내에 있습니다. SDK/도구 체인 업그레이드(compileSdk 36, AGP 8.13.0), Edge-to-Edge 구현(enableEdgeToEdge 호출, 패딩 수정자 추가), 상태바 색상 처리 리팩토링, Compose 화면 업데이트 등 모든 변경 사항이 Android 15 호환성과 직접 관련이 있습니다. SplashScreen의 LaunchedEffect 키 변경을 포함한 라이프사이클 개선도 Android 15 대응의 일부로 고려할 수 있습니다.
Description Check ✅ Passed 풀 요청 설명은 저장소의 필수 템플릿 구조를 완벽하게 따릅니다. 체크리스트, 이슈 링크(#183), 작업 설명(Android 15 대응, 상태바 색상 변경, Edge-to-Edge 활성화, AGP 8.13.0, compileSdk 36), 스크린샷 두 장, 검토자 대상 메모가 모두 포함되어 있습니다. 모든 주요 섹션이 채워져 있어 변경 사항의 의도와 범위를 명확히 할 수 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#183-android-15

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.

Copy link
Copy Markdown

@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: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0c089a8 and f8c14f4.

📒 Files selected for processing (10)
  • app/build.gradle.kts (1 hunks)
  • core/ui/src/main/java/com/teamwable/ui/extensions/ContextExt.kt (0 hunks)
  • core/ui/src/main/java/com/teamwable/ui/extensions/FragmentExt.kt (0 hunks)
  • core/ui/src/main/java/com/teamwable/ui/extensions/ViewExt.kt (1 hunks)
  • core/ui/src/main/java/com/teamwable/ui/extensions/ViewVisibleExt.kt (0 hunks)
  • core/ui/src/main/res/values/themes.xml (1 hunks)
  • feature/main/src/main/java/com/teamwable/main/MainActivity.kt (4 hunks)
  • feature/main/src/main/res/layout/activity_main.xml (1 hunks)
  • gradle/libs.versions.toml (3 hunks)
  • gradle/wrapper/gradle-wrapper.properties (1 hunks)
💤 Files with no reviewable changes (3)
  • core/ui/src/main/java/com/teamwable/ui/extensions/ContextExt.kt
  • core/ui/src/main/java/com/teamwable/ui/extensions/FragmentExt.kt
  • core/ui/src/main/java/com/teamwable/ui/extensions/ViewVisibleExt.kt
🧰 Additional context used
🧬 Code graph analysis (1)
feature/main/src/main/java/com/teamwable/main/MainActivity.kt (2)
core/ui/src/main/java/com/teamwable/ui/extensions/FragmentExt.kt (1)
  • statusBarModeOf (56-58)
core/ui/src/main/java/com/teamwable/ui/extensions/ContextExt.kt (1)
  • statusBarModeOf (101-107)
⏰ 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). (1)
  • GitHub Check: PR Checker
🔇 Additional comments (12)
app/build.gradle.kts (1)

28-28: 버전 카탈로그 참조로 개선됨.

compileSdk를 하드코딩된 값에서 버전 카탈로그로 변경하여 버전 관리가 중앙화되었습니다. 이는 모범 사례이며 프로젝트 전체에서 SDK 버전의 일관성을 보장합니다.

gradle/wrapper/gradle-wrapper.properties (1)

4-4: AGP 8.13.0과 호환 가능한 Gradle 버전으로 업데이트됨.

Gradle을 8.7에서 8.13으로 업데이트한 것은 AGP 8.13.0 요구사항과 일치하며 적절합니다.

gradle/libs.versions.toml (3)

3-3: minSdk 변경 사항 확인 필요 (24 → 28).

minSdk를 24에서 28로 변경하면 Android 7.x 기기 지원이 중단됩니다. 이는 상당한 비즈니스 영향(시장 도달 범위 감소)을 미칠 수 있으므로 의도적인 변경인지 확인이 필요합니다.


46-46: AGP 버전 대폭 업그레이드 검증 필요 (8.5.1 → 8.13.0).

주요 버전 점프(8개 마이너 버전)이므로, 팀의 JDK 17 이상 사용 여부 확인 및 프로젝트의 기존 빌드 스크립트에서 제거된 AGP API 사용 여부를 검증하십시오. 로컬 빌드 테스트를 통해 호환성을 확인하는 것을 권장합니다.


16-17: AndroidX 라이브러리가 Android 15 지원을 위해 적절히 업데이트됨.

coreKtx 1.13.1 → 1.17.0appcompat 1.7.0 → 1.7.1 업데이트는 Android 15 호환성 개선과 일치합니다.

core/ui/src/main/res/values/themes.xml (1)

4-5: LGTM! Edge-to-edge UI를 위한 적절한 테마 설정입니다.

투명 상태바와 네비게이션바 설정은 Android 15 대응 및 edge-to-edge 구현을 위한 표준적인 접근 방식입니다.

core/ui/src/main/java/com/teamwable/ui/extensions/ViewExt.kt (1)

9-11: LGTM! 명확하고 간결한 구현입니다.

Visibility 토글 로직이 정확하게 구현되어 있습니다.

feature/main/src/main/java/com/teamwable/main/MainActivity.kt (2)

67-67: LGTM! Edge-to-edge가 올바르게 활성화되었습니다.

enableEdgeToEdge()super.onCreate() 전에 호출하는 것은 Android 15 대응을 위한 권장 패턴입니다.


225-232: LGTM! 상태바 색상 전환 로직이 명확하게 구현되었습니다.

네비게이션 목적지에 따라 상태바 색상과 모드를 적절하게 변경하고 있습니다.

feature/main/src/main/res/layout/activity_main.xml (3)

2-10: LGTM! 상태바 배경을 위한 적절한 레이아웃 구조입니다.

status_bar_background View가 추가되어 동적으로 상태바 색상을 제어할 수 있게 되었습니다. 초기 높이를 0dp로 설정하고 런타임에 window insets를 통해 조정하는 방식은 edge-to-edge UI의 표준 패턴입니다.


15-15: fitsSystemWindows="true" 설정이 edge-to-edge UI와 의도대로 동작하는지 확인해주세요.

Edge-to-edge UI에서 fitsSystemWindows="true"를 사용하면 시스템 바 영역을 피하기 위한 자동 패딩이 추가됩니다. 현재 구조에서는:

  • status_bar_background가 별도로 상태바 영역을 처리하고 있고
  • ConstraintLayoutfitsSystemWindows="true"로 시스템 창 insets를 소비합니다

이것이 의도된 동작인지, 아니면 fitsSystemWindows를 제거하고 수동으로 패딩을 관리해야 하는지 실제 기기에서 테스트해주세요. 특히 다음 사항들을 확인해주세요:

  1. 상단 콘텐츠가 상태바와 겹치지 않는지
  2. 하단 네비게이션 바 영역이 의도대로 동작하는지
  3. 다양한 화면 비율 (제스처 네비게이션 vs 버튼 네비게이션)에서 정상 동작하는지

17-61: LGTM! 하단 네비게이션 구조가 명확하게 재구성되었습니다.

Group을 사용하여 하단 네비게이션 요소들을 함께 관리할 수 있게 되어 가시성 제어가 더 용이해졌습니다.

Comment on lines +2 to 4
compileSdk = "36"
minSdk = "28"
targetSdk = "35"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

targetSdk를 compileSdk와 일치시켜야 함 (현재 불일치: targetSdk 35 < compileSdk 36).

Android 15 완전 지원 및 PR 설명의 edge-to-edge 기능을 위해 targetSdk를 36으로 업데이트해야 합니다. targetSdk가 compileSdk보다 낮으면 최신 OS 최적화를 활용할 수 없으며, edge-to-edge 구현에 문제가 발생할 수 있습니다.

제안되는 수정:

- targetSdk = "35"
+ targetSdk = "36"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
compileSdk = "36"
minSdk = "28"
targetSdk = "35"
compileSdk = "36"
minSdk = "28"
targetSdk = "36"
🤖 Prompt for AI Agents
In gradle/libs.versions.toml around lines 2 to 4, targetSdk is set to 35 while
compileSdk is 36; update targetSdk to "36" so it matches compileSdk to enable
Android 15 optimizations and proper edge-to-edge behavior — edit the targetSdk
entry value from "35" to "36" and save the file.

Copy link
Copy Markdown

@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: 0

🧹 Nitpick comments (1)
feature/main-compose/src/main/java/com/teamwable/main_compose/splash/SplashScreen.kt (1)

32-35: LaunchedEffect 키를 lifecycleOwner로 바꾼 의도 확인 필요 — observeAutoLogin 중복 실행 리스크

  • lifecycleOwner 교체(구성 변경, NavHost 재마운트 등) 시 본 효과가 재실행되어 2초 후 observeAutoLogin()이 다시 호출될 수 있습니다. observeAutoLogin()이 멱등(idempotent)하거나 중복 구독을 방지하지 않으면 네트워크/구독 중복이 발생할 수 있습니다. 의도된 동작인가요?

  • 한 번만 실행하려면 Unit 키로 유지하는 편이 안전합니다:

-    LaunchedEffect(lifecycleOwner) {
+    LaunchedEffect(Unit) {
         delay(2000)
         viewModel.observeAutoLogin()
     }
  • 만약 owner 변경 시 재실행이 목적이라면, VM 내부에서 중복 방어(once 플래그/AtomicBoolean, distinctUntilChanged, 이전 Job cancel 등) 또는 init 블록에서 1회만 관찰을 시작하도록 정리하는 것을 권장합니다.

  • 참고(선택): 아래 sideEffect 수집은 repeatOnLifecycle 패턴으로 바꾸면 수명 주기 경계가 더 명확합니다.

LaunchedEffect(lifecycleOwner) {
  lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
    viewModel.sideEffect.collect { /* navigate */ }
  }
}

또한 최신 내비게이션 람다를 보장하려면 rememberUpdatedState로 캡처하세요.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f8c14f4 and 2da1bc7.

📒 Files selected for processing (5)
  • feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (2 hunks)
  • feature/main-compose/src/main/java/com/teamwable/main_compose/MainComposeActivity.kt (2 hunks)
  • feature/main-compose/src/main/java/com/teamwable/main_compose/MainScreen.kt (5 hunks)
  • feature/main-compose/src/main/java/com/teamwable/main_compose/splash/SplashScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamwable/onboarding/firstlckwatch/FirstLckWatchScreen.kt (0 hunks)
💤 Files with no reviewable changes (1)
  • feature/onboarding/src/main/java/com/teamwable/onboarding/firstlckwatch/FirstLckWatchScreen.kt
🧰 Additional context used
🧬 Code graph analysis (1)
feature/main-compose/src/main/java/com/teamwable/main_compose/MainScreen.kt (1)
feature/auth/src/main/java/com/teamwable/auth/naviagation/AuthNavigation.kt (1)
  • loginNavGraph (14-26)
⏰ 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). (1)
  • GitHub Check: PR Checker
🔇 Additional comments (8)
feature/main-compose/src/main/java/com/teamwable/main_compose/MainComposeActivity.kt (2)

8-8: LGTM: edge-to-edge 지원을 위한 올바른 import

Android의 표준 edge-to-edge API import가 적절하게 추가되었습니다.


24-24: enableEdgeToEdge() 호출 적절함 - 검증 완료

enableEdgeToEdge()가 올바르게 호출되었으며, MainScreen Composable에서 statusBarsPadding() 모디파이어를 통해 WindowInsets을 적절히 처리하고 있습니다. 콘텐츠가 상태바 아래에 가려지지 않도록 제대로 구현되어 있습니다.

feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (2)

11-11: Import 추가 확인됨.

Edge-to-edge UI를 위한 navigationBarsPadding import가 적절히 추가되었습니다.


156-157: Edge-to-edge 대응이 올바르게 구현되었습니다.

화면 하단에 navigationBarsPadding()을 추가하여 시스템 네비게이션 바와 컨텐츠가 겹치지 않도록 처리했습니다. 다만 Android 15 기기에서 다양한 네비게이션 바 설정(제스처/버튼)으로 실제 테스트하여 간격이 적절한지 확인해주세요.

feature/main-compose/src/main/java/com/teamwable/main_compose/MainScreen.kt (4)

7-7: Import 추가 확인됨.

Edge-to-edge 지원을 위한 statusBarsPadding import가 적절히 추가되었습니다.


59-59: 상태바 패딩이 올바르게 적용되었습니다.

WableAppBar에 statusBarsPadding()을 추가하여 edge-to-edge 모드에서 상태바와 겹치지 않도록 처리했습니다.


68-72: 조건부 패딩 로직이 정확합니다.

Top bar 표시 여부에 따라 innerPadding을 조건부로 적용하여 컨텐츠가 적절히 배치되도록 구현했습니다. Top bar가 표시될 때는 패딩을 적용하고, 숨겨질 때는 전체 화면을 사용하는 로직이 올바릅니다.


90-90: Activity 시작 방식이 간소화되었습니다.

ContextCompat.startActivity 대신 localContext.startActivity를 직접 사용하도록 변경되었습니다. localContext는 유효한 Context이므로 이 변경은 적절합니다.

Also applies to: 94-94, 110-110

@chanubc chanubc added ⭐ [FEAT] 새로운 기능 구현 🐻 찬우 차은우 ☕ [COMPOSE] 컴포즈 ui labels Oct 18, 2025
Copy link
Copy Markdown

@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: 2

🧹 Nitpick comments (1)
feature/main/src/main/res/layout/activity_main.xml (1)

2-5: 불필요한 레이아웃 중첩을 단순화할 수 있습니다.

RelativeLayout이 단일 ConstraintLayout을 래핑하는 구조는 불필요한 뷰 계층 깊이를 추가합니다. ConstraintLayout을 루트로 사용하고 status_bar_background와 네비게이션 컴포넌트를 모두 제약 조건으로 배치하면 더 효율적입니다.

레이아웃 구조를 단순화하려면 다음과 같이 수정할 수 있습니다:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/status_bar_background"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fcv_main"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@id/divider_main_bnv"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <!-- 나머지 뷰들... -->

</androidx.constraintlayout.widget.ConstraintLayout>

Also applies to: 12-14

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4738992 and d63fb76.

📒 Files selected for processing (3)
  • .github/workflows/develop_PR_builder.yml (1 hunks)
  • feature/main/src/main/java/com/teamwable/main/MainActivity.kt (5 hunks)
  • feature/main/src/main/res/layout/activity_main.xml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/develop_PR_builder.yml
🧰 Additional context used
🧬 Code graph analysis (1)
feature/main/src/main/java/com/teamwable/main/MainActivity.kt (2)
core/ui/src/main/java/com/teamwable/ui/extensions/FragmentExt.kt (1)
  • statusBarModeOf (56-58)
core/ui/src/main/java/com/teamwable/ui/extensions/ContextExt.kt (1)
  • statusBarModeOf (101-107)
⏰ 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). (1)
  • GitHub Check: PR Checker
🔇 Additional comments (3)
feature/main/src/main/java/com/teamwable/main/MainActivity.kt (3)

67-67: LGTM! enableEdgeToEdge() 호출 위치가 올바릅니다.

super.onCreate() 이전에 enableEdgeToEdge()를 호출하는 것이 Android 공식 가이드에 맞습니다.


227-227: 상태바 색상 관리 방식 변경을 확인했습니다.

Window 기반의 statusBarColorOf()에서 View 기반의 setStatusBarColor()로 변경되었습니다. 이 접근 방식은 edge-to-edge UI와 함께 사용하기에 적합하지만, activity_main.xmlstatus_bar_background View가 올바르게 구성되어야 정상 동작합니다.

Also applies to: 234-234


110-110: 코드가 정상입니다. navGraph 설정 중복 우려는 해소되었습니다.

XML의 FragmentContainerViewapp:navGraph 속성이 설정되어 있지 않으므로, 코드의 navController.setGraph(R.navigation.graph_main) 호출은 필수적이고 중복이 아닙니다. 이는 NavHostFragment 설정에서 표준적인 패턴입니다.

Comment on lines +7 to +10
<View
android:id="@+id/status_bar_background"
android:layout_width="match_parent"
android:layout_height="0dp" />
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

상태바 배경 View의 높이가 0dp로 설정되어 렌더링되지 않습니다.

status_bar_background View의 높이가 0dp로 설정되어 있어 화면에 표시되지 않습니다. MainActivity.kt에서 이 View에 색상을 설정하지만 효과가 없을 것입니다.

다음 diff를 적용하여 상태바 높이만큼 표시되도록 수정하세요:

     <View
         android:id="@+id/status_bar_background"
         android:layout_width="match_parent"
-        android:layout_height="0dp" />
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:fitsSystemWindows="true" />

또는 insets을 활용하여 동적으로 상태바 높이를 적용하는 방법도 고려해주세요.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<View
android:id="@+id/status_bar_background"
android:layout_width="match_parent"
android:layout_height="0dp" />
<View
android:id="@+id/status_bar_background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:fitsSystemWindows="true" />
🤖 Prompt for AI Agents
In feature/main/src/main/res/layout/activity_main.xml lines 7-10, the
status_bar_background View has android:layout_height="0dp" so it doesn't render;
change the layout to give it a real height (e.g., replace 0dp with wrap_content
or reference a dimension like @dimen/status_bar_height) and add a
status_bar_height dimen (or compute it at runtime) OR remove the fixed height
and instead apply system window insets in MainActivity (use
WindowInsets/WindowInsetsCompat to set the view's height or top padding to the
status bar inset) so the background covers the status bar area.

android:layout_width="match_parent"
android:layout_height="match_parent"
app:constraint_referenced_ids="divider_main_bnv, bnv_main" />
android:fitsSystemWindows="true">
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

fitsSystemWindows="true"가 enableEdgeToEdge()와 충돌합니다.

enableEdgeToEdge()는 콘텐츠가 시스템 바 아래까지 확장되도록 설정하지만, fitsSystemWindows="true"는 insets을 소비하고 패딩을 추가하여 edge-to-edge를 무효화합니다.

다음 diff를 적용하여 충돌을 해결하세요:

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:fitsSystemWindows="true">
+        android:clipToPadding="false">

그리고 필요한 경우 WindowInsetsCompat를 사용하여 개별 뷰에 insets을 수동으로 적용하세요.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
android:fitsSystemWindows="true">
android:layout_width="match_parent"
android:layout_height="match_parent">
🤖 Prompt for AI Agents
In feature/main/src/main/res/layout/activity_main.xml around line 15, the layout
has android:fitsSystemWindows="true" which conflicts with enableEdgeToEdge();
remove or set this attribute to false so the content can extend beneath system
bars, and if specific views still need inset handling apply WindowInsetsCompat
in code to consume/apply insets (add padding/margin) on those views as needed.

Copy link
Copy Markdown
Collaborator

@sohyun127 sohyun127 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!!👍👍👍

Copy link
Copy Markdown

@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: 0

🧹 Nitpick comments (1)
feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (1)

115-116: statusBarsPadding() 구현이 올바르게 적용되었습니다.

코드베이스 전체에서 statusBarsPadding() 사용을 확인했으며, LoginScreen.kt 라인 115의 구현은 MainScreen.kt의 패턴과 일치합니다. edge-to-edge 레이아웃 처리가 적절하게 이루어졌습니다.

라인 116의 빈 줄을 제거하여 코드 정리를 권장합니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d63fb76 and b690b2e.

📒 Files selected for processing (1)
  • feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (3 hunks)
⏰ 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). (1)
  • GitHub Check: PR Checker
🔇 Additional comments (2)
feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (2)

11-11: LGTM! Edge-to-edge 구현을 위한 올바른 import입니다.

statusBarsPaddingnavigationBarsPadding은 Android 15의 edge-to-edge UI를 지원하기 위한 적절한 Modifier입니다.

Also applies to: 13-13


159-160: 하단 네비게이션 바 인셋 처리가 올바르게 추가되었습니다.

navigationBarsPadding()을 사용하여 시스템 네비게이션 바 영역을 올바르게 처리했습니다. 카카오 로그인 버튼의 기존 bottom = 54.dp 패딩과 함께 적절한 여백을 제공합니다.

다음 사항을 검증하시기 바랍니다:

  • 제스처 내비게이션이 활성화된 기기와 버튼 네비게이션 기기 모두에서 하단 여백이 자연스러운지 확인
  • 가로 모드에서도 레이아웃이 올바르게 동작하는지 확인

@chanubc chanubc merged commit 53cd0e9 into develop Oct 19, 2025
2 checks passed
@chanubc chanubc deleted the feature/#183-android-15 branch October 19, 2025 14:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

☕ [COMPOSE] 컴포즈 ui ⭐ [FEAT] 새로운 기능 구현 🐻 찬우 차은우

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] : android 15 대응

2 participants