Skip to content

[NDGL-105] 앱 아이콘, 스플래시 화면, 유저 가이드 모달 추가#32

Merged
mj010504 merged 4 commits intodevelopfrom
feature/NDGL-105
Feb 21, 2026
Merged

[NDGL-105] 앱 아이콘, 스플래시 화면, 유저 가이드 모달 추가#32
mj010504 merged 4 commits intodevelopfrom
feature/NDGL-105

Conversation

@mj010504
Copy link
Copy Markdown
Contributor

@mj010504 mj010504 commented Feb 21, 2026

개요

  • 앱 아이콘, 스플래시 화면, 유저 가이드 모달 추가

변경사항

  • 앱 아이콘 추가
  • 스플래시 화면 추가
    • HomeViewModel에서 수행하던 initSession() 로직 -> SplashViewModel로 이동
  • 유저 가이드 모달 추가

Summary by CodeRabbit

Release Notes

  • New Features

    • Splash screen now appears on app startup
    • User guide modal displays with terms and conditions link
  • UI & Branding

    • App name updated to "나도갈래"
    • Redesigned app icon with new visual style
    • Refresh to splash screen graphics and color palette
    • Improved app theme and visual presentation

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 21, 2026

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

애플리케이션의 인증 흐름을 재구조화하여 스플래시 스크린 기능으로 이전하고, 첫 사용자 안내 모달을 도입했습니다. auth 기능 모듈을 splash 기능 모듈로 교체하고, 앱 테마와 리소스를 업데이트했으며, 내비게이션에 스플래시 스크린을 추가했습니다.

Changes

Cohort / File(s) Summary
App Configuration & Dependencies
app/build.gradle.kts, settings.gradle.kts, gradle/libs.versions.toml
feature:auth 의존성 제거 및 feature:splash 의존성 추가; androidx.core:splashscreen 라이브러리 추가; NDGL_TERMS_URL 빌드 설정 필드 추가
App Manifest & Main Activity
app/src/main/AndroidManifest.xml, app/src/main/java/com/yapp/ndgl/MainActivity.kt
MainActivity 테마를 Theme.NDGL.Splash로 변경; app 라벨 제거; AnimatedContent를 통한 스플래시-메인 스크린 전환 로직 추가; UserGuideModal 표시 상태 관리 및 installSplashScreen() 호출 추가
App Drawable & Launcher Resources
app/src/main/res/drawable/ic_launcher_foreground.xml, app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml, app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
ic_launcher 배경을 drawable에서 color 리소스로 변경; monochrome 요소 제거; ic_launcher_foreground 구조 재구성
App Color, String & Theme Resources
app/src/main/res/values/colors.xml, app/src/main/res/values/strings.xml, app/src/main/res/values/themes.xml, app/src/main/res/values/ic_launcher_background.xml
새로운 색상 리소스(green_300, ic_launcher_background) 추가; app_name을 "NDGL"에서 "나도갈래"로 변경; Theme.NDGL.Splash 스타일 추가
Core UI Components & Theme
core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLUserGuideModal.kt, core/ui/src/main/java/com/yapp/ndgl/core/ui/theme/Theme.kt
사용자 안내 모달 컴포넌트 신규 추가(약관 링크 및 확인 콜백 포함); lightColorScheme 배경 및 표면을 Color.Transparent로 변경
Core UI Resources
core/ui/src/main/res/drawable/ic_splash.xml, core/ui/src/main/res/values/strings.xml
스플래시 아이콘 드로어블 신규 추가; 사용자 안내 모달 텍스트 문자열 4개 추가
Feature Splash Module (New)
feature/splash/build.gradle.kts, feature/splash/.gitignore, feature/splash/src/main/AndroidManifest.xml, feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashContract.kt, feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt, feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashViewModel.kt
새로운 splash 기능 모듈 생성; SplashViewModel은 AuthRepository.initSession()을 호출하여 첫 사용자 여부를 판단; SplashRoute는 세션 초기화 후 navigateToHome 콜백 실행; SplashState, SplashSideEffect, NavigateToHome 계약 정의
Feature Home Updates
feature/home/build.gradle.kts, feature/home/src/main/java/com/yapp/ndgl/feature/home/main/HomeViewModel.kt
auth 의존성 제거; HomeViewModel에서 initSession() 호출 제거 및 직접 loadHomeContents() 호출로 단순화
Data Auth Repository
data/auth/src/main/java/com/yapp/ndgl/data/auth/repository/AuthRepository.kt
initSession() 반환 타입을 Unit에서 Boolean으로 변경하여 첫 사용자 여부를 반환하도록 수정
Navigation
navigation/src/main/java/com/yapp/ndgl/navigation/AppScreen.kt, navigation/src/main/java/com/yapp/ndgl/navigation/Route.kt
AppScreen 열거형 추가(Splash, Main); Route.Auth를 Route.Splash으로 변경

Sequence Diagram(s)

sequenceDiagram
    participant MainActivity as MainActivity
    participant SplashRoute as SplashRoute
    participant SplashViewModel as SplashViewModel
    participant AuthRepository as AuthRepository
    participant UserGuideModal as UserGuideModal
    participant HomeScreen as HomeScreen

    MainActivity->>MainActivity: installSplashScreen()
    MainActivity->>MainActivity: AnimatedContent(currentScreen)
    MainActivity->>SplashRoute: showSplashScreen()
    
    SplashRoute->>SplashViewModel: init (via hiltViewModel)
    SplashViewModel->>SplashViewModel: initSession()
    SplashViewModel->>AuthRepository: initSession()
    
    alt UUID 없음 또는 로그인 실패
        AuthRepository->>AuthRepository: isFirstUser = true
    else 로그인 성공
        AuthRepository->>AuthRepository: isFirstUser = false
    end
    
    AuthRepository-->>SplashViewModel: return isFirstUser: Boolean
    SplashViewModel->>SplashViewModel: emit NavigateToHome(isFirstUser)
    SplashRoute-->>MainActivity: navigateToHome(isFirstUser)
    
    MainActivity->>MainActivity: currentScreen = AppScreen.Main
    MainActivity->>MainActivity: showUserGuideModal = isFirstUser
    
    alt isFirstUser == true
        MainActivity->>UserGuideModal: show()
        UserGuideModal->>UserGuideModal: user confirms or clicks terms
    end
    
    MainActivity->>HomeScreen: showMainScreen()
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ 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%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경사항의 주요 내용과 일치합니다. 앱 아이콘, 스플래시 화면, 유저 가이드 모달 추가라는 세 가지 주요 변경사항을 명확하게 요약하고 있습니다.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/NDGL-105

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: 5

🧹 Nitpick comments (5)
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (1)

3-5: monochrome 레이어가 제거되었습니다.

Android 13 이상에서 테마 아이콘(Themed Icons)을 활성화한 사용자에게 모노크롬 아이콘 변형이 표시되지 않습니다. 의도된 변경이라면 무시해도 좋지만, 테마 아이콘 지원이 필요하다면 <monochrome> 레이어를 유지하는 것이 좋습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml` around lines 3 - 5,
The adaptive-icon XML lost the <monochrome> layer so Android 13+ themed icons
won't get a monochrome variant; restore a <monochrome android:drawable="..."/>
element inside the <adaptive-icon> (alongside the existing <background
android:drawable="@color/ic_launcher_background"/> and <foreground
android:drawable="@drawable/ic_launcher_foreground"/>) and point it to the
monochrome drawable (e.g., `@drawable/ic_launcher_monochrome`) so themed icons are
supported.
app/src/main/java/com/yapp/ndgl/MainActivity.kt (1)

29-49: AnimatedContentlabel 파라미터 누락

AnimatedContentlabel 파라미터를 지정하지 않으면 Compose 도구(Layout Inspector 등)에서 디버깅 시 식별이 어렵습니다. 또한, contentKey를 명시적으로 지정하면 불필요한 리컴포지션을 방지할 수 있습니다.

제안된 변경
 AnimatedContent(
     targetState = currentScreen,
+    label = "AppScreenTransition",
 ) { screen ->
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/yapp/ndgl/MainActivity.kt` around lines 29 - 49,
AnimatedContent is missing a label and a contentKey which makes debugging and
unnecessary recompositions harder; update the AnimatedContent call (the one
using targetState = currentScreen) to include a descriptive label parameter
(e.g., label = "AppScreenAnimatedContent") and add contentKey = { it } (or
another stable key based on currentScreen) so the component is identifiable in
tools and avoids redundant recompositions when switching between
AppScreen.Splash and AppScreen.Main.
core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLUserGuideModal.kt (1)

90-99: 이용약관 텍스트의 접근성(Accessibility) 개선 권장

.clickable 모디파이어만 사용하면 TalkBack 등 스크린 리더가 해당 요소를 링크 또는 버튼으로 인식하지 못합니다. role = Role.Button을 지정하거나, onClickLabel을 추가하면 접근성이 향상됩니다.

제안된 변경
         Text(
             text = stringResource(R.string.user_guide_modal_terms),
             modifier = Modifier
                 .padding(top = 12.dp)
-                .clickable(onClick = onTermsClick),
+                .clickable(
+                    onClick = onTermsClick,
+                    role = androidx.compose.ui.semantics.Role.Button,
+                    onClickLabel = stringResource(R.string.user_guide_modal_terms),
+                ),
             color = NDGLTheme.colors.black400,
             textAlign = TextAlign.Center,
             textDecoration = TextDecoration.Underline,
             style = NDGLTheme.typography.bodyMdMedium,
         )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLUserGuideModal.kt`
around lines 90 - 99, The Text composable that uses Modifier.clickable(...) (the
Text element rendering stringResource(R.string.user_guide_modal_terms) and using
onTermsClick) lacks accessibility metadata; update the Modifier.clickable call
to provide accessibility info by specifying role = Role.Button or adding an
onClickLabel (or both) so screen readers recognize it as an actionable control;
locate the Text with modifier = Modifier.padding(...).clickable(onClick =
onTermsClick) and modify that clickable invocation to include role = Role.Button
and/or onClickLabel = stringResource(R.string.user_guide_modal_terms) to improve
TalkBack/VoiceOver support.
feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt (1)

73-73: 긴 라인 분리 권장

가독성을 위해 Icon 컴포저블의 파라미터를 각각 별도 라인으로 분리하는 것을 권장합니다.

제안된 변경
-        Icon(imageVector = ImageVector.vectorResource(R.drawable.ic_splash), contentDescription = null, tint = Color.Unspecified)
+        Icon(
+            imageVector = ImageVector.vectorResource(R.drawable.ic_splash),
+            contentDescription = null,
+            tint = Color.Unspecified,
+        )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt` at
line 73, 현재 Icon(...) 호출이 한 줄로 작성되어 있어 가독성이 떨어집니다; SplashScreen의 Icon 컴포저블 호출을
찾아 Icon(imageVector = ImageVector.vectorResource(R.drawable.ic_splash),
contentDescription = null, tint = Color.Unspecified) 파라미터를 각기 별도 라인으로 분리하여 정렬하고
들여쓰기를 적용하세요(예: imageVector = ..., contentDescription = ..., tint = ... 각자 한 줄).
기존 값들은 그대로 유지하되 파라미터 줄 바꿈만 수행해 읽기 쉽게 만들어 주세요.
feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashContract.kt (1)

6-6: SplashStatedata object로 변경 권장

프로퍼티가 없는 class는 인스턴스마다 equals/hashCode가 달라져 상태 비교 문제를 유발할 수 있습니다. data object로 변경하면 싱글톤 의미론과 올바른 equality를 보장합니다. UiState는 마커 인터페이스로 모든 구현 타입을 허용합니다.

변경이 필요한 두 위치:

  1. SplashContract.kt (현재 줄)
-class SplashState : UiState
+data object SplashState : UiState
  1. SplashViewModel.kt (초기 상태 설정)
-    initialState = SplashState(),
+    initialState = SplashState,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashContract.kt`
at line 6, SplashState should be a singleton data object: replace the
declaration "class SplashState : UiState" with "data object SplashState :
UiState" in SplashContract (so it has object semantics and generated equality),
and update SplashViewModel where the initial state is set (replace any usage
like "SplashState()" or "SplashState()" constructor calls) to reference the
object directly as "SplashState".
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/build.gradle.kts`:
- Line 18: The BuildConfig field NDGL_TERMS_URL is being pulled from
localProperties via buildConfigField with localProperties.getProperty which
makes the public static URL silently empty in dev/CI if the key is missing;
either (A) move the static terms URL into flavor/build-variant constants
(hardcode per flavor) instead of using local.properties so NDGL_TERMS_URL is
always present, or (B) if you must keep local.properties, add a build-time
validation in the Gradle script around the buildConfigField construction to
check localProperties.getProperty("NDGL_TERMS_URL") is non-empty and fail the
build with a clear message, and also add documentation by creating a
local.properties.example/README entry describing the key; update references to
NDGL_TERMS_URL accordingly (search for buildConfigField("String",
"NDGL_TERMS_URL", ...) and localProperties.getProperty).

In `@app/src/main/java/com/yapp/ndgl/MainActivity.kt`:
- Around line 36-42: The Splash screen can get stuck because
SplashViewModel.initSession() swallows errors (see SplashViewModel.initSession)
and never triggers the NavigateToHome side-effect; update
SplashViewModel.initSession to emit an error state or a fallback navigation
event on failure (e.g., expose a LiveData/StateFlow like initError or
navigateToHomeFallback), then update SplashRoute/navigateToHome handling to show
a retry UI (retry button calls SplashViewModel.initSession again) and/or perform
a safe fallback navigation (call navigateToHome(false)) after a failure or
timeout so the user can leave the splash screen instead of being stuck.

In `@core/ui/src/main/java/com/yapp/ndgl/core/ui/theme/Theme.kt`:
- Around line 34-35: lightColorScheme에서 background와 surface를 Color.Transparent로
설정하여 Material3 컴포넌트 전반에 시각적 회귀가 발생하니, Theme.kt의 lightColorScheme 내 background와
surface 항목(Color.Transparent) 값을 투명 대신 기본/불투명 색상으로 복원하세요; 예를 들어 원래 사용하던 색상(또는
Color.White/Material default 색상)을 할당하거나 투명 처리된 부분을 제거해
Scaffold/Card/Surface/ModalBottomSheet/AlertDialog 등이 창 배경을 비추지 않도록 수정하고, 스플래시
관련 투명 효과는 themes.xml의 android:windowIsTranslucent 및 postSplashScreenTheme 조합으로만
처리하도록 유지하세요.

In
`@data/auth/src/main/java/com/yapp/ndgl/data/auth/repository/AuthRepository.kt`:
- Around line 27-38: The current logic in the block using suspendRunCatching {
login(uuid) } clears the session, sets isFirstUser = true, and calls
createUser() for any login failure; change this to distinguish authentication
failures (e.g., HTTP 401/invalid token) from transient network errors and only
clearSession()/set isFirstUser/createUser() when the failure is an auth error.
Update the error handling around login(uuid) (the suspendRunCatching handler) to
inspect the thrown exception or HTTP response (status code or custom exception
type) and: on 401-like auth errors, call localAuthDataSource.clearSession(), set
isFirstUser = true and createUser(); on transient network errors (timeouts,
IOExceptions, connectivity issues) avoid clearing the session—either propagate
the error/retry or return a recoverable failure so the existing user is
preserved. Ensure this logic is applied where login(uuid),
localAuthDataSource.clearSession(), isFirstUser, and createUser() are
referenced.

In
`@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashViewModel.kt`:
- Around line 22-30: The initSession() onFailure block is empty and leaves users
stuck on the splash screen; update the onFailure handler in
SplashViewModel.initSession to surface an error and provide a recovery path:
catch the error from authRepository.initSession() and either (a) post an error
SplashState (e.g., set a new SplashState.Error with the throwable) so the UI can
show a retry button and call initSession() again, or (b) emit a safe fallback
side effect like postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser =
true)) when desired; make sure to reference initSession(),
authRepository.initSession(), postSideEffect(...) and
SplashSideEffect.NavigateToHome (or add a SplashState/Error state) so the UI can
react and allow retry/backoff logic.

---

Nitpick comments:
In `@app/src/main/java/com/yapp/ndgl/MainActivity.kt`:
- Around line 29-49: AnimatedContent is missing a label and a contentKey which
makes debugging and unnecessary recompositions harder; update the
AnimatedContent call (the one using targetState = currentScreen) to include a
descriptive label parameter (e.g., label = "AppScreenAnimatedContent") and add
contentKey = { it } (or another stable key based on currentScreen) so the
component is identifiable in tools and avoids redundant recompositions when
switching between AppScreen.Splash and AppScreen.Main.

In `@app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml`:
- Around line 3-5: The adaptive-icon XML lost the <monochrome> layer so Android
13+ themed icons won't get a monochrome variant; restore a <monochrome
android:drawable="..."/> element inside the <adaptive-icon> (alongside the
existing <background android:drawable="@color/ic_launcher_background"/> and
<foreground android:drawable="@drawable/ic_launcher_foreground"/>) and point it
to the monochrome drawable (e.g., `@drawable/ic_launcher_monochrome`) so themed
icons are supported.

In
`@core/ui/src/main/java/com/yapp/ndgl/core/ui/designsystem/NDGLUserGuideModal.kt`:
- Around line 90-99: The Text composable that uses Modifier.clickable(...) (the
Text element rendering stringResource(R.string.user_guide_modal_terms) and using
onTermsClick) lacks accessibility metadata; update the Modifier.clickable call
to provide accessibility info by specifying role = Role.Button or adding an
onClickLabel (or both) so screen readers recognize it as an actionable control;
locate the Text with modifier = Modifier.padding(...).clickable(onClick =
onTermsClick) and modify that clickable invocation to include role = Role.Button
and/or onClickLabel = stringResource(R.string.user_guide_modal_terms) to improve
TalkBack/VoiceOver support.

In `@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashContract.kt`:
- Line 6: SplashState should be a singleton data object: replace the declaration
"class SplashState : UiState" with "data object SplashState : UiState" in
SplashContract (so it has object semantics and generated equality), and update
SplashViewModel where the initial state is set (replace any usage like
"SplashState()" or "SplashState()" constructor calls) to reference the object
directly as "SplashState".

In `@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashScreen.kt`:
- Line 73: 현재 Icon(...) 호출이 한 줄로 작성되어 있어 가독성이 떨어집니다; SplashScreen의 Icon 컴포저블 호출을
찾아 Icon(imageVector = ImageVector.vectorResource(R.drawable.ic_splash),
contentDescription = null, tint = Color.Unspecified) 파라미터를 각기 별도 라인으로 분리하여 정렬하고
들여쓰기를 적용하세요(예: imageVector = ..., contentDescription = ..., tint = ... 각자 한 줄).
기존 값들은 그대로 유지하되 파라미터 줄 바꿈만 수행해 읽기 쉽게 만들어 주세요.

Comment thread app/build.gradle.kts
Comment on lines +36 to +42
AppScreen.Splash -> {
SplashRoute(
navigateToHome = { isFirstUser ->
showUserGuideModal = isFirstUser
currentScreen = AppScreen.Main
},
)
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 21, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

initSession() 실패 시 사용자가 스플래시 화면에 갇히는 문제

SplashViewModelinitSession()이 실패하면 FIXME 주석만 있고, NavigateToHome 사이드 이펙트가 발행되지 않습니다. 이 경우 사용자는 스플래시 화면에서 벗어날 수 없게 됩니다. 네트워크 오류 등 실패 시 재시도 UI 표시 또는 fallback 네비게이션 처리가 필요합니다.

SplashViewModel.kt의 Line 27-29에서 에러 핸들링이 비어 있는 것이 근본 원인입니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/yapp/ndgl/MainActivity.kt` around lines 36 - 42, The
Splash screen can get stuck because SplashViewModel.initSession() swallows
errors (see SplashViewModel.initSession) and never triggers the NavigateToHome
side-effect; update SplashViewModel.initSession to emit an error state or a
fallback navigation event on failure (e.g., expose a LiveData/StateFlow like
initError or navigateToHomeFallback), then update SplashRoute/navigateToHome
handling to show a retry UI (retry button calls SplashViewModel.initSession
again) and/or perform a safe fallback navigation (call navigateToHome(false))
after a failure or timeout so the user can leave the splash screen instead of
being stuck.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

추후 수정

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@mj010504, 알겠습니다! 추후 PR에서 에러 핸들링을 추가하실 때 참고하시기 바랍니다. 😊


🧠 Learnings used
Learnt from: jihee-dev
Repo: YAPP-Github/27th-App-Team-1-Android PR: 27
File: feature/home/src/main/java/com/yapp/ndgl/feature/home/search/TemplateSearchScreen.kt:0-0
Timestamp: 2026-02-18T18:16:48.266Z
Learning: In the NDGL Android project (YAPP-Github/27th-App-Team-1-Android), the correct Hilt ViewModel import for Compose is `androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel` (from artifact `androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0`), not `androidx.hilt.navigation.compose.hiltViewModel` which was deprecated in Hilt 1.3.0. The project needs to add the hilt-lifecycle-viewmodel-compose artifact to gradle catalog and feature module dependencies.

Comment on lines +34 to +35
background = Color.Transparent,
surface = Color.Transparent,
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 21, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Color.Transparent를 앱 전체 background/surface로 사용하면 Material3 컴포넌트 전반에 시각적 회귀가 발생할 수 있습니다.

lightColorScheme에서 backgroundsurfaceColor.Transparent로 설정하면 MaterialTheme.colorScheme을 기본값으로 참조하는 모든 Material3 컴포넌트(Scaffold, Card, Surface, ModalBottomSheet, AlertDialog 등)에 영향을 미칩니다. 명시적인 containerColor나 배경 Modifier 없이 이러한 컴포넌트를 사용하는 화면은 앱 창 배경(흰색)이 그대로 비쳐 보이게 됩니다.

스플래시 화면 전환 시 발생하는 흰색 깜빡임을 방지하려는 목적이라면, themes.xmlandroid:windowIsTranslucent = truepostSplashScreenTheme = @style/Theme.NDGL`` 조합만으로 충분합니다. MaterialTheme 색상까지 투명하게 만들 필요는 없습니다.

🛠️ 원래 값으로 롤백 제안
-            background = Color.Transparent,
-            surface = Color.Transparent,
+            background = NDGLTheme.colors.white,
+            surface = NDGLTheme.colors.white,
📝 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
background = Color.Transparent,
surface = Color.Transparent,
background = NDGLTheme.colors.white,
surface = NDGLTheme.colors.white,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/ui/src/main/java/com/yapp/ndgl/core/ui/theme/Theme.kt` around lines 34 -
35, lightColorScheme에서 background와 surface를 Color.Transparent로 설정하여 Material3
컴포넌트 전반에 시각적 회귀가 발생하니, Theme.kt의 lightColorScheme 내 background와 surface
항목(Color.Transparent) 값을 투명 대신 기본/불투명 색상으로 복원하세요; 예를 들어 원래 사용하던 색상(또는
Color.White/Material default 색상)을 할당하거나 투명 처리된 부분을 제거해
Scaffold/Card/Surface/ModalBottomSheet/AlertDialog 등이 창 배경을 비추지 않도록 수정하고, 스플래시
관련 투명 효과는 themes.xml의 android:windowIsTranslucent 및 postSplashScreenTheme 조합으로만
처리하도록 유지하세요.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

실수로 수정했음 다시 수정할게

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment on lines +22 to +30
private fun initSession() = viewModelScope.launch {
suspendRunCatching {
authRepository.initSession()
}.onSuccess { isFirstUser ->
postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser = isFirstUser))
}.onFailure {
// FIXME: 에러 뷰
}
}
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 21, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

initSession() 실패 시 사용자 복구 경로가 없음 — 반드시 해결 필요

onFailure 블록이 비어 있어(FIXME 주석만 존재), 네트워크 오류나 서버 장애 시 사용자가 스플래시 화면에 영구적으로 갇히게 됩니다. 이는 앱 사용을 완전히 차단하는 치명적 UX 문제입니다.

최소한 다음 중 하나를 구현해야 합니다:

  1. 에러 상태를 SplashState에 추가하고 UI에서 재시도 버튼 표시
  2. 실패 시에도 기본값으로 홈 화면으로 이동 (postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser = true)))
  3. 일정 시간 후 자동 재시도 (with backoff)
최소 fallback 처리 예시
         }.onSuccess { isFirstUser ->
             postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser = isFirstUser))
         }.onFailure {
-            // FIXME: 에러 뷰
+            // 세션 초기화 실패 시에도 홈으로 이동 (첫 사용자 취급)
+            postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser = true))
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/splash/src/main/java/com/yapp/ndgl/feature/splash/SplashViewModel.kt`
around lines 22 - 30, The initSession() onFailure block is empty and leaves
users stuck on the splash screen; update the onFailure handler in
SplashViewModel.initSession to surface an error and provide a recovery path:
catch the error from authRepository.initSession() and either (a) post an error
SplashState (e.g., set a new SplashState.Error with the throwable) so the UI can
show a retry button and call initSession() again, or (b) emit a safe fallback
side effect like postSideEffect(SplashSideEffect.NavigateToHome(isFirstUser =
true)) when desired; make sure to reference initSession(),
authRepository.initSession(), postSideEffect(...) and
SplashSideEffect.NavigateToHome (or add a SplashState/Error state) so the UI can
react and allow retry/backoff logic.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

추후 추가할 것임

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@mj010504, 알겠습니다! 추후 추가 예정이시군요.

이 사항을 나중에 놓치지 않도록 GitHub 이슈로 생성해 드릴까요? 이슈에 현재 PR과 코멘트 링크를 포함해서 작성해드리겠습니다.


🧠 Learnings used
Learnt from: jihee-dev
Repo: YAPP-Github/27th-App-Team-1-Android PR: 27
File: feature/home/src/main/java/com/yapp/ndgl/feature/home/search/TemplateSearchScreen.kt:0-0
Timestamp: 2026-02-18T18:16:48.266Z
Learning: In the NDGL Android project (YAPP-Github/27th-App-Team-1-Android), the correct Hilt ViewModel import for Compose is `androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel` (from artifact `androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0`), not `androidx.hilt.navigation.compose.hiltViewModel` which was deprecated in Hilt 1.3.0. The project needs to add the hilt-lifecycle-viewmodel-compose artifact to gradle catalog and feature module dependencies.

Learnt from: jihee-dev
Repo: YAPP-Github/27th-App-Team-1-Android PR: 27
File: feature/home/src/main/java/com/yapp/ndgl/feature/home/search/TemplateSearchScreen.kt:0-0
Timestamp: 2026-02-18T19:24:23.661Z
Learning: In the NDGL Android project (YAPP-Github/27th-App-Team-1-Android), when using `androidx.hilt:hilt-navigation-compose:1.3.0`, there is no need to explicitly add `androidx.hilt:hilt-lifecycle-viewmodel-compose` as it is already included as a transitive dependency. The import `androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel` works out of the box with just hilt-navigation-compose.

@mj010504 mj010504 merged commit 0412fea into develop Feb 21, 2026
4 checks passed
@mj010504 mj010504 deleted the feature/NDGL-105 branch February 21, 2026 10:43
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.

1 participant