Conversation
…age status bar color
WalkthroughcompileSdk·minSdk와 빌드 도구가 상향되고 edge‑to‑edge UI가 활성화되었습니다. 여러 Composable/확장 함수가 제거되거나 View로 이동되었고, 액티비티 레이아웃과 테마가 재구성되어 투명 상태바 자리표시자와 inset 기반 처리로 전환되었습니다. Changes
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 적용
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 분 Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 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.0과appcompat 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_backgroundView가 추가되어 동적으로 상태바 색상을 제어할 수 있게 되었습니다. 초기 높이를 0dp로 설정하고 런타임에 window insets를 통해 조정하는 방식은 edge-to-edge UI의 표준 패턴입니다.
15-15:fitsSystemWindows="true"설정이 edge-to-edge UI와 의도대로 동작하는지 확인해주세요.Edge-to-edge UI에서
fitsSystemWindows="true"를 사용하면 시스템 바 영역을 피하기 위한 자동 패딩이 추가됩니다. 현재 구조에서는:
status_bar_background가 별도로 상태바 영역을 처리하고 있고ConstraintLayout이fitsSystemWindows="true"로 시스템 창 insets를 소비합니다이것이 의도된 동작인지, 아니면
fitsSystemWindows를 제거하고 수동으로 패딩을 관리해야 하는지 실제 기기에서 테스트해주세요. 특히 다음 사항들을 확인해주세요:
- 상단 콘텐츠가 상태바와 겹치지 않는지
- 하단 네비게이션 바 영역이 의도대로 동작하는지
- 다양한 화면 비율 (제스처 네비게이션 vs 버튼 네비게이션)에서 정상 동작하는지
17-61: LGTM! 하단 네비게이션 구조가 명확하게 재구성되었습니다.
Group을 사용하여 하단 네비게이션 요소들을 함께 관리할 수 있게 되어 가시성 제어가 더 용이해졌습니다.
| compileSdk = "36" | ||
| minSdk = "28" | ||
| targetSdk = "35" |
There was a problem hiding this comment.
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.
| 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.
There was a problem hiding this comment.
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
📒 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 지원을 위한 올바른 importAndroid의 표준 edge-to-edge API import가 적절하게 추가되었습니다.
24-24: enableEdgeToEdge() 호출 적절함 - 검증 완료
enableEdgeToEdge()가 올바르게 호출되었으며,MainScreenComposable에서statusBarsPadding()모디파이어를 통해 WindowInsets을 적절히 처리하고 있습니다. 콘텐츠가 상태바 아래에 가려지지 않도록 제대로 구현되어 있습니다.feature/auth/src/main/java/com/teamwable/auth/LoginScreen.kt (2)
11-11: Import 추가 확인됨.Edge-to-edge UI를 위한
navigationBarsPaddingimport가 적절히 추가되었습니다.
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 지원을 위한
statusBarsPaddingimport가 적절히 추가되었습니다.
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
…tatus bar insets handling
There was a problem hiding this comment.
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
📒 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.xml의status_bar_backgroundView가 올바르게 구성되어야 정상 동작합니다.Also applies to: 234-234
110-110: 코드가 정상입니다. navGraph 설정 중복 우려는 해소되었습니다.XML의
FragmentContainerView에app:navGraph속성이 설정되어 있지 않으므로, 코드의navController.setGraph(R.navigation.graph_main)호출은 필수적이고 중복이 아닙니다. 이는 NavHostFragment 설정에서 표준적인 패턴입니다.
| <View | ||
| android:id="@+id/status_bar_background" | ||
| android:layout_width="match_parent" | ||
| android:layout_height="0dp" /> |
There was a problem hiding this comment.
상태바 배경 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.
| <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"> |
There was a problem hiding this comment.
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.
| 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.
There was a problem hiding this comment.
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
📒 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입니다.
statusBarsPadding과navigationBarsPadding은 Android 15의 edge-to-edge UI를 지원하기 위한 적절한 Modifier입니다.Also applies to: 13-13
159-160: 하단 네비게이션 바 인셋 처리가 올바르게 추가되었습니다.
navigationBarsPadding()을 사용하여 시스템 네비게이션 바 영역을 올바르게 처리했습니다. 카카오 로그인 버튼의 기존bottom = 54.dp패딩과 함께 적절한 여백을 제공합니다.다음 사항을 검증하시기 바랍니다:
- 제스처 내비게이션이 활성화된 기기와 버튼 네비게이션 기기 모두에서 하단 여백이 자연스러운지 확인
- 가로 모드에서도 레이아웃이 올바르게 동작하는지 확인
✅ 𝗖𝗵𝗲𝗰𝗸-𝗟𝗶𝘀𝘁
📌 𝗜𝘀𝘀𝘂𝗲𝘀
📎𝗪𝗼𝗿𝗸 𝗗𝗲𝘀𝗰𝗿𝗶𝗽𝘁𝗶𝗼𝗻
📷 𝗦𝗰𝗿𝗲𝗲𝗻𝘀𝗵𝗼𝘁
💬 𝗧𝗼 𝗥𝗲𝘃𝗶𝗲𝘄𝗲𝗿𝘀
ci 왜.안.돼
Summary by CodeRabbit
새로운 기능
개선 사항
제거