Skip to content

Conversation

@uson1004
Copy link
Member

@uson1004 uson1004 commented Dec 22, 2025

κ°œμš”

ν™ˆ 화면을 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€

μž‘μ—…μ‚¬ν•­

μΆ”κ°€ 둜 ν•  말

Summary by CodeRabbit

  • New Features

    • Bottom navigation with Home, Application, and MyPage tabs; Scaffold-based app routing and improved back-stack handling.
    • Full Meal screen with pager, calendar picker, and date navigation.
  • UI Components

    • New top app bar, item button, date chip, calendar widget, announcement button, point summary card, meal/notice/my-page routes and screens.
  • Design & Icons

    • Expanded/refreshed icon set and updated drawable assets.
  • Notifications

    • App prepared for push notifications (permissions and metadata added).
  • Breaking Changes

    • Several public types/signatures migrated to java.time and some data/return types changed (may affect integrations).

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

uson1004 and others added 23 commits December 21, 2025 00:56
- ν™ˆ, μ‹ μ²­, λ§ˆμ΄νŽ˜μ΄μ§€ μ•„μ΄μ½˜ μΆ”κ°€ (κΈ°λ³Έ/선택 μƒνƒœ)
- DmsIcon에 μ•„μ΄μ½˜ μƒμˆ˜ μΆ”κ°€

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- ν™ˆ ν™”λ©΄μš© μ•„μ΄ν…œ λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ μΆ”κ°€
- μ•„μ΄μ½˜, 제λͺ©, μ„€λͺ… ν‘œμ‹œ κΈ°λŠ₯

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- ViewModel 베이슀 클래슀 λ¦¬νŒ©ν† λ§

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- MyPage 데이터 λͺ¨λΈ ν•„λ“œ μˆ˜μ •
- StudentMapper 둜직 μ—…λ°μ΄νŠΈ

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- HomeScreen UI κ΅¬ν˜„
- HomeViewModel 둜직 κ΅¬ν˜„
- ν™ˆ ν™”λ©΄ μ»΄ν¬λ„ŒνŠΈ μΆ”κ°€:
  - HomeTopAppBar: 상단 μ•±λ°”
  - DmsPointContent: μƒλ²Œμ  ν‘œμ‹œ
  - MealContent: 급식 정보
  - AnnouncementButton: 곡지사항 λ²„νŠΌ
- Navigation 3 기반 HomeRoute κ΅¬ν˜„

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- ApplicationScreen UI κ΅¬ν˜„
- Navigation 3 기반 ApplicationRoute κ΅¬ν˜„

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- MyPageScreen UI κ΅¬ν˜„
- Navigation 3 기반 MyPageRoute κ΅¬ν˜„

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- BottomMenu sealed class κ΅¬ν˜„
  - ν™ˆ, μ‹ μ²­, λ§ˆμ΄νŽ˜μ΄μ§€ 메뉴 μ •μ˜
  - Navigation 3 NavKey 기반 라우트 μ„€μ •
- BottomNavigationBar Composable κ΅¬ν˜„
  - ν˜„μž¬ ν™”λ©΄ μƒνƒœμ— λ”°λ₯Έ 선택 ν‘œμ‹œ
  - μ•„μ΄μ½˜ 및 라벨 μ• λ‹ˆλ©”μ΄μ…˜ 적용

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- Navigation 3 기반 메인 ν™”λ©΄ λΌμš°νŒ… μ„€μ •
  - HomeScreenNav, ApplicationScreenNav, MyPageScreenNav μΆ”κ°€
- λ°”ν…€λ°” 쑰건뢀 ν‘œμ‹œ 둜직 κ΅¬ν˜„
  - 둜그인/μ˜¨λ³΄λ”© ν™”λ©΄μ—μ„œλŠ” λ°”ν…€λ°” μˆ¨κΉ€
  - 메인 ν™”λ©΄(ν™ˆ/μ‹ μ²­/λ§ˆμ΄νŽ˜μ΄μ§€)μ—μ„œλ§Œ ν‘œμ‹œ
- λ°”ν…€λ°” λ„€λΉ„κ²Œμ΄μ…˜ λ™μž‘ κ΅¬ν˜„
  - ν™”λ©΄ μ „ν™˜ μ‹œ λ°±μŠ€νƒ 관리
  - 쀑볡 클릭 λ°©μ§€
- SignInScreen λ„€λΉ„κ²Œμ΄μ…˜ κ°œμ„ 

πŸ€– Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
@uson1004 uson1004 requested a review from a team December 22, 2025 23:37
@uson1004 uson1004 self-assigned this Dec 22, 2025
@uson1004 uson1004 added the feat μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  경우 label Dec 22, 2025
@uson1004 uson1004 linked an issue Dec 22, 2025 that may be closed by this pull request
@coderabbitai
Copy link

coderabbitai bot commented Dec 22, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds bottom navigation and related UI (BottomMenu, BottomNavigationBar), implements Home/Application/MyPage/Meal routes and Meal feature (UI, ViewModel, repository Result-wrapping), expands design system (components, icons, drawables), migrates org.threeten.bp β†’ java.time across modules, and updates build & dev manifest.

Changes

Cohort / File(s) Change Summary
App shell & navigation
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt, app/src/dev/kotlin/team/aliens/dms/android/app/BottomMenu.kt, app/src/dev/kotlin/team/aliens/dms/android/app/BottomNavigationBar.kt
Introduces BottomMenu sealed types and BottomNavigationBar composable; DmsApp switched to Scaffold with conditional bottom bar and new nav keys (Home/Application/MyPage/Meal). Review nav-key usages and back-stack clearing logic.
Meal feature (UI, VM, routes, components)
feature/src/dev/.../meal/ui/MealScreen.kt, feature/src/dev/.../meal/viewmodel/MealViewModel.kt, feature/src/dev/.../meal/navigation/MealRoute.kt, feature/src/dev/.../meal/component/*
Adds Meal screen, MealViewModel, pager/calendar integration, DateChip/MealContent and MAX_CALENDAR_COUNT; complex UI↔VM interactions and bottom-sheet calendar. Verify state transitions, pager animations, and calendar wiring.
Meal repository & network
data/src/main/.../meal/repository/MealRepository.kt, data/src/main/.../meal/MealRepositoryImpl.kt, network/src/main/.../meal/apiservice/MealApiService.kt, network/src/main/.../meal/datasource/*
fetchMeal/updateMeal signatures changed to return Result<Meal>; MealApiService.fetchMeals parameter now uses java.time.LocalDate. Inspect callers, error propagation, and API surface compatibility.
Design system β€” components & assets
core/design-system/src/*/core/designsystem/appbar/DmsTopAppBar.kt, .../button/DmsItemButton.kt, .../calendar/DmsCalendar.kt, .../foundation/DmsIcon.kt, core/design-system/src/*/res/drawable/ic_*.xml, core/design-system/build.gradle.kts
Adds top app bar, item button, calendar composables; many new/updated drawables and DmsIcon entries; adds compose-calendar dependency. Validate resource names, vector dimensions/colors, and theme integration.
Home / Application / MyPage features
feature/src/dev/.../home/*, feature/src/dev/.../application/*, feature/src/dev/.../mypage/*
New Home UI and HomeViewModel (AnnouncementButton, DmsPointContent, HomeTopAppBar) and placeholder Application/MyPage routes/screens. Check side-effect emission and navigation callbacks from HomeViewModel.
Date-time migration (ThreeTenBP β†’ java.time)
many files under app/, core/, data/, feature/, network/, shared/date/, database/
Systematic replacement of org.threeten.bp.* with java.time.*. Several public signatures now reference java.time types β€” review cross-module ABI/serialization and Room converters.
Database & DAO signature changes
core/database/.../dao/MealDao.kt, core/database/.../converter/DateTypeConverter.kt, database/src/.../meal/datasource/*
MealDao.findByDate now resolves to java.time.LocalDate; converters updated. Confirm Room TypeConverter compatibility and query parameter types.
Model changes & mappers
data/src/main/java/.../meal/model/Meal.kt, data/src/main/java/.../student/model/MyPage.kt, data/.../student/mapper/StudentMapper.kt
Meal data class now has default values; MyPage renamed fields (studentName→name, gradeClassNumber→gcn), defaults and nullable profileImageUrl; mapper adjusted. Update callsites and (de)serialization expectations.
UI utilities & viewmodel rename
core/ui/src/dev/.../util/Localize.kt, core/ui/src/dev/.../viewmodel/BaseStateViewModel.kt, core/ui/src/prod/.../FloatingNotice.kt
Adds DayOfWeek.toLocale(); renames BaseStateViewModel.effectFlow β†’ sideEffect and updates uses. Search & replace usages of old property.
Build / libs catalog & project properties
gradle/libs.versions.toml, feature/build.gradle.kts, core/design-system/build.gradle.kts, app/build.gradle.kts, buildSrc/src/main/kotlin/ProjectProperties.kt
Adds compose-calendar, desugar JDK libs, kotlinx libs; minSdk bumped to 24; core library desugaring enabled. Validate CI/gradle toolchain and desugaring config.
Dev AndroidManifest additions
app/src/dev/AndroidManifest.xml
Adds runtime permissions, Firebase messaging service declaration, and FCM meta-data for dev flavor. Review exported service and permission implications.

Sequence Diagram(s)

mermaid
sequenceDiagram
autonumber
participant UI as Meal UI (Composable)
participant VM as MealViewModel
participant Repo as MealRepository
participant DB as DatabaseDataSource
participant Net as NetworkDataSource

UI->>VM: init / request meals(date)
VM->>Repo: fetchMeal(date)
Repo->>DB: queryMeals(date)
alt local found
DB-->>Repo: return Meal
Repo-->>VM: Result.success(Meal)
else not found
Repo->>Net: fetchMeals(date)
alt network success
Net-->>Repo: FetchMealsResponse
Repo->>DB: saveFetchedMeals(response)
DB-->>Repo: ack
Repo-->>VM: Result.success(Meal from DB)
else network failure
Net-->>Repo: error
Repo-->>VM: Result.failure(error)
end
end
VM-->>UI: update state (meal / error)
UI->>VM: user navigates (next/prev/calendar)
VM->>Repo: fetchMeal(newDate)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • JunJaBoy
  • parkuiery

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 (2 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed The title 'πŸ”€ :: (#810) ν™ˆ ν™”λ©΄ κ΅¬ν˜„' directly describes the main changeβ€”implementing the home screen feature, which aligns with the substantial additions of home screen components (HomeRoute, HomeScreen, HomeViewModel) and related UI elements.
✨ 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/810-ν™ˆ-ν™”λ©΄-κ΅¬ν˜„

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.

@gemini-code-assist
Copy link

Summary of Changes

Hello @uson1004, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν™ˆ ν™”λ©΄κ³Ό ν•˜λ‹¨ λ‚΄λΉ„κ²Œμ΄μ…˜ λ°”λ₯Ό λ„μž…ν•˜μ—¬ μ‚¬μš©μž κ²½ν—˜μ˜ 핡심적인 뢀뢄을 κ΅¬μΆ•ν•©λ‹ˆλ‹€. ν™ˆ, μ‹ μ²­, λ§ˆμ΄νŽ˜μ΄μ§€λ‘œμ˜ κΈ°λ³Έ λ‚΄λΉ„κ²Œμ΄μ…˜ 흐름을 μ„€μ •ν•˜κ³ , 급식 정보λ₯Ό 효율적으둜 ν‘œμ‹œν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ ˆκ±°μ‹œ λ‚ μ§œ/μ‹œκ°„ 라이브러리λ₯Ό java.time으둜 κ΅μ²΄ν•˜κ³ , μƒˆλ‘œμš΄ UI μ»΄ν¬λ„ŒνŠΈμ™€ μ•„μ΄μ½˜μ„ μΆ”κ°€ν•˜μ—¬ λ””μžμΈ μ‹œμŠ€ν…œμ„ ν™•μž₯ν•˜λŠ” μ€‘μš”ν•œ λ¦¬νŒ©ν† λ§ μž‘μ—…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

Highlights

  • ν™ˆ ν™”λ©΄ 및 ν•˜λ‹¨ λ‚΄λΉ„κ²Œμ΄μ…˜ κ΅¬ν˜„: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 ν™ˆ ν™”λ©΄κ³Ό ν•¨κ»˜ ν•˜λ‹¨ λ‚΄λΉ„κ²Œμ΄μ…˜ λ°”κ°€ μƒˆλ‘œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 ν™ˆ, μ‹ μ²­, λ§ˆμ΄νŽ˜μ΄μ§€ ν™”λ©΄μœΌλ‘œμ˜ 이동이 κ°€λŠ₯ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.
  • λ‚ μ§œ/μ‹œκ°„ API λ§ˆμ΄κ·Έλ ˆμ΄μ…˜: κΈ°μ‘΄ org.threeten.bp λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ java.time API둜 λ‚ μ§œ 및 μ‹œκ°„ 처리 둜직이 μ „λ°˜μ μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ ν˜„λŒ€ν™”μ™€ ν‘œμ€€ν™”μ— κΈ°μ—¬ν•©λ‹ˆλ‹€.
  • 급식 ν™”λ©΄ κΈ°λŠ₯ μΆ”κ°€: 급식 정보λ₯Ό ν‘œμ‹œν•˜λŠ” 화면이 κ΅¬ν˜„λ˜μ—ˆμœΌλ©°, λ‚ μ§œ 선택을 μœ„ν•œ μΊ˜λ¦°λ” κΈ°λŠ₯κ³Ό 식사 μœ ν˜•(μ•„μΉ¨, 점심, 저녁)을 μ „ν™˜ν•˜λŠ” κΈ°λŠ₯이 ν¬ν•¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μƒˆλ‘œμš΄ λ””μžμΈ μ‹œμŠ€ν…œ μ»΄ν¬λ„ŒνŠΈ 및 μ•„μ΄μ½˜ μΆ”κ°€: μ»€μŠ€ν…€ 상단 μ•± λ°”(DmsTopAppBar), μ•„μ΄ν…œ λ²„νŠΌ(DmsItemButton), μΊ˜λ¦°λ”(DmsCalendar) λ“± μ—¬λŸ¬ UI μ»΄ν¬λ„ŒνŠΈμ™€ λ‹€μ–‘ν•œ μ•„μ΄μ½˜μ΄ λ””μžμΈ μ‹œμŠ€ν…œμ— μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 데이터 λͺ¨λΈ 및 리포지토리 κ°œμ„ : 급식(Meal) 데이터 λͺ¨λΈμ— 기본값이 μΆ”κ°€λ˜κ³ , 급식 λ¦¬ν¬μ§€ν† λ¦¬μ˜ fetchMeal 및 updateMeal λ©”μ„œλ“œκ°€ Result νƒ€μž…μ„ λ°˜ν™˜ν•˜λ„λ‘ λ³€κ²½λ˜μ–΄ 였λ₯˜ μ²˜λ¦¬κ°€ λͺ…ν™•ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ§ˆμ΄νŽ˜μ΄μ§€(MyPage) λͺ¨λΈμ˜ ν•„λ“œλͺ…이 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with πŸ‘ and πŸ‘Ž on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

ν™ˆ ν™”λ©΄ κ΅¬ν˜„μ— λŒ€ν•œ PR을 κ²€ν† ν–ˆμŠ΅λ‹ˆλ‹€. μ „λ°˜μ μœΌλ‘œ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 잘 μΆ”κ°€λ˜μ—ˆκ³ , java.time으둜의 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜κ³Ό 같은 μ½”λ“œ κ°œμ„  μž‘μ—…λ„ 잘 μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. λͺ‡ κ°€μ§€ λ„€λΉ„κ²Œμ΄μ…˜ 둜직, μ—λŸ¬ 처리, UI μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„μ—μ„œ 발견된 μˆ˜μ • 사항듀을 μ œμ•ˆν–ˆμŠ΅λ‹ˆλ‹€. 특히 MealRepositoryImpl의 데이터 λ‘œλ”© 둜직과 DmsApp의 λ„€λΉ„κ²Œμ΄μ…˜ κ΄€λ ¨ LaunchedEffect 뢀뢄을 확인해 μ£Όμ‹œλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€. μΆ”κ°€μ μœΌλ‘œ, μ½”λ“œμ˜ λͺ…확성을 높이기 μœ„ν•œ λͺ‡ κ°€μ§€ 넀이밍 및 쀑볡 μ½”λ“œ 제거 μ œμ•ˆλ„ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

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

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeViewModel.kt (1)

69-69: Remove debug logging statements.

Debug println statements should be removed before merging to production.

πŸ”Ž Proposed fix
     private fun updateMeal() =
         viewModelScope.launch(Dispatchers.IO) {
-            println("LOGLOG1")
             val capturedDate = stateFlow.value.selectedDate
             runCatching {
                 mealRepository.updateMeal(capturedDate)
             }.onSuccess { meal ->
                 reduce(
                     newState = stateFlow.value.copy(
                         selectedDate = capturedDate,
                         currentMeal = meal,
                     ),
                 )
                 postSideEffect(HomeSideEffect.MealUpdated)
             }.onFailure {
                 postSideEffect(HomeSideEffect.MealUpdateFailed)
-            }.also {
-                println("LOGLOG ${it.isSuccess}")
-            }
+            }
         }

Also applies to: 84-84

core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt (1)

13-13: Typo: BlueLaunch should be BlueLunch.

Line 13 has BlueLaunch but the dev version correctly uses BlueLunch. This naming inconsistency could cause issues if code references the wrong name.

🟠 Major comments (4)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt-43-43 (1)

43-43: Avoid reusing the modifier parameter.

The modifier parameter is reused on the Canvas, which shadows the outer modifier parameter and could lead to unexpected layout behavior. This prevents the caller's modifier from being applied to the Canvas.

πŸ”Ž Proposed fix
         Canvas(
-            modifier = modifier
+            modifier = Modifier
                 .align(Alignment.TopCenter)
                 .size(300.dp)
                 .blur(
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt-11-17 (1)

11-17: Multiple navigation callbacks are stubbed with empty implementations.

Several navigation handlers (onNavigateNotice, onNavigateNoticeDetail, onNavigatePointHistory) and the onShowSnackBar callback are implemented as no-ops. This means features like navigating to notices, point history, and displaying snackbar messages won't work from the home screen.

Do you want me to help identify where these callbacks should be properly wired, or should this be tracked as a TODO for future implementation?

data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt-24-28 (1)

24-28: Potential NullPointerException if date not found in fetched meals.

Using !! on line 27 will throw NullPointerException if the network response doesn't include a meal for the requested date. Consider using ?: throw CannotFindMealException() for a more meaningful error.

πŸ”Ž Proposed fix
-        }.find { it.date == date }!!
+        }.find { it.date == date } ?: throw CannotFindMealException()
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt-94-105 (1)

94-105: Logic error: removeAll after clear() is a no-op.

backStack.clear() empties the list, making the subsequent removeAll { ... } operate on an empty list and do nothing. The intent seems to be to remove only the main screens before adding the destination.

πŸ”Ž Proposed fix
                     onNavigate = { destination ->
                         if (currentScreen != destination) {
-                            // κΈ°μ‘΄ 메인 ν™”λ©΄λ“€ 제거
-                            backStack.clear()
                             backStack.removeAll {
                                 it is HomeScreenNav ||
                                 it is ApplicationScreenNav ||
                                 it is MyPageScreenNav
                             }
-                            // μƒˆ ν™”λ©΄ μΆ”κ°€
                             backStack.add(destination)
                         }
                     }
🟑 Minor comments (10)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/navigation/ApplicationRoute.kt-4-4 (1)

4-4: Remove unused import.

The Serializable import is not used in this file.

πŸ”Ž Proposed fix
 import androidx.compose.runtime.Composable
-import kotlinx.serialization.Serializable
 import team.aliens.dms.android.feature.main.application.ui.Application
shared/date/src/main/java/team/aliens/dms/android/shared/date/Extensions.kt-3-7 (1)

3-7: Remove ThreeTenBP dependency to complete the migration.

The code migration to java.time is completeβ€”Extensions.kt properly imports only java.time.* classes, ExtensionsTest.kt provides test coverage, and the extension functions are consistently used across the codebase (SignUpResponse.kt, MealMapper.kt). However, the ThreeTenBP dependency remains declared in shared/date/build.gradle.kts (implementation(libs.threetenbp)). Remove this unused dependency to fully complete the migration.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt-69-69 (1)

69-69: Hardcoded button text should be localized.

The button text "였늘의 급식 ν™•μΈν•˜κΈ°" is hardcoded in Korean. Consider extracting this to string resources.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt-54-54 (1)

54-54: Hardcoded text should be localized.

The text "급식" is hardcoded in Korean. Consider extracting this to string resources to support internationalization.

πŸ”Ž Suggested approach

Extract to strings.xml:

<string name="meal_label">급식</string>

Then reference it:

         Text(
-            text = "급식",
+            text = stringResource(R.string.meal_label),
             style = DmsTheme.typography.bodyB,
             color = DmsTheme.colorScheme.inverseSurface,
         )

Committable suggestion skipped: line range outside the PR's diff.

core/ui/src/dev/java/team/aliens/dms/android/core/ui/util/Localize.kt-5-13 (1)

5-13: Fix the function name typo.

The function name toLocate() appears to be a typo and should likely be toLocale() to properly convey that it's converting to a localized representation.

πŸ”Ž Proposed fix
-fun DayOfWeek.toLocate(): String = when (this) {
+fun DayOfWeek.toLocale(): String = when (this) {
     DayOfWeek.MONDAY -> "μ›”μš”μΌ"
     DayOfWeek.TUESDAY -> "ν™”μš”μΌ"
     DayOfWeek.WEDNESDAY -> "μˆ˜μš”μΌ"
     DayOfWeek.THURSDAY -> "λͺ©μš”일"
     DayOfWeek.FRIDAY -> "κΈˆμš”μΌ"
     DayOfWeek.SATURDAY -> "ν† μš”μΌ"
     DayOfWeek.SUNDAY -> "μΌμš”μΌ"
 }
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt-1-1 (1)

1-1: Typo in filename: "Cotent" should be "Content".

The file is named DmsPointCotent.kt but should be DmsPointContent.kt for consistency with the composable function name DmsPointContent.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt-82-98 (1)

82-98: Unused parameter: iconBackgroundColor is never applied.

The iconBackgroundColor parameter is accepted but never used in the PointItem composable. The Image on lines 95-98 doesn't apply any background. Either remove the parameter or apply it as a background to the icon.

πŸ”Ž Proposed fix to apply the background
-        Image(
-            painter = painterResource(icon),
-            contentDescription = null,
-        )
+        Box(
+            modifier = Modifier
+                .size(32.dp)
+                .background(color = iconBackgroundColor, shape = CircleShape),
+            contentAlignment = Alignment.Center,
+        ) {
+            Image(
+                painter = painterResource(icon),
+                contentDescription = null,
+            )
+        }
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt-151-155 (1)

151-155: Use removeLastOrNull() for safer back navigation.

removeLast() throws NoSuchElementException if the backStack is empty. For consistency with line 116 and defensive coding, use removeLastOrNull().

πŸ”Ž Proposed fix
                 entry<MealScreenNav> {
                     MealRoute(
-                        onNavigateBack = { backStack.removeLast() }
+                        onNavigateBack = { backStack.removeLastOrNull() }
                     )
                 }
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt-27-35 (1)

27-35: Missing error handling for meal fetch failure.

fetchMeal only handles onSuccess. If the network request fails, the UI will display stale or default data with no feedback to the user.

πŸ”Ž Consider handling failures
         viewModelScope.launch(Dispatchers.IO) {
             mealRepository.fetchMeal(date = selectedDate)
                 .onSuccess { successfulMeal ->
                     setState { it.copy(meal = successfulMeal) }
                 }
+                .onFailure { throwable ->
+                    // Handle error - e.g., update state with error flag or use side effect
+                }
         }
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt-248-251 (1)

248-251: Typo: img_launch should be img_lunch to match naming convention.

The LUNCH meal type references R.drawable.img_launch, which breaks the semantic naming pattern established by other meal types (BREAKFAST: img_morning, DINNER: img_dinner). The drawable resource exists but is incorrectly namedβ€”rename it to img_lunch.png and update the reference for consistency.

🧹 Nitpick comments (24)
feature/src/prod/kotlin/team/aliens/dms/android/feature/outing/OutingStatusScreen.kt (1)

43-51: Minor: Reorganize imports for consistency.

The PaddingDefaults import at line 45 is inserted between other ui package imports, breaking conventional grouping. Consider consolidating all team.aliens.dms.android.core.designsystem imports together, and similarly group the ui imports.

πŸ”Ž Suggested import reorganization
  import androidx.lifecycle.compose.collectAsStateWithLifecycle
  import com.ramcosta.composedestinations.annotation.Destination
  import team.aliens.dms.android.core.designsystem.AlertDialog
  import team.aliens.dms.android.core.designsystem.ButtonDefaults
  import team.aliens.dms.android.core.designsystem.ContainedButton
+ import team.aliens.dms.android.core.designsystem.PaddingDefaults
  import team.aliens.dms.android.core.designsystem.foundation.DmsIcon
  import team.aliens.dms.android.core.designsystem.DmsTheme
  import team.aliens.dms.android.core.designsystem.DmsTopAppBar
  import team.aliens.dms.android.core.designsystem.LocalToast
  import team.aliens.dms.android.core.designsystem.Scaffold
  import team.aliens.dms.android.core.designsystem.TextButton
  import team.aliens.dms.android.core.designsystem.shadow
  import ui.DefaultHorizontalSpace
  import ui.DefaultVerticalSpace
- import team.aliens.dms.android.core.designsystem.PaddingDefaults
  import ui.bottomPadding
  import ui.composable.FloatingNotice
  import ui.horizontalPadding
  import ui.startPadding
  import ui.topPadding
  import ui.verticalPadding
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt (2)

3-3: Remove unused import.

The @DrawableRes annotation is imported but not used, since the iconRes parameter is of type Painter rather than an Int resource ID.

πŸ”Ž Proposed fix
-import androidx.annotation.DrawableRes

53-54: Remove redundant .clip() modifier.

The .clip(RoundedCornerShape(32.dp)) on line 53 is redundant since .background() on line 54 already applies the same shape, which automatically clips the content.

πŸ”Ž Proposed fix
     Row(
         modifier = modifier
             .fillMaxWidth()
-            .clip(RoundedCornerShape(32.dp))
             .background(color = backgroundColor, shape = RoundedCornerShape(32.dp))
             .clickable(
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt (1)

10-13: Placeholder implementation detected.

The ApplicationScreen() function is currently empty, serving as a placeholder for future implementation. This is acceptable for incremental development.

Would you like me to help scaffold a basic implementation or open an issue to track the Application screen feature?

core/design-system/src/dev/res/drawable/ic_plus.xml (1)

7-14: Consider using color resources for better maintainability.

The colors are hardcoded (#B1D0FE, #0F6EFE) instead of referencing theme or color resources. This reduces flexibility for theme variations and makes it harder to maintain design consistency across the app.

Consider defining these colors in your color resources and referencing them via @color/... or using theme attributes.

feature/src/prod/kotlin/team/aliens/dms/android/feature/main/application/ApplicationScreen.kt (1)

367-367: Remove unused appliedTitle parameter.

The appliedTitle parameter is declared but never passed by any call site in voteTapContent (lines 236-275). The associated AnimatedVisibility block (lines 410-427) will never be visible.

πŸ”Ž Proposed fix to remove the unused parameter
 private fun VoteCard(
     modifier: Modifier = Modifier,
     topStartTimeTitle: LocalDateTime,
     topEndTimeTitle: LocalDateTime,
     title: String,
     description: String,
-    appliedTitle: String? = null,
     isVoted: Boolean,
     onButtonClick: () -> Unit,
 ) {

Additionally, remove the unused AnimatedVisibility block at lines 410-427:

                 Text(
                     modifier = Modifier.weight(1f),
                     text = title,
                     color = DmsTheme.colorScheme.onSurface,
                     style = DmsTheme.typography.title2,
                 )
-                AnimatedVisibility(
-                    visible = appliedTitle != null,
-                    enter = slideInVertically() + fadeIn(),
-                    exit = slideOutVertically() + fadeOut(),
-                ) {
-                    if (appliedTitle != null) {
-                        RoundedButton(
-                            onClick = { },
-                            fillMinSize = false,
-                            contentPadding = PaddingValues(
-                                horizontal = PaddingDefaults.Medium,
-                                vertical = PaddingDefaults.Small,
-                            ),
-                        ) {
-                            Text(text = appliedTitle)
-                        }
-                    }
-                }
             }
core/design-system/build.gradle.kts (1)

65-65: Remove the unused threetenbp dependency.

The codebase has completed its migration to java.time; no org.threeten.bp imports exist anywhere in the codebase. This dependency can be safely removed to reduce the dependency footprint.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt (1)

10-13: Placeholder implementation detected.

The MyPageScreen is currently a stub with no implementation. This is expected for incremental development.

Would you like me to help scaffold the MyPage UI structure or open an issue to track the implementation?

feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeViewModel.kt (1)

128-260: Consider removing commented-out code.

A large block of legacy implementation (133 lines) is commented out. If this code is no longer needed, consider removing it to improve maintainability. If it serves as reference documentation, consider moving it to a separate doc or ADR.

core/ui/src/dev/java/team/aliens/dms/android/core/ui/util/Localize.kt (1)

6-12: Consider using string resources for localized weekday names.

The weekday names are hardcoded in Korean. Consider using string resources instead to support proper localization, maintain consistency with the rest of the app, and enable easier updates.

core/design-system/src/dev/res/drawable/ic_equal.xml (1)

1-15: Consider using theme color references for better theming support.

The icon uses hard-coded color values (#DDDDDD and #202020). If this icon should adapt to different themes or dark mode, consider using color resources from the theme instead of hard-coded hex values.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt (1)

42-53: Extract hard-coded strings to string resources for localization.

The Korean text strings are hard-coded directly in the composable. For better i18n support and maintainability, consider extracting these to string resources.

πŸ”Ž Recommended refactor

Move strings to strings.xml:

<string name="announcement_button_title">곡지 λ³΄λŸ¬κ°€κΈ°</string>
<string name="announcement_button_description">μƒˆλ‘œμš΄ 곡지사항을 ν™•μΈν•˜μ„Έμš”</string>

Then reference them in the composable:

 Text(
     modifier = Modifier.padding(start = 4.dp),
-    text = "곡지 λ³΄λŸ¬κ°€κΈ°",
+    text = stringResource(R.string.announcement_button_title),
     style = DmsTheme.typography.labelB,
     color = DmsTheme.colorScheme.tertiaryContainer,
 )
 Text(
     modifier = Modifier.padding(start = 8.dp),
-    text = "μƒˆλ‘œμš΄ 곡지사항을 ν™•μΈν•˜μ„Έμš”",
+    text = stringResource(R.string.announcement_button_description),
     style = DmsTheme.typography.labelM,
     color = DmsTheme.colorScheme.inverseSurface,
 )
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt (1)

33-37: Consider zero-padding for consistent date formatting.

The current date format produces output like "2025.1.5" instead of "2025.01.05". If consistent date formatting is desired, consider using String.format() or DateTimeFormatter for zero-padded values.

πŸ”Ž Suggested formatting options

Option 1: Manual padding

-text = "${date.year}.${date.monthValue}.${date.dayOfMonth} (${date.dayOfWeek.toLocate()})",
+text = "${date.year}.${date.monthValue.toString().padStart(2, '0')}.${date.dayOfMonth.toString().padStart(2, '0')} (${date.dayOfWeek.toLocate()})",

Option 2: DateTimeFormatter

import java.time.format.DateTimeFormatter

val formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd")
text = "${date.format(formatter)} (${date.dayOfWeek.toLocate()})",
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/navigation/MyPageRoute.kt (1)

4-4: Remove unused import.

The kotlinx.serialization.Serializable import is not used in this file.

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt (1)

13-15: Repository should be private.

The studentRepository is only used internally by getMyPage() and shouldn't be exposed publicly. Mark it as private to maintain encapsulation.

πŸ”Ž Proposed fix
 internal class HomeViewModel @Inject constructor(
-    val studentRepository: StudentRepository,
+    private val studentRepository: StudentRepository,
 ) : BaseStateViewModel<HomeState, HomeSideEffect>(HomeState()) {
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (2)

40-47: Remove unused parameter onNavigateNoticeDetail.

The parameter onNavigateNoticeDetail: (String) -> Unit is declared but never used in this composable or passed to HomeScreen. This is dead code.

πŸ”Ž Proposed fix
 @Composable
 internal fun Home(
     onNavigateNotice: () -> Unit,
-    onNavigateNoticeDetail: (String) -> Unit,
     onNavigatePointHistory: (PointType) -> Unit,
     onNavigateMeal: () -> Unit,
     onShowSnackBar: (DmsSnackBarType, String) -> Unit,
 ) {

50-55: Consider remembering the gradient brush to avoid recreation on recomposition.

The gradient Brush is recreated on every recomposition. Since it uses static colors, wrap it in remember for better performance.

πŸ”Ž Proposed fix
-    val gradient = Brush.radialGradient(
+    val gradient = remember {
+        Brush.radialGradient(
-        colors = listOf(
-            Color(0xFF002051).copy(alpha = 0.2f),
-            Color(0xFF0F6EFE).copy(alpha = 0.2f),
-        )
-    )
+            colors = listOf(
+                Color(0xFF002051).copy(alpha = 0.2f),
+                Color(0xFF0F6EFE).copy(alpha = 0.2f),
+            )
+        )
+    }
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (2)

3-3: Remove unused import.

android.util.Log is imported but not used anywhere in this file.

πŸ”Ž Proposed fix
-import android.util.Log

69-72: Rename for clarity: shouldShowBottomBar logic is inverted.

The variable shouldShowBottomBar is true when the screen is SignIn or Onboarding, but the bottom bar is shown when !shouldShowBottomBar. This is confusing. Consider renaming to shouldHideBottomBar or inverting the logic.

πŸ”Ž Proposed fix
-    val shouldShowBottomBar = currentScreen in listOf(
+    val shouldHideBottomBar = currentScreen in listOf(
         SignInScreenNav,
         OnboardingScreenNav,
     )

Then update usage:

-            if (!shouldShowBottomBar) {
+            if (!shouldHideBottomBar) {
app/src/dev/kotlin/team/aliens/dms/android/app/BottomMenu.kt (1)

6-8: Remove unused imports.

ApplicationRoute, HomeRoute, and MyPageRoute are imported but not used in this file.

πŸ”Ž Proposed fix
 import androidx.annotation.DrawableRes
 import androidx.navigation3.runtime.NavKey
 import team.aliens.dms.android.core.designsystem.foundation.DmsIcon
-import team.aliens.dms.android.feature.main.application.navigation.ApplicationRoute
-import team.aliens.dms.android.feature.main.home.navigation.HomeRoute
-import team.aliens.dms.android.feature.main.mypage.navigation.MyPageRoute
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/calendar/DmsCalendar.kt (2)

37-40: Remove unused imports and annotation.

kotlin.time.Duration.Companion.days and kotlin.time.ExperimentalTime are imported but not used. The @OptIn(ExperimentalTime::class) annotation is unnecessary.

πŸ”Ž Proposed fix
 import java.time.LocalDate
 import java.time.YearMonth
-import kotlin.time.Duration.Companion.days
-import kotlin.time.ExperimentalTime

-@OptIn(ExperimentalTime::class)
 @Composable
 fun DmsCalendar(

47-52: Calendar may not display the selected date's month.

firstVisibleMonth is hardcoded to YearMonth.now() instead of deriving from selectDate. If selectDate is in a different month, users won't see it when the calendar opens.

πŸ”Ž Proposed fix
     var updateDate by remember { mutableStateOf(selectDate) }
     val calendarState = rememberCalendarState(
         startMonth = YearMonth.now().minusYears(1),
         endMonth = YearMonth.now().plusYears(1),
-        firstVisibleMonth = YearMonth.now(),
+        firstVisibleMonth = YearMonth.from(selectDate),
     )
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt (1)

3-3: Remove unused import.

android.util.Log is imported but not used.

πŸ”Ž Proposed fix
-import android.util.Log
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (1)

59-59: Consider clarifying the purpose of MAX_CALENDAR_COUNT.

The value 366 seems to represent the total number of pager pages (one page per meal, so ~122 days of meals). Consider adding a comment or renaming to MAX_PAGER_PAGE_COUNT for clarity.

πŸ“œ Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 4925831 and 674c121.

β›” Files ignored due to path filters (5)
  • core/design-system/src/dev/res/drawable/img_calendar.png is excluded by !**/*.png
  • core/design-system/src/dev/res/drawable/img_dinner.png is excluded by !**/*.png
  • core/design-system/src/dev/res/drawable/img_food.png is excluded by !**/*.png
  • core/design-system/src/dev/res/drawable/img_launch.png is excluded by !**/*.png
  • core/design-system/src/dev/res/drawable/img_morning.png is excluded by !**/*.png
πŸ“’ Files selected for processing (112)
  • app/src/dev/kotlin/team/aliens/dms/android/app/BottomMenu.kt
  • app/src/dev/kotlin/team/aliens/dms/android/app/BottomNavigationBar.kt
  • app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
  • app/src/dev/kotlin/team/aliens/dms/android/app/di/app/AppConfigModule.kt
  • app/src/prod/kotlin/team/aliens/dms/android/app/di/app/AppConfigModule.kt
  • core/database/src/main/java/team/aliens/dms/android/core/database/converter/DateTypeConverter.kt
  • core/database/src/main/java/team/aliens/dms/android/core/database/dao/MealDao.kt
  • core/database/src/main/java/team/aliens/dms/android/core/database/di/DatabaseModule.kt
  • core/database/src/main/java/team/aliens/dms/android/core/database/entity/MealEntity.kt
  • core/database/src/main/java/team/aliens/dms/android/core/database/entity/NoticeEntity.kt
  • core/design-system/build.gradle.kts
  • core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/PaddingDefaults.kt
  • core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/appbar/DmsTopAppBar.kt
  • core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt
  • core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/calendar/DmsCalendar.kt
  • core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt
  • core/design-system/src/dev/res/drawable/ic_announcement.xml
  • core/design-system/src/dev/res/drawable/ic_application.xml
  • core/design-system/src/dev/res/drawable/ic_application_fill.xml
  • core/design-system/src/dev/res/drawable/ic_equal.xml
  • core/design-system/src/dev/res/drawable/ic_home.xml
  • core/design-system/src/dev/res/drawable/ic_home_fill.xml
  • core/design-system/src/dev/res/drawable/ic_minus.xml
  • core/design-system/src/dev/res/drawable/ic_my_page.xml
  • core/design-system/src/dev/res/drawable/ic_my_page_fill.xml
  • core/design-system/src/dev/res/drawable/ic_notice.xml
  • core/design-system/src/dev/res/drawable/ic_outing_pass.xml
  • core/design-system/src/dev/res/drawable/ic_plus.xml
  • core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/Calendars.kt
  • core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt
  • core/design-system/src/prod/res/drawable/ic_application.xml
  • core/design-system/src/prod/res/drawable/ic_application_fill.xml
  • core/design-system/src/prod/res/drawable/ic_home_fill.xml
  • core/design-system/src/prod/res/drawable/ic_my_page.xml
  • core/design-system/src/prod/res/drawable/ic_my_page_fill.xml
  • core/jwt/src/main/java/team/aliens/dms/android/core/jwt/Token.kt
  • core/ui/src/dev/java/team/aliens/dms/android/core/ui/util/Localize.kt
  • core/ui/src/dev/java/team/aliens/dms/android/core/ui/viewmodel/BaseStateViewModel.kt
  • core/ui/src/prod/kotlin/team/aliens/dms/android/core/ui/composable/FloatingNotice.kt
  • data/src/main/java/team/aliens/dms/android/data/meal/model/Meal.kt
  • data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepository.kt
  • data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt
  • data/src/main/java/team/aliens/dms/android/data/notice/model/Notice.kt
  • data/src/main/java/team/aliens/dms/android/data/notification/model/Notification.kt
  • data/src/main/java/team/aliens/dms/android/data/outing/model/OutingApplicationTime.kt
  • data/src/main/java/team/aliens/dms/android/data/outing/repository/OutingRepository.kt
  • data/src/main/java/team/aliens/dms/android/data/outing/repository/OutingRepositoryImpl.kt
  • data/src/main/java/team/aliens/dms/android/data/point/model/Point.kt
  • data/src/main/java/team/aliens/dms/android/data/remains/model/RemainsApplicationTime.kt
  • data/src/main/java/team/aliens/dms/android/data/student/mapper/StudentMapper.kt
  • data/src/main/java/team/aliens/dms/android/data/student/model/MyPage.kt
  • data/src/main/java/team/aliens/dms/android/data/voting/model/AllVoteSearch.kt
  • data/src/main/java/team/aliens/dms/android/data/voting/repository/VotingRepository.kt
  • data/src/main/java/team/aliens/dms/android/data/voting/repository/VotingRepositoryImpl.kt
  • database/src/main/java/team/aliens/dms/android/database/meal/datasource/DatabaseMealDataSource.kt
  • database/src/main/java/team/aliens/dms/android/database/meal/datasource/DatabaseMealDataSourceImpl.kt
  • feature/build.gradle.kts
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/navigation/ApplicationRoute.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/HomeTopAppBar.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/navigation/MyPageRoute.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/MealContent.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/navigation/MealRoute.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/signin/ui/SigninScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/editprofile/EditProfileImageScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/Main.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/announcement/AnnouncementListScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/application/ApplicationScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeViewModel.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/main/mypage/MyPageScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/notice/NoticeDetailsScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/notice/NoticeDetailsViewModel.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/notification/box/NotificationBoxScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/notification/settings/NotificationSettingsScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/outing/OutingApplicationScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/outing/OutingStatusScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/outing/OutingViewModel.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/point/PointHistoryScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/remains/RemainsApplicationScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/signin/SignInScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/signup/SetProfileImageScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/studyroom/Common.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/studyroom/list/StudyRoomListScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/voting/VotingApprovalScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/voting/VotingModelStudentScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/voting/VotingSelectedScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/voting/VotingStudentScreen.kt
  • feature/src/prod/kotlin/team/aliens/dms/android/feature/voting/VotingViewModel.kt
  • gradle/libs.versions.toml
  • network/src/main/java/team/aliens/dms/android/network/meal/apiservice/MealApiService.kt
  • network/src/main/java/team/aliens/dms/android/network/meal/datasource/NetworkMealDataSource.kt
  • network/src/main/java/team/aliens/dms/android/network/meal/datasource/NetworkMealDataSourceImpl.kt
  • network/src/main/java/team/aliens/dms/android/network/outing/model/FetchOutingApplicationDetailsResponse.kt
  • network/src/main/java/team/aliens/dms/android/network/remains/model/FetchRemainsApplicationTimeResponse.kt
  • network/src/main/java/team/aliens/dms/android/network/voting/apiservice/VotingApiService.kt
  • network/src/main/java/team/aliens/dms/android/network/voting/datasource/NetworkVotingDataSource.kt
  • network/src/main/java/team/aliens/dms/android/network/voting/datasource/NetworkVotingDataSourceImpl.kt
  • shared/date/src/main/java/team/aliens/dms/android/shared/date/Extensions.kt
  • shared/date/src/main/java/team/aliens/dms/android/shared/date/util/Utils.kt
  • shared/date/src/test/java/team/aliens/dms/android/shared/date/junit/DateUtilsTest.kt
  • shared/date/src/test/java/team/aliens/dms/android/shared/date/junit/ExtensionsTest.kt
🧰 Additional context used
🧬 Code graph analysis (13)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/navigation/MyPageRoute.kt (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt (1)
  • MyPage (5-8)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/navigation/ApplicationRoute.kt (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt (1)
  • Application (5-8)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/navigation/MealRoute.kt (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (1)
  • Meal (61-131)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt (1)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/Button.kt (1)
  • DmsButton (253-351)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/calendar/DmsCalendar.kt (1)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/Button.kt (1)
  • DmsButton (253-351)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt (2)
core/ui/src/dev/java/team/aliens/dms/android/core/ui/viewmodel/BaseStateViewModel.kt (2)
  • setState (29-31)
  • sendEffect (33-35)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt (1)
  • MyPage (5-8)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt (2)
core/ui/src/dev/java/team/aliens/dms/android/core/ui/viewmodel/BaseStateViewModel.kt (1)
  • setState (29-31)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (1)
  • Meal (61-131)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (1)
  • Home (40-83)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (6)
core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/Modal.kt (1)
  • ModalBottomSheet (16-46)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt (1)
  • DateChip (18-39)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt (1)
  • getProperMeal (101-105)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsIconButton.kt (1)
  • DmsIconButton (17-40)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt (1)
  • MealContent (30-76)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt (1)
  • DmsItemButton (31-81)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (5)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/HomeTopAppBar.kt (1)
  • HomeTopAppBar (19-48)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt (1)
  • AnnouncementButton (23-61)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt (1)
  • MealContent (30-76)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt (1)
  • DmsPointContent (30-79)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt (1)
  • DmsItemButton (31-81)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/appbar/DmsTopAppBar.kt (1)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsIconButton.kt (1)
  • DmsIconButton (17-40)
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (6)
core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/Scaffold.kt (1)
  • Scaffold (11-28)
app/src/dev/kotlin/team/aliens/dms/android/app/BottomNavigationBar.kt (1)
  • BottomNavigationBar (33-84)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt (1)
  • HomeRoute (7-18)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/navigation/ApplicationRoute.kt (1)
  • ApplicationRoute (7-10)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/navigation/MyPageRoute.kt (1)
  • MyPageRoute (7-10)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/navigation/MealRoute.kt (1)
  • MealRoute (6-13)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/HomeTopAppBar.kt (1)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsIconButton.kt (1)
  • DmsIconButton (17-40)
πŸͺ› detekt (1.23.8)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt

[warning] 11-13: This empty block of code can be removed.

(detekt.empty-blocks.EmptyFunctionBlock)

feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt

[warning] 11-13: This empty block of code can be removed.

(detekt.empty-blocks.EmptyFunctionBlock)

⏰ 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: build

Comment on lines +24 to +28
val HomeFill = R.drawable.ic_home_fill
val CheckCircle = R.drawable.ic_application
val CheckCircleFill = R.drawable.ic_application_fill
val MyPage = R.drawable.ic_my_page
val MyPageFill = R.drawable.ic_my_page_fill
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find DmsIcon files in the repository
find . -name "DmsIcon.kt" -type f 2>/dev/null | head -20

Repository: team-aliens/DMS-Android

Length of output: 263


🏁 Script executed:

#!/bin/bash
# Read the dev version
echo "=== DEV VERSION ==="
cat ./core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt

echo ""
echo "=== PROD VERSION ==="
cat ./core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt

Repository: team-aliens/DMS-Android

Length of output: 4246


🏁 Script executed:

#!/bin/bash
# Check if the missing icons are used in shared code
echo "=== Searching for references to missing icons ==="
rg 'DmsIcon\.(Announcement|Minus|Equal|OutingPass|SymbolLight|SymbolDark|Cancel)' --type kotlin

Repository: team-aliens/DMS-Android

Length of output: 1358


Prod DmsIcon is missing 7 icons that are referenced in shared code.

The prod version is missing: Announcement, Minus, Equal, OutingPass, SymbolLight, SymbolDark, and Cancel. These are referenced in:

  • core/design-system/.../DmsTopAppBar.kt, DmsSymbol.kt, and DmsTextField.kt
  • feature/.../AnnouncementButton.kt, HomeTopAppBar.kt, and DmsPointCotent.kt

Any prod build that uses shared code will fail to compile.

Also note: prod has BlueLaunch while dev has BlueLunch (likely a typo).

πŸ€– Prompt for AI Agents
In
core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/foundation/DmsIcon.kt
around lines 24-28, the prod icon object is missing mappings for Announcement,
Minus, Equal, OutingPass, SymbolLight, SymbolDark, and Cancel which are
referenced across shared code and will cause compile failures; add val entries
for each of those icons mapped to their corresponding R.drawable resource names
(matching the dev variant or actual drawable names used elsewhere), and also fix
the naming typo by aligning BlueLaunch/BlueLunch to the correct resource name
used in dev/shared code so both prod and dev export the same set of icon
identifiers.

Comment on lines +8 to +10
abstract suspend fun fetchMeal(date: LocalDate): Result<Meal>

abstract suspend fun updateMeal(date: LocalDate): Meal
abstract suspend fun updateMeal(date: LocalDate): Result<Meal>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all usages of fetchMeal and updateMeal to verify Result handling

echo "Finding fetchMeal call sites..."
rg -n "fetchMeal\(" --type kotlin -C3

echo -e "\nFinding updateMeal call sites..."
rg -n "updateMeal\(" --type kotlin -C3

echo -e "\nChecking for Result handling patterns..."
rg -n "\.getOrElse|\.getOrNull|\.onSuccess|\.onFailure|\.fold" --type kotlin -g "*Meal*"

echo -e "\nChecking MealRepository file..."
find . -name "MealRepository.kt" -type f | head -5

Repository: team-aliens/DMS-Android

Length of output: 11873


🏁 Script executed:

#!/bin/bash
# Comprehensive search for MealRepository usage and Result handling

echo "=== Finding MealRepository file ==="
find . -name "*MealRepository*" -type f

echo -e "\n=== Searching for fetchMeal implementations and calls ==="
rg "fetchMeal" --type kotlin -n

echo -e "\n=== Searching for updateMeal implementations and calls ==="
rg "updateMeal" --type kotlin -n

echo -e "\n=== Checking for implementations of MealRepository ==="
rg "class.*MealRepository|: MealRepository" --type kotlin -n

echo -e "\n=== Checking Result handling patterns in Meal-related files ==="
rg -l "Meal" --type kotlin | xargs rg "\.getOrElse|\.getOrNull|\.onSuccess|\.onFailure|\.fold|\.getOrThrow|\.getOrDefault" --type kotlin | head -20

Repository: team-aliens/DMS-Android

Length of output: 5962


🏁 Script executed:

#!/bin/bash
# Get more context around MealWorker.kt line 68
echo "=== MealWorker.kt context around fetchMeal call ==="
sed -n '60,85p' core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt

echo -e "\n=== Check setWidgetState signature ==="
rg -n "fun setWidgetState|setWidgetState.*Meal" --type kotlin -A2 core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt

echo -e "\n=== Check Result extension or toEntity ==="
rg -n "\.toEntity\(" core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt -B2 -A2

Repository: team-aliens/DMS-Android

Length of output: 1698


Fix MealWorker.kt to properly unwrap the Result wrapper before calling toEntity().

At core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt:69, the code calls response.toEntity() on a Result<Meal> object, which will fail since Result has no toEntity() method. Extract the Meal value first using fold(onSuccess, onFailure), or use onSuccess/onFailure methods or getOrNull before passing to setWidgetState(). The current try-catch masks this error by returning a silent failure instead of properly handling the Result.

πŸ€– Prompt for AI Agents
In core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt
around line 69, the code calls response.toEntity() where response is a
Result<Meal>; you must first unwrap the Result and only call toEntity() on the
Meal instance. Replace the direct call with a Result-unwrapping pattern (e.g.,
response.fold(onSuccess = { meal -> setWidgetState(meal.toEntity()) }, onFailure
= { error -> handle/log the error and set an error/fallback widget state }), or
use response.getOrNull()?.let { setWidgetState(it.toEntity()) } and handle the
null case), and ensure failures are not silently swallowed (log the error and
set an appropriate widget error state or propagate the failure).

package team.aliens.dms.android.data.notification.model

import org.threeten.bp.LocalDateTime
import java.time.LocalDateTime
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check minSdk and desugaring configuration for java.time support

echo "=== Checking minSdk configuration ==="
fd -e toml libs.versions.toml --exec cat {} \; | grep -i "minSdk"

echo -e "\n=== Checking for desugaring configuration in build files ==="
fd build.gradle.kts --exec grep -l "coreLibraryDesugaring" {} \;

echo -e "\n=== Checking desugaring dependency ==="
fd build.gradle.kts --exec grep "coreLibraryDesugaring\|desugar_jdk_libs" {} \;

Repository: team-aliens/DMS-Android

Length of output: 220


Configure Android API level support for java.time migration.

The minSdk is set to 23, which does not support java.time. Either increase minSdk to 26 or higher, or enable core library desugaring by:

  • Adding coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:VERSION") to your build.gradle.kts
  • Configuring coreLibrary desugaring in the Android build configuration

Without either change, java.time imports will crash on devices running API 23–25.

πŸ€– Prompt for AI Agents
In
data/src/main/java/team/aliens/dms/android/data/notification/model/Notification.kt
around line 3, the import of java.time.LocalDateTime will fail on devices with
API 23–25 because minSdk is 23; fix by either raising minSdk to 26+ in module
build.gradle.kts OR enable core library desugaring: in the Android module's
build.gradle.kts enable core library desugaring in compileOptions
(coreLibraryDesugaringEnabled = true) and add the desugaring dependency
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:VERSION") to the
dependencies block, then rebuild and verify java.time classes work on older
APIs.

package team.aliens.dms.android.network.meal.apiservice

import org.threeten.bp.LocalDate
import java.time.LocalDate
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for gradle build files and their configuration
find . -name "build.gradle*" -type f | head -20

Repository: team-aliens/DMS-Android

Length of output: 660


🏁 Script executed:

#!/bin/bash
# Find gradle files
fd "build\.gradle" -x cat {} \;

Repository: team-aliens/DMS-Android

Length of output: 41896


🏁 Script executed:

#!/bin/bash
# List files in the root
ls -la

# Find all gradle files
find . -name "*.gradle*" -type f 2>/dev/null | head -20

# Also check for common gradle locations
echo "=== Checking for build.gradle files ==="
find . -maxdepth 3 -name "build.gradle*" -type f 2>/dev/null

Repository: team-aliens/DMS-Android

Length of output: 2834


🏁 Script executed:

#!/bin/bash
# Search for gradle files more broadly
find . -type f \( -name "build.gradle" -o -name "build.gradle.kts" \) 2>/dev/null

Repository: team-aliens/DMS-Android

Length of output: 795


🏁 Script executed:

#!/bin/bash
# Check gradle.properties for minSdk
echo "=== gradle.properties ==="
cat gradle.properties

# Check for version catalog (usually in gradle/libs.versions.toml)
echo -e "\n=== Version Catalog ==="
find . -name "*.toml" -o -name "*.properties" | grep -E "(libs|versions)" | head -10

Repository: team-aliens/DMS-Android

Length of output: 1330


🏁 Script executed:

#!/bin/bash
# Search for minSdk value in gradle files
echo "=== Checking for minSdk values ==="
grep -r "minSdk" . --include="*.toml" --include="*.properties" --include="*.kts" 2>/dev/null | head -20

# Search for coreLibrary and desugaring
echo -e "\n=== Checking for desugaring configuration ==="
grep -r "coreLibrary\|desugaring" . --include="*.kts" --include="*.properties" 2>/dev/null

Repository: team-aliens/DMS-Android

Length of output: 1747


🏁 Script executed:

#!/bin/bash
cat gradle.properties 2>/dev/null || echo "No gradle.properties found"
echo -e "\n=== Checking for libs.versions.toml ==="
find . -name "libs.versions.toml" -exec cat {} \;

Repository: team-aliens/DMS-Android

Length of output: 9655


Verify Android API compatibility for java.time migration.

The app's minSdk is set to 23 (Android 6.0), but java.time is only available natively from API 26 (Android 8.0). Without Java 8+ API desugaring enabled, migrating to java.time will cause NoClassDefFoundError on devices running Android < 8.0 (affecting millions of users on Android 6.0–7.1). Enable desugaring by adding coreLibraryDesugaringEnabled = true in compileOptions and the coreLibraryDesugaring dependency, or increase minSdk to 26 or higher.

πŸ€– Prompt for AI Agents
In
network/src/main/java/team/aliens/dms/android/network/meal/apiservice/MealApiService.kt
around line 3, the import of java.time.LocalDate is unsafe because minSdk is 23
and java.time is only natively available from API 26; fix by enabling Java 8+
desugaring in the Android module: set compileOptions to include
coreLibraryDesugaringEnabled = true and add the appropriate
coreLibraryDesugaring dependency to the module's build.gradle (or alternatively
raise minSdk to 26+ if desugaring is not desired), then rebuild and verify no
runtime NoClassDefFoundError on older devices.

package team.aliens.dms.android.network.meal.datasource

import org.threeten.bp.LocalDate
import java.time.LocalDate
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# 1. Find any remaining org.threeten.bp imports
echo "=== Checking for remaining org.threeten.bp imports ==="
rg "import org\.threeten\.bp" --type=kt --type=java 2>/dev/null | head -20

# 2. Check build.gradle files for desugaring configuration
echo -e "\n=== Checking build.gradle files for desugaring config ==="
fd -e gradle -e kts | head -10 | xargs -I {} sh -c 'echo "File: {}"; grep -E "coreLibraryDesugaring|minSdk|coreLibraryDesugaringEnabled" "{}" || true' 2>/dev/null

# 3. Check if the NetworkMealDataSourceImpl file exists and its imports
echo -e "\n=== Checking NetworkMealDataSourceImpl file ==="
find . -name "NetworkMealDataSourceImpl.kt" -type f 2>/dev/null | xargs cat 2>/dev/null | head -20

Repository: team-aliens/DMS-Android

Length of output: 1574


🏁 Script executed:

#!/bin/bash

# 1. Find minSdk actual value from gradle.properties or version catalog
echo "=== Checking for minSdk value ==="
find . -name "gradle.properties" -o -name "libs.versions.toml" | xargs cat 2>/dev/null | grep -i "minSdk\|min.sdk" || echo "Not found in standard locations"

# 2. Search for coreLibraryDesugaring configuration more thoroughly
echo -e "\n=== Checking for coreLibraryDesugaring configuration ==="
rg "coreLibraryDesugaring" --type=gradle --type=kts -A 2 -B 2 2>/dev/null

# 3. Check app/build.gradle.kts for actual config
echo -e "\n=== Checking app/build.gradle.kts content ==="
cat app/build.gradle.kts | head -100

# 4. Get complete list of Kotlin files to verify no org.threeten imports remain
echo -e "\n=== Total Kotlin files with time/date imports ==="
rg "import.*\.(time|date)" --type=kt -l | wc -l

Repository: team-aliens/DMS-Android

Length of output: 3131


🏁 Script executed:

#!/bin/bash

# Check core/network/build.gradle.kts in detail
echo "=== core/network/build.gradle.kts content ==="
cat core/network/build.gradle.kts 2>/dev/null

echo -e "\n=== Checking all build.gradle.kts for compileOptions ==="
rg "compileOptions\|coreLibraryDesugaring" -A 5 2>/dev/null

echo -e "\n=== Check if desugaring is in dependencies ==="
rg "desugar" 2>/dev/null

Repository: team-aliens/DMS-Android

Length of output: 1971


Add desugaring configuration to support java.time on minSdk 23.

The migration from ThreeTenBP to java.time.LocalDate is complete (no remaining backport imports), but the app will crash on API 23–25 devices due to missing desugaring configuration. Since java.time requires API 26+, add the following to app/build.gradle.kts:

  1. Enable desugaring in compileOptions:

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
        isCoreLibraryDesugaringEnabled = true
    }
  2. Add the desugaring dependency:

    dependencies {
        coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.1")
    }
πŸ€– Prompt for AI Agents
In
network/src/main/java/team/aliens/dms/android/network/meal/datasource/NetworkMealDataSourceImpl.kt
around line 3 the code now imports java.time.LocalDate but the project lacks
desugaring for java.time on minSdk 23; update app/build.gradle.kts to enable
core library desugaring by setting compileOptions.sourceCompatibility and
targetCompatibility to JavaVersion.VERSION_1_8 and
isCoreLibraryDesugaringEnabled = true, and add the coreLibraryDesugaring
dependency com.android.tools:desugar_jdk_libs:2.0.1 in the dependencies block so
java.time APIs work on API 23–25 devices.


import com.google.gson.annotations.SerializedName
import org.threeten.bp.LocalDateTime
import java.time.LocalDateTime
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

# Check for the file and verify the import change
find . -name "FetchOutingApplicationDetailsResponse.kt" -type f | head -5

# Search for GsonBuilder configuration in the codebase
rg -n "GsonBuilder|registerTypeAdapter.*LocalDateTime|registerTypeAdapter.*java.time" --type=kotlin --type=java -C 3

# Search for build.gradle files
fd -e gradle | head -20

Repository: team-aliens/DMS-Android

Length of output: 1783


🏁 Script executed:

# Read the full HttpClientFactories.kt file to see Gson configuration
cat -n core/network/src/main/java/team/aliens/dms/android/core/network/util/HttpClientFactories.kt

# Search for build.gradle files
find . -name "build.gradle*" -type f | grep -E "(app|core|network)" | head -10

Repository: team-aliens/DMS-Android

Length of output: 2675


🏁 Script executed:

# Check app/build.gradle.kts for coreLibraryDesugaring and minSdk
head -100 ./app/build.gradle.kts

# Check core/network/build.gradle.kts 
cat ./core/network/build.gradle.kts

# Search for coreLibraryDesugaring in all build files
rg -n "coreLibraryDesugaring|minSdk" -A 2 -B 2

Repository: team-aliens/DMS-Android

Length of output: 11422


Add Gson TypeAdapters for java.time.LocalDateTime and enable coreLibraryDesugaring.

The codebase has two critical issues preventing proper deserialization of network responses with LocalDateTime fields:

  1. GsonBuilder in HttpClientFactories.kt (lines 26-31) does not register TypeAdapters for java.time types, causing Gson deserialization to fail at runtime.
  2. minSdk is set to 23, below API 26 where java.time is available. Enable coreLibraryDesugaring in build.gradle to provide java.time support on older devices, or register custom TypeAdapters for LocalDateTime serialization.


import com.google.gson.annotations.SerializedName
import org.threeten.bp.DayOfWeek
import java.time.DayOfWeek
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

# Find the target file and examine it
find . -type f -name "FetchRemainsApplicationTimeResponse.kt" 2>/dev/null | head -5

Repository: team-aliens/DMS-Android

Length of output: 175


🏁 Script executed:

#!/bin/bash

# Read the target file
echo "=== FetchRemainsApplicationTimeResponse.kt ==="
cat ./network/src/main/java/team/aliens/dms/android/network/remains/model/FetchRemainsApplicationTimeResponse.kt

echo -e "\n=== Searching for build.gradle files ==="
find . -name "build.gradle*" -type f | head -10

echo -e "\n=== Checking network module build.gradle for minSdk and desugaring ==="
find ./network -name "build.gradle*" -type f -exec cat {} \;

echo -e "\n=== Searching for Gson configuration ==="
rg -i "gsonbuilder|typeadapter|gson.*java\.time|javatime" --type kotlin --type java -A 3 | head -50

Repository: team-aliens/DMS-Android

Length of output: 4920


🏁 Script executed:

#!/bin/bash

# Find version catalog
echo "=== Finding version catalog ==="
find . -name "*.toml" -o -name "gradle.properties" | head -5

# Read the version catalog
echo -e "\n=== Version catalog content (searching for minSdk) ==="
find . -name "*.toml" -exec grep -l "minSdk" {} \;

# Check app/build.gradle.kts for desugaring
echo -e "\n=== app/build.gradle.kts content ==="
cat ./app/build.gradle.kts | grep -A 20 -B 5 "coreLibrary\|compileOptions\|minSdk" | head -50

# Read full HttpClientFactories.kt
echo -e "\n=== Full HttpClientFactories.kt ==="
wc -l ./core/network/src/main/java/team/aliens/dms/android/core/network/util/HttpClientFactories.kt

# Read HttpClientFactories.kt focusing on Gson setup
echo -e "\n=== HttpClientFactories.kt Gson configuration ==="
cat ./core/network/src/main/java/team/aliens/dms/android/core/network/util/HttpClientFactories.kt

# Search for custom type adapters for java.time or DayOfWeek
echo -e "\n=== Searching for custom DayOfWeek/java.time type adapters ==="
find . -type f \( -name "*.kt" -o -name "*.java" \) -exec grep -l "DayOfWeek.*Adapter\|TypeAdapter.*DayOfWeek\|JsonDeserializer.*DayOfWeek" {} \;

# Check buildSrc for version catalog
echo -e "\n=== buildSrc structure ==="
find ./buildSrc -type f | head -20

Repository: team-aliens/DMS-Android

Length of output: 3873


🏁 Script executed:

#!/bin/bash

# Read version catalog for minSdk
echo "=== gradle/libs.versions.toml (minSdk) ==="
grep -A 5 -B 5 "minSdk" ./gradle/libs.versions.toml

# Read ProjectProperties
echo -e "\n=== buildSrc ProjectProperties.kt ==="
cat ./buildSrc/src/main/kotlin/ProjectProperties.kt

# Read Versions.kt
echo -e "\n=== buildSrc Versions.kt ==="
cat ./buildSrc/src/main/kotlin/Versions.kt

# Final check: search for coreLibraryDesugaring anywhere
echo -e "\n=== Searching for coreLibraryDesugaring in entire project ==="
rg -i "corelibrary" --type gradle --type kotlin

# Check if there are any other Gson adapters registered
echo -e "\n=== Searching for all type adapter registrations ==="
rg "registerTypeAdapter|registerTypeAdapterFactory" --type kotlin --type java

Repository: team-aliens/DMS-Android

Length of output: 783


Gson configuration missing type adapters and Android API compatibility unresolved for java.time migration.

The migration from org.threeten.bp.DayOfWeek to java.time.DayOfWeek creates two critical runtime issues:

  1. Gson serialization failure: By default, Gson does not support java.time types. The current GsonBuilder (HttpClientFactories.kt) has no registered type adapters for DayOfWeek, causing deserialization to fail at runtime. Requires either custom TypeAdapter implementation or a library like gson-configuration.

  2. Android API compatibility: java.time was added to Android API level 26, but the app's minSdk is 23. To enable the use of these types when the minimum API is below 26, the Android Gradle plugin (4.0 or newer) requires that you enable "core library desugaring". No coreLibraryDesugaringEnabled configuration found in the project.

This incomplete migration will cause crashes on API 23-25 devices and deserialization failures across all API levels. The project still depends on ThreeTenBP, indicating broader migration inconsistencies.

package team.aliens.dms.android.network.voting.apiservice

import org.threeten.bp.LocalDate
import java.time.LocalDate
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify Android compatibility and Retrofit java.time serialization setup

echo "=== Checking Android minSdk and desugaring configuration ==="
find . -name "*.gradle" -o -name "*.gradle.kts" | head -20 | xargs grep -n -A2 -B2 'minSdk\|coreLibraryDesugaring' 2>/dev/null || echo "No matches found in gradle files"

echo -e "\n=== Checking Retrofit java.time converter configuration ==="
find . -name "*.kt" -o -name "*.java" | xargs grep -n -C3 'JavaTimeConverterFactory\|GsonJavaTimeAdapters\|ScalarsConverterFactory\|registerModule.*Time\|LocalDate.*Converter' 2>/dev/null | head -50 || echo "No converter config found"

echo -e "\n=== Checking for any remaining org.threeten.bp imports ==="
find . -name "*.kt" -o -name "*.java" | xargs grep -n 'import org\.threeten\.bp' 2>/dev/null || echo "No ThreeTenBP imports found"

echo -e "\n=== Checking VotingApiService.kt specifically ==="
find . -name "VotingApiService.kt" -exec cat {} \;

Repository: team-aliens/DMS-Android

Length of output: 7630


🏁 Script executed:

#!/bin/bash
# Find actual minSdk value and Retrofit setup

echo "=== Finding minSdk actual value ==="
grep -r "minSdk\s*=" . --include="*.kt" --include="*.kts" | grep -E "ProjectProperties|libs.versions|=" | head -5

echo -e "\n=== Finding ProjectProperties file ==="
find . -name "ProjectProperties.kt" -o -name "ProjectProperties.java" -exec cat {} \;

echo -e "\n=== Checking gradle/libs.versions.toml for minSdk ==="
find . -name "libs.versions.toml" -o -name "gradle.properties" | xargs grep -n "minSdk\|MIN_SDK" 2>/dev/null

echo -e "\n=== Looking for Retrofit Okhttp client/interceptor setup ==="
find . -type f \( -name "*.kt" -o -name "*.java" \) | xargs grep -l "OkHttpClient\|Retrofit.Builder" 2>/dev/null | head -10

echo -e "\n=== Checking how Retrofit is configured with serialization ==="
find . -type f \( -name "*Retrofit*" -o -name "*Network*" \) \( -name "*.kt" -o -name "*.java" \) | head -10 | xargs cat 2>/dev/null

Repository: team-aliens/DMS-Android

Length of output: 18076


🏁 Script executed:

#!/bin/bash
# Check HttpClientModule for converter factory setup

echo "=== Checking HttpClientModule.kt ==="
find . -name "HttpClientModule.kt" -exec cat {} \;

echo -e "\n=== Checking for compileOptions/coreLibraryDesugaring in all gradle files ==="
find . -name "*.gradle.kts" | xargs grep -n "compileOptions\|coreLibraryDesugar" 2>/dev/null | head -20

echo -e "\n=== Checking if there's a Retrofit.Builder with addConverterFactory ==="
find . -type f \( -name "*.kt" -o -name "*.java" \) | xargs grep -n "addConverterFactory\|Retrofit.Builder" 2>/dev/null | head -20

Repository: team-aliens/DMS-Android

Length of output: 4422


🏁 Script executed:

#!/bin/bash
# Check full HttpClientFactories.kt for converter setup

echo "=== Full HttpClientFactories.kt content ==="
cat ./core/network/src/main/java/team/aliens/dms/android/core/network/util/HttpClientFactories.kt

echo -e "\n=== Check compileOptions details to see if desugaring is enabled ==="
grep -A 5 "compileOptions" ./network/build.gradle.kts

Repository: team-aliens/DMS-Android

Length of output: 2178


Fix Android API compatibility and Retrofit LocalDate serialization.

The migration to java.time.LocalDate introduces two issues that require fixes:

  1. Android API compatibility: With minSdk = 23, java.time.LocalDate is unsupported on Android 6.0-7.1 devices. Either enable coreLibraryDesugaring in compileOptions or raise minSdk to 26+.

  2. Retrofit query parameter serialization: The Gson configuration in HttpClientFactories.kt lacks LocalDate support. Add JavaTimeModule to the GsonBuilder or configure a custom date format to ensure LocalDate parameters serialize correctly in the /students/step/candidate-list endpoint (VotingApiService.kt, line 44).

πŸ€– Prompt for AI Agents
In
network/src/main/java/team/aliens/dms/android/network/voting/apiservice/VotingApiService.kt
around lines 3 and 44 and in the Gson setup (HttpClientFactories.kt), LocalDate
usage breaks on minSdk=23 and won’t serialize as Retrofit query params; either
enable coreLibraryDesugaring in module build.gradle (compileOptions ->
coreLibraryDesugaringEnabled true and add desugaring dependency) or raise minSdk
to 26+, and update your Gson configuration to support java.time by registering
JavaTimeModule (or add a custom LocalDate serializer/deserializer/format) so
LocalDate query parameters (e.g., the candidate-list endpoint) are serialized
correctly by Retrofit.

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

♻️ Duplicate comments (2)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt (1)

1-1: Filename typo: rename file to DmsPointContent.kt.

The filename contains a typo: DmsPointCotent.kt should be DmsPointContent.kt to match the class name.

data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt (1)

16-20: LGTM! Critical bug from previous review is now fixed.

The recoverCatching pattern correctly replaces the failed database query result with the network update result. This addresses the issue where onFailure was not propagating the successful recovery.

🧹 Nitpick comments (3)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt (1)

86-89: Specify explicit size for the icon Image.

The Image composable lacks a size modifier, which may lead to inconsistent icon sizing. Consider adding an explicit size for better UI consistency.

πŸ”Ž Suggested fix
 Image(
+    modifier = Modifier.size(24.dp),
     painter = painterResource(icon),
     contentDescription = null,
 )

You'll also need to import:

import androidx.compose.foundation.layout.size
core/ui/src/dev/java/team/aliens/dms/android/core/ui/util/Localize.kt (1)

5-13: Consider using Android string resources for internationalization.

The hardcoded Korean strings prevent supporting multiple languages. For a production app that may need internationalization, consider using Android's string resource system (e.g., strings.xml) with locale-specific resource directories (e.g., values-ko/, values-en/) instead of hardcoding strings.

However, since this file is in the /dev/ source set, if it's intended only for development builds with Korean as the sole language, this approach may be acceptable.

πŸ“‹ Example implementation using string resources

In res/values-ko/strings.xml:

<string name="monday">μ›”μš”μΌ</string>
<string name="tuesday">ν™”μš”μΌ</string>
<!-- ... other days ... -->

Then modify the function to accept a Context or use a string provider pattern to retrieve localized strings.

feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt (1)

34-34: Consider using DateTimeFormatter for consistent date formatting.

The current string interpolation approach produces dates like "2025.1.5" for single-digit months/days. If you need zero-padded formatting (e.g., "2025.01.05"), consider using DateTimeFormatter:

val formatter = DateTimeFormatter.ofPattern("yyyy.M.d (${date.dayOfWeek.toLocale()})")
text = date.format(formatter)

Or, for a simpler pattern without the weekday in the formatter:

val formatter = DateTimeFormatter.ofPattern("yyyy.M.d")
text = "${date.format(formatter)} (${date.dayOfWeek.toLocale()})"

Note: If the current format (without leading zeros) is intentional for your design, this suggestion can be ignored.

πŸ“œ Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 674c121 and 89eea07.

πŸ“’ Files selected for processing (8)
  • app/build.gradle.kts
  • app/src/dev/AndroidManifest.xml
  • app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
  • core/ui/src/dev/java/team/aliens/dms/android/core/ui/util/Localize.kt
  • data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt
  • gradle/libs.versions.toml
🧰 Additional context used
🧬 Code graph analysis (1)
data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt (2)
data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepository.kt (1)
  • updateMeal (10-10)
feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeViewModel.kt (1)
  • updateMeal (67-86)
⏰ 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: build
πŸ”‡ Additional comments (6)
app/src/dev/AndroidManifest.xml (3)

5-9: Verify the necessity of CAMERA permission for the home screen feature.

The CAMERA permission is a sensitive permission that requires careful justification. Since this PR implements a home screen feature, it's unclear why camera access is needed at this stage.

Additionally, ensure that dangerous permissions (CAMERA and POST_NOTIFICATIONS on API 33+) are properly requested at runtime with appropriate user-facing rationale, not just declared in the manifest.


34-39: Ensure DmsMessagingService properly validates intents and handles messages securely.

The Firebase Messaging service configuration is correct. The android:exported="true" attribute is required for Firebase Cloud Messaging to deliver messages to your service. However, exported services are security-sensitiveβ€”verify that DmsMessagingService validates incoming intents and handles all messages safely, as other apps can potentially invoke this service.


41-46: Verify that the referenced resources exist.

Ensure that the string resource default_notification_channel_id and color resource primary are defined in the appropriate resource files to avoid build failures.

data/src/main/java/team/aliens/dms/android/data/meal/repository/MealRepositoryImpl.kt (1)

22-26: Address unsafe null-handling in updateMeal.

The !! operator at line 25 throws a generic NullPointerException if no meal matches the date. Use a domain-specific exception for clarity:

-    }.find { it.date == date }!!
+    }.find { it.date == date } ?: throw CannotFindMealException()

Verify how updateMeal() is called throughout the codebase, particularly in HomeViewModel. Since the function returns Result<Meal>, callers wrapping it in additional runCatching blocks would incorrectly receive Result<Result<Meal>>.

app/build.gradle.kts (1)

147-147: Dependency is correctly added.

The coreLibraryDesugaring dependency is properly configured. However, ensure that desugaring is enabled for all flavors that will use java.time APIs (see comment on lines 38-41).

app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (1)

128-145: Well-structured navigation implementation.

The migration from MainScreenNav to the new navigation structure (HomeScreenNav, ApplicationScreenNav, MyPageScreenNav, MealScreenNav) is properly implemented. Each route is correctly wired with appropriate navigation callbacks, and the back stack management logic appropriately clears main screens before navigating to a new bottom bar destination.

Comment on lines +38 to +41

compileOptions {
isCoreLibraryDesugaringEnabled = true
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

Enable desugaring for prod flavor as well.

Desugaring is only enabled for the dev flavor, but the coreLibraryDesugaring dependency is added globally (Line 147). Since the PR migrates to java.time APIs and minSdk = 23 (API 23 < 26), the prod build will crash at runtime when using java.time classes without desugaring.

πŸ”Ž Proposed fix to enable desugaring for prod flavor
     create("prod") {
         dimension = "environment"
         buildConfigField("String", "ENVIRONMENT", "\"prod\"")
+
+        compileOptions {
+            isCoreLibraryDesugaringEnabled = true
+        }
     }

Committable suggestion skipped: line range outside the PR's diff.

πŸ€– Prompt for AI Agents
In app/build.gradle.kts around lines 38 to 41, desugaring is enabled only for
the dev flavor but the coreLibraryDesugaring dependency is added globally,
causing prod builds to crash when using java.time on minSdk 23; enable
desugaring for prod by moving or adding isCoreLibraryDesugaringEnabled = true to
a global compileOptions block under android (or add the same flag inside the
prod flavor block) so both flavors use core library desugaring.

Comment on lines 102 to 104
modifier = Modifier
.navigationBarsPadding()
.systemBarsPadding(),
Copy link

Choose a reason for hiding this comment

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

πŸ› οΈ Refactor suggestion | 🟠 Major

Remove redundant padding modifier.

Both navigationBarsPadding() and systemBarsPadding() are applied to the NavDisplay. Since systemBarsPadding() already includes padding for both status bars and navigation bars, the navigationBarsPadding() call is redundant.

πŸ”Ž Proposed fix
         NavDisplay(
             modifier = Modifier
-                .navigationBarsPadding()
                 .systemBarsPadding(),
πŸ“ 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
modifier = Modifier
.navigationBarsPadding()
.systemBarsPadding(),
modifier = Modifier
.systemBarsPadding(),
πŸ€– Prompt for AI Agents
In app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt around lines 102 to
104, the NavDisplay modifier applies both navigationBarsPadding() and
systemBarsPadding(), which is redundant because systemBarsPadding() already
includes navigation bar insets; remove the navigationBarsPadding() call and
leave only systemBarsPadding() on the modifier so the component still receives
status and navigation bar padding without duplication.

Comment on lines +33 to +37
Text(
text = "${date.year}.${date.monthValue}.${date.dayOfMonth} (${date.dayOfWeek.toLocale()})",
style = DmsTheme.typography.bodyB,
color = DmsTheme.colorScheme.onPrimaryContainer,
)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add accessibility semantics for screen reader support.

The DateChip lacks a content description, which impacts users relying on screen readers. Add a semantics modifier to provide proper accessibility context.

πŸ”Ž Proposed fix to add accessibility support
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+
 @Composable
 internal fun DateChip(
     modifier: Modifier = Modifier,
     date: LocalDate,
 ) {
+    val dateDescription = "${date.year}λ…„ ${date.monthValue}μ›” ${date.dayOfMonth}일 ${date.dayOfWeek.toLocale()}"
+    
     Row(
         modifier = modifier
             .wrapContentWidth()
+            .semantics { contentDescription = dateDescription }
             .background(
                 color = DmsTheme.colorScheme.background,
                 shape = CircleShape,
             )
πŸ“ 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
Text(
text = "${date.year}.${date.monthValue}.${date.dayOfMonth} (${date.dayOfWeek.toLocale()})",
style = DmsTheme.typography.bodyB,
color = DmsTheme.colorScheme.onPrimaryContainer,
)
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@Composable
internal fun DateChip(
modifier: Modifier = Modifier,
date: LocalDate,
) {
val dateDescription = "${date.year}λ…„ ${date.monthValue}μ›” ${date.dayOfMonth}일 ${date.dayOfWeek.toLocale()}"
Row(
modifier = modifier
.wrapContentWidth()
.semantics { contentDescription = dateDescription }
.background(
color = DmsTheme.colorScheme.background,
shape = CircleShape,
)
) {
Text(
text = "${date.year}.${date.monthValue}.${date.dayOfMonth} (${date.dayOfWeek.toLocale()})",
style = DmsTheme.typography.bodyB,
color = DmsTheme.colorScheme.onPrimaryContainer,
)
}
}
πŸ€– Prompt for AI Agents
In
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt
around lines 33–37, the Text composable lacks accessibility semantics for screen
readers; add a Modifier.semantics block supplying a clear contentDescription
(e.g. the same formatted date string used in the Text, including localized
day-of-week) and import androidx.compose.ui.semantics.semantics and
androidx.compose.ui.semantics.contentDescription so assistive technologies read
the date; ensure you apply the modifier to the Text (or the parent) and keep the
description concise and localized.

lifecycle = "2.7.0"
material = "1.11.0"
materialCompose = "1.3.2"
composeCalendar = "2.6.0"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟑 Minor

Update library versions to current stable releases.

Kizitonwose calendar compose latest is 2.9.0 (code shows 2.6.0), desugar_jdk_libs should be 2.0.3 for AGP 7.4+, kotlinx-datetime current version is 0.7.1 with breaking changes from 0.6.x, and kotlinx-collections-immutable should be 0.4.0. No known security advisories were found, but newer versions provide bug fixes and improved compatibility.

πŸ€– Prompt for AI Agents
In gradle/libs.versions.toml around line 23, update outdated dependency
versions: change composeCalendar from 2.6.0 to 2.9.0, desugar_jdk_libs to 2.0.3,
kotlinx-datetime to 0.7.1 and kotlinx-collections-immutable to 0.4.0; after
bumping kotlinx-datetime note it has breaking changes from 0.6.x so adjust any
datetime API usages accordingly (imports, constructors, and function names) to
match 0.7.1.

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

♻️ Duplicate comments (1)
gradle/libs.versions.toml (1)

23-23: Address the outdated dependency versions flagged in previous review.

The previous review already identified that several dependencies need updating to their latest stable versions. Please refer to the existing comment for details on composeCalendar, kotlinxDatetime, and kotlinx-collections-immutable.

Also applies to: 52-53, 92-93, 119-120

🧹 Nitpick comments (6)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (2)

51-56: Wrap the gradient in remember to avoid reallocation on recomposition.

The radial gradient is created on every recomposition, causing unnecessary allocations since it never changes.

πŸ”Ž Proposed fix
-    val gradient = Brush.radialGradient(
-        colors = listOf(
-            Color(0xFF002051).copy(alpha = 0.2f),
-            Color(0xFF0F6EFE).copy(alpha = 0.2f),
-        )
-    )
+    val gradient = remember {
+        Brush.radialGradient(
+            colors = listOf(
+                Color(0xFF002051).copy(alpha = 0.2f),
+                Color(0xFF0F6EFE).copy(alpha = 0.2f),
+            )
+        )
+    }

59-73: Extract hardcoded Korean strings to string resources for localization.

The user-facing messages "κ°œλ°œμ€‘μΈ κΈ°λŠ₯μ΄μ—μš”" are hardcoded and will not support localization or easy updates.

πŸ”Ž Recommended approach

Add the string to strings.xml:

<string name="feature_under_development">κ°œλ°œμ€‘μΈ κΈ°λŠ₯μ΄μ—μš”</string>

Then reference it in the code (you'll need to pass a Context or use a string resource holder pattern in your architecture):

// Example if using a resources provider
onShowSnackBar(
    DmsSnackBarType.SUCCESS,
    stringResource(R.string.feature_under_development)
)
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (4)

63-68: Bottom bar visibility logic is correct.

The logic correctly shows the bottom bar only on main navigation screens (Home, Application, MyPage) and hides it on detail screens like Meal and authentication screens. The implementation properly excludes MealScreenNav from the bottom bar visibility list.

For slightly improved readability, consider renaming the variable to make the intent more explicit:

πŸ”Ž Optional refactor for clarity
-    val shouldShowBottomBar = currentScreen in listOf(
+    val isMainNavigationScreen = currentScreen in listOf(
         HomeScreenNav,
         ApplicationScreenNav,
         MyPageScreenNav,
     )
     
     ...
     
         bottomBar = {
-            if (shouldShowBottomBar) {
+            if (isMainNavigationScreen) {

83-105: Scaffold padding properly applied, but check for redundancy.

The Scaffold content padding is now correctly captured and applied to NavDisplay (lines 101, 104), which prevents content overlap with the bottom bar. This addresses a previous major issue.

However, the navigationBarsPadding() modifier on line 105 might be redundant if the Scaffold is configured to handle window insets (which is the default in Material3). The Scaffold's paddingValues typically includes system bar insets.

πŸ”Ž Verify if navigationBarsPadding is needed
#!/bin/bash
# Check if Scaffold is configured with edge-to-edge or window insets handling
echo "Checking Scaffold windowInsets configuration:"
rg -n -A5 "Scaffold\(" app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt

# Check Material3 Scaffold defaults in the project
echo -e "\nChecking MaterialTheme or Scaffold configuration:"
rg -n "WindowInsets|edge.*to.*edge" --type=kt

If the Scaffold handles all insets, consider removing the explicit navigationBarsPadding() to avoid potential double-padding.


88-96: Bottom bar navigation logic is functional but can be simplified.

The navigation logic correctly removes previous main screens before adding the new destination, ensuring a clean back stack for bottom bar navigation.

The type checks using is work correctly, but for data objects, instance equality checks are more idiomatic and clearer:

πŸ”Ž Suggested simplification
                 onNavigate = { destination ->
                     if (currentScreen != destination) {
                         backStack.removeAll {
-                            it is HomeScreenNav ||
-                            it is ApplicationScreenNav ||
-                            it is MyPageScreenNav
+                            it in listOf(HomeScreenNav, ApplicationScreenNav, MyPageScreenNav)
                         }
                         backStack.add(destination)
                     }
                 }

This is more concise and aligns with the pattern used at lines 64-68.


149-164: Consider using Scaffold's dedicated snackbarHost parameter.

The SnackbarHost is currently placed as content within the Scaffold. While this works, Material3's Scaffold provides a dedicated snackbarHost parameter designed for this purpose, which ensures proper z-ordering, positioning, and material design compliance.

πŸ”Ž Recommended: Use Scaffold's snackbarHost parameter
     Scaffold(
+        snackbarHost = {
+            SnackbarHost(
+                hostState = appState.snackBarHostState,
+                snackbar = {
+                    val visuals = it.visuals as? DmsSnackBarVisuals ?: return@SnackbarHost
+                    DmsSnackBar(
+                        snackBarType = visuals.snackBarType,
+                        message = visuals.message,
+                    )
+                },
+            )
+        },
         bottomBar = {
             if (shouldShowBottomBar) {
                 BottomNavigationBar(
                     currentScreen = currentScreen,
                     onNavigate = { destination ->
                         if (currentScreen != destination) {
                             backStack.removeAll {
                                 it is HomeScreenNav ||
                                 it is ApplicationScreenNav ||
                                 it is MyPageScreenNav
                             }
                             backStack.add(destination)
                         }
                     }
                 )
             }
         }
     ) { paddingValues ->
         NavDisplay(
             modifier = Modifier
                 .padding(paddingValues)
                 .navigationBarsPadding(),
             backStack = backStack,
             onBack = { backStack.removeLastOrNull() },
             entryProvider = entryProvider {
                 // ... entries
             },
         )
-        Box {
-            SnackbarHost(
-                modifier = Modifier
-                    .statusBarsPadding()
-                    .padding(top = 16.dp)
-                    .align(Alignment.Center),
-                hostState = appState.snackBarHostState,
-                snackbar = {
-                    val visuals = it.visuals as? DmsSnackBarVisuals ?: return@SnackbarHost
-                    DmsSnackBar(
-                        snackBarType = visuals.snackBarType,
-                        message = visuals.message,
-                    )
-                },
-            )
-        }
     }

This approach:

  • Follows Material Design guidelines
  • Ensures proper z-ordering with FABs and other elements
  • Automatically handles positioning and animations
  • Simplifies the layout structure

Note: If custom positioning is required (centered at top as currently implemented), you can still customize the snackbarHost while keeping it in the proper parameter.

πŸ“œ Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 3605f56 and 8665f98.

πŸ“’ Files selected for processing (4)
  • app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/signin/ui/SigninScreen.kt
  • gradle/libs.versions.toml
🧰 Additional context used
🧬 Code graph analysis (2)
app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (5)
app/src/dev/kotlin/team/aliens/dms/android/app/BottomNavigationBar.kt (1)
  • BottomNavigationBar (33-84)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt (1)
  • HomeRoute (7-18)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/navigation/ApplicationRoute.kt (1)
  • ApplicationRoute (7-10)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/navigation/MyPageRoute.kt (1)
  • MyPageRoute (7-10)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/navigation/MealRoute.kt (1)
  • MealRoute (6-13)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (5)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/HomeTopAppBar.kt (1)
  • HomeTopAppBar (19-48)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt (1)
  • AnnouncementButton (23-61)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt (1)
  • MealContent (30-76)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt (1)
  • DmsPointContent (25-71)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt (1)
  • DmsItemButton (31-81)
⏰ 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: build
πŸ”‡ Additional comments (7)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt (1)

86-142: LGTM! Well-structured Compose UI.

The UI composition follows Compose best practices with proper state management, modifier usage, and scrollable content. The layout hierarchy and spacing are well-organized.

gradle/libs.versions.toml (2)

42-42: Verify that dropping Android 6.0 support is intentional.

Increasing minSdk from 23 to 24 removes support for Android 6.0 (Marshmallow). Confirm this breaking change is intentional and, if so, ensure it's documented in release notes or migration guides.


44-44: LGTM: Desugar JDK libs version is appropriate.

Version 2.0.3 is correct for the AGP 8.9.1 in use.

Also applies to: 119-119

app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt (2)

41-50: LGTM: Navigation keys properly defined.

The new navigation keys (HomeScreenNav, MealScreenNav, ApplicationScreenNav, MyPageScreenNav) are correctly defined as serializable data objects, following the navigation3 pattern used throughout the app.


129-146: LGTM: Navigation routes properly wired.

All routes are correctly implemented with appropriate navigation callbacks:

  • HomeRoute navigates to MealScreenNav (line 132)
  • MealRoute uses removeLastOrNull() for safe back navigation (line 144)
  • Main navigation screens (Home, Application, MyPage) are properly registered

The use of removeLastOrNull() addresses the previous concern about potential crashes from removeLast() on an empty stack.

feature/src/dev/kotlin/team/aliens/dms/android/feature/signin/ui/SigninScreen.kt (2)

36-37: Padding utilities successfully migrated to design system.

The horizontalPadding and topPadding extension functions are properly defined in core.designsystem and correctly imported in the file. No remaining legacy imports from core.ui for padding utilities were found across the codebase.


55-55: LGTM: Updated to use new sideEffect API.

The side effect collection has been updated from effectFlow to sideEffect, consistent with the ViewModel API changes mentioned in the summary.

Verify that the base ViewModel class supports the sideEffect property and all ViewModels have been migrated:

#!/bin/bash
# Description: Verify sideEffect API is defined and consistently used

# Find the base ViewModel definition
echo "Checking BaseStateViewModel for sideEffect property:"
ast-grep --pattern 'val sideEffect'

# Check for any remaining uses of old effectFlow API
echo -e "\nChecking for old effectFlow usages:"
rg -n "\.effectFlow\s*\." --type=kt

firebaseBom = "33.0.0"
firebaseMessaging = "24.0.0"
googleServices = "4.4.1"
googleServices = "4.4.2"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟑 Minor

Update Google Services plugin to the latest version.

The Google Services plugin version 4.4.2 is outdated. The latest stable version is 4.4.4, which should be used instead.

πŸ€– Prompt for AI Agents
In gradle/libs.versions.toml at line 11, the googleServices version is pinned to
4.4.2; update that value to "4.4.4" to use the latest stable Google Services
plugin, save the file, and run a Gradle sync/build to verify there are no
compatibility issues.

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

🧹 Nitpick comments (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (1)

59-59: Consider clarifying the constant name or adding documentation.

MAX_CALENDAR_COUNT = 366 suggests calendar days, but the HorizontalPager cycles through 3 meal types (BREAKFAST, LUNCH, DINNER), not 366 distinct items. The value provides a large page pool for bidirectional scrolling, but the name-purpose relationship is unclear. Consider renaming to MAX_PAGER_COUNT or adding a comment explaining that this provides the paging pool for meal type cycling.

πŸ“œ Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 8665f98 and 93976dd.

πŸ“’ Files selected for processing (1)
  • feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt
🧰 Additional context used
🧬 Code graph analysis (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (6)
core/design-system/src/prod/java/team/aliens/dms/android/core/designsystem/Modal.kt (1)
  • ModalBottomSheet (16-46)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/component/DateChip.kt (1)
  • DateChip (18-39)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/viewmodel/MealViewModel.kt (1)
  • getProperMeal (101-105)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsIconButton.kt (1)
  • DmsIconButton (17-40)
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/MealContent.kt (1)
  • MealContent (30-76)
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/DmsItemButton.kt (1)
  • DmsItemButton (31-81)
⏰ 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: build
πŸ”‡ Additional comments (1)
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt (1)

88-96: Verify edge case handling for rapid page transitions.

The LaunchedEffect tracks page changes and calls setNextMealType or setPreviousMealType based on direction. This assumes sequential navigation (one page at a time). If the user swipes multiple pages rapidly or if animateScrollToPage is interrupted, the logic might not correctly track the meal type transitions.

Consider testing rapid swipes and verifying that currentCardType stays synchronized with the displayed meal type. You may want to calculate the meal type directly from the page offset rather than tracking direction.

Comment on lines +176 to +195
HorizontalPager(
modifier = Modifier
.fillMaxWidth(),
state = pagerState,
) { page ->
val mealPage = page + getProperMeal().ordinal
val cardType = when (mealPage % 3) {
0 -> MealCardType.BREAKFAST
1 -> MealCardType.LUNCH
else -> MealCardType.DINNER
}
Image(
modifier = Modifier
.fillMaxWidth()
.size(200.dp)
.align(Alignment.Center),
painter = painterResource(cardType.iconRes),
contentDescription = null,
)
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Fix state synchronization issue in pager icon calculation.

The pager uses getProperMeal().ordinal (line 181) to calculate which meal icon to display. According to the relevant code snippets, getProperMeal() reads now.hour to determine the meal type based on current time. This creates a logic inconsistency:

  1. The ViewModel manages currentCardType through user navigation (setNextMealType/setPreviousMealType)
  2. The pager icons are rendered based on getProperMeal() which reads current time, independent of ViewModel state
  3. If the current time changes while the user is viewing the screen (e.g., crossing from morning to afternoon), the icon calculation changes, causing unexpected behavior
  4. The displayed icons may not match the ViewModel's currentCardType, violating the single source of truth principle

The ViewModel's currentCardType should be the authoritative source for determining which meal type is displayed. Consider refactoring to calculate the page offset from currentCardType instead of getProperMeal().

πŸ”Ž Suggested refactor

Instead of using getProperMeal().ordinal in the pager item composition, calculate the offset based on the initial proper meal (computed once) or pass the offset from the parent composable based on state.currentCardType:

// In Meal composable, calculate initial offset once
val initialMealOffset = remember { getProperMeal().ordinal }

// Pass to MealScreen
MealScreen(
    initialMealOffset = initialMealOffset,
    // ... other params
)

// In MealScreen's HorizontalPager
HorizontalPager(
    // ...
) { page ->
    val mealPage = page + initialMealOffset
    val cardType = when (mealPage % 3) {
        0 -> MealCardType.BREAKFAST
        1 -> MealCardType.LUNCH
        else -> MealCardType.DINNER
    }
    // ...
}

Alternatively, compute the icon to display directly from currentCardType and the page offset relative to the current page.

πŸ€– Prompt for AI Agents
In feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt
around lines 176–195, the pager computes mealPage using getProperMeal().ordinal
which reads current time and can change independently of the ViewModel, causing
state desync; instead derive the pager offset from a single source of truth (the
ViewModel's currentCardType) or compute the initial offset once and pass it in
(e.g., remember initialMealOffset = getProperMeal().ordinal in the parent and
pass into MealScreen) so the pager uses that stable offset or
state.currentCardType.ordinal to calculate mealPage; update the HorizontalPager
calculation to use the provided initial offset or the ViewModel value and remove
direct calls to getProperMeal() to ensure icons follow the ViewModel navigation
state.

Comment on lines +238 to +254
internal enum class MealCardType(
val title: String,
@DrawableRes val iconRes: Int,
) {
BREAKFAST(
title = "μ•„μΉ¨",
iconRes = R.drawable.img_morning,
),
LUNCH(
title = "점심",
iconRes = R.drawable.img_launch,
),
DINNER(
title = "저녁",
iconRes = R.drawable.img_dinner,
),
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

🧩 Analysis chain

🏁 Script executed:

# Find drawable resources in the repository
find . -type f \( -name "*.png" -o -name "*.jpg" -o -name "*.webp" -o -name "*.xml" \) -path "*/drawable*" | head -30

Repository: team-aliens/DMS-Android

Length of output: 1799


🏁 Script executed:

# Search for references to img_launch and img_lunch in the codebase
rg "img_lunch|img_launch" -i

Repository: team-aliens/DMS-Android

Length of output: 184


Line 248: Drawable resource name appears to be a typo.

The LUNCH enum value references R.drawable.img_launch, which is likely a typo for R.drawable.img_lunch. The naming pattern across other meal types (img_morning, img_dinner) and the enum structure (BREAKFAST, LUNCH, DINNER) suggests the resource should be img_lunch to match the meal type.

 LUNCH(
     title = "점심",
-    iconRes = R.drawable.img_launch,
+    iconRes = R.drawable.img_lunch,
 ),
πŸ“ 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
internal enum class MealCardType(
val title: String,
@DrawableRes val iconRes: Int,
) {
BREAKFAST(
title = "μ•„μΉ¨",
iconRes = R.drawable.img_morning,
),
LUNCH(
title = "점심",
iconRes = R.drawable.img_launch,
),
DINNER(
title = "저녁",
iconRes = R.drawable.img_dinner,
),
}
internal enum class MealCardType(
val title: String,
@DrawableRes val iconRes: Int,
) {
BREAKFAST(
title = "μ•„μΉ¨",
iconRes = R.drawable.img_morning,
),
LUNCH(
title = "점심",
iconRes = R.drawable.img_lunch,
),
DINNER(
title = "저녁",
iconRes = R.drawable.img_dinner,
),
}
πŸ€– Prompt for AI Agents
feature/src/dev/kotlin/team/aliens/dms/android/feature/meal/ui/MealScreen.kt
lines 238-254: the LUNCH enum references a likely-typo drawable
R.drawable.img_launch; change it to R.drawable.img_lunch to match naming
convention (img_morning, img_lunch, img_dinner); if img_lunch does not exist,
rename the drawable asset from img_launch to img_lunch or add a new img_lunch
resource and update any references accordingly.

@uson1004 uson1004 merged commit 5b2a292 into develop Dec 23, 2025
1 of 2 checks passed
@uson1004 uson1004 deleted the feature/810-ν™ˆ-ν™”λ©΄-κ΅¬ν˜„ branch December 23, 2025 09:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  경우

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ν™ˆ ν™”λ©΄ κ΅¬ν˜„

2 participants