Skip to content

πŸ”€ :: (#822) λ‹€ν¬ν…Œλ§ˆ μ‹œ μ•„μ΄μ½˜ 컬러 λŒ€λΉ„ ν•΄κ²°#823

Merged
uson1004 merged 19 commits intodevelopfrom
refactor/822-λ‹€ν¬ν…Œλ§ˆ-μ‹œ-μ•„μ΄μ½˜-컬러-λŒ€λΉ„-ν•΄κ²°
Feb 3, 2026

Hidden character warning

The head ref may contain hidden characters: "refactor/822-\ub2e4\ud06c\ud14c\ub9c8-\uc2dc-\uc544\uc774\ucf58-\uceec\ub7ec-\ub300\ube44-\ud574\uacb0"
Merged

πŸ”€ :: (#822) λ‹€ν¬ν…Œλ§ˆ μ‹œ μ•„μ΄μ½˜ 컬러 λŒ€λΉ„ ν•΄κ²°#823
uson1004 merged 19 commits intodevelopfrom
refactor/822-λ‹€ν¬ν…Œλ§ˆ-μ‹œ-μ•„μ΄μ½˜-컬러-λŒ€λΉ„-ν•΄κ²°

Conversation

@uson1004
Copy link
Member

@uson1004 uson1004 commented Jan 29, 2026

κ°œμš”

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

μΆ”κ°€ 둜 ν•  말

Summary by CodeRabbit

  • New Features

    • Account withdrawal flow in Settings
    • Latest announcement shown on Home with tappable notice
    • Empty-state message for scheduled votes
  • Bug Fixes

    • Notice detail view now scrolls vertically
  • Improvements

    • Reorganized notification UI and components
    • Renamed point terminology to "bonus"
    • Updated launcher icons and visual assets
  • Chores

    • Added dev/prod build variants
    • Improved device token persistence infrastructure

@uson1004 uson1004 requested a review from parkuiery January 29, 2026 13:46
@uson1004 uson1004 self-assigned this Jan 29, 2026
@uson1004 uson1004 added performance μ„±λŠ₯을 κ°œμ„  ν•  경우 refactor μ½”λ“œ λ¦¬νŒ©ν† λ§ ν•  경우 labels Jan 29, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 29, 2026

Caution

Review failed

The pull request is closed.

πŸ“ Walkthrough

Walkthrough

Adds launcher assets and manifest updates, introduces product flavors, implements device token DataStore with DI and exceptions, adds a "latest notice" network→data→UI flow, extracts notification item UI, renames plus→bonus point fields, adds account withdrawal flow, and miscellaneous UI/CI tweaks.

Changes

Cohort / File(s) Summary
App manifest & entry
app/src/dev/AndroidManifest.xml, app/src/dev/kotlin/.../DmsApp.kt
Adjusted application android:name to a relative manifest path and added application attributes; reordered window-inset usage and removed a background tint in DmsApp.
Launcher & resources
app/src/dev/res/drawable/ic_launcher_background.xml, app/src/dev/res/drawable/ic_launcher_foreground.xml, app/src/dev/res/mipmap-anydpi-v26/ic_launcher*.xml, app/src/dev/res/values/*, core/design-system/src/dev/res/drawable-night/*
Added adaptive launcher icon background/foreground, mipmap entries, color/string resources, and night-mode vector icons (ic_equal, ic_minus, ic_plus).
Build flavors & manifests
core/device/build.gradle.kts, core/device/src/main/AndroidManifest.xml
Introduced environment flavorDimension with dev/prod flavors; removed an empty main manifest.
Device token datastore & DI
core/device/src/prod/.../datastore/*, core/device/src/prod/.../di/*
Added DeviceDataStoreDataSource + DeviceDataStoreDataSourceImpl, DeviceStore + DeviceStoreImpl, exceptions (CannotStoreDeviceTokenException, DeviceTokenNotFoundException), and Hilt modules binding store and data source.
Latest notice: network β†’ data β†’ feature
network/src/dev/.../notice/apiservice/NoticeApiService.kt, network/.../notice/datasource/*, network/.../notice/model/FetchLatestNoticeResponse.kt, data/src/dev/.../notice/*, feature/src/dev/.../home/*
Added GET /notices/latest API, network datasource method & impl, response model, data-layer LatestNotice + mapper, repository method, and HomeViewModel/HomeScreen integration (fetch on init, new latestNotice state and side effects).
Notification UI refactor
feature/src/dev/.../notification/ui/NotificationScreen.kt, feature/src/dev/.../notification/ui/component/NoticeItem.kt, feature/src/dev/.../notification/navigation/NotificationRoute.kt
Extracted NoticeItem into a new component, renamed top-level composable to Notification, adjusted LazyColumn sizing and route invocation to use the new API.
Point terminology refactor
feature/src/dev/.../home/model/DmsPointCotent.kt, .../home/ui/HomeScreen.kt, .../mypage/ui/MyPageScreen.kt, .../point/ui/PointHistoryScreen.kt, .../point/viewmodel/PointHistoryViewModel.kt
Renamed plusPoint β†’ bonusPoint across UI/state and renamed PointTab.BONUS β†’ PointTab.Bonus.
Settings: withdrawal flow
feature/src/dev/.../setting/ui/SettingScreen.kt, feature/src/dev/.../setting/viewmodel/SettingViewModel.kt
Added withdraw dialog state/UI hook, injected StudentRepository into ViewModel, added withdraw() and WithdrawSuccess/WithdrawFailed side effects, and wired UI actions.
Misc UI & CI
feature/src/dev/.../application/ui/ApplicationScreen.kt, feature/src/dev/.../notice/ui/NoticeDetailScreen.kt, network/src/dev/.../notification/model/NotificationTopicGroup.kt, .github/workflows/ci.yml, feature/src/dev/.../resetpassword/viewmodel/ResetPasswordViewModel.kt
Added empty-votes message, switched notice detail to vertical scroll, removed NotificationTopicGroup enum, updated GH Action to write GOOGLE_SERVICES_JSON and run assembleDebug, and minor formatting/trailing-comma edits.

Sequence Diagram(s)

sequenceDiagram
    participant HomeVM as HomeViewModel
    participant Repo as NoticeRepository
    participant Network as NetworkNoticeDataSource
    participant API as NoticeApiService

    HomeVM->>Repo: fetchLatestNotice()
    Repo->>Network: fetchLatestNotice()
    Network->>API: GET /notices/latest (with access token)
    API-->>Network: FetchLatestNoticeResponse (id, title)
    Network-->>Repo: Result<FetchLatestNoticeResponse>
    Repo-->>HomeVM: Result<LatestNotice> (mapped)
    HomeVM->>HomeVM: update state.latestNotice / emit FailFetchLatestNotice on error
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

  • team-aliens/DMS-Android#821 β€” Adds/modifies night-mode vector drawables (ic_equal, ic_minus, ic_plus), matching this PR’s drawable additions.

Possibly related PRs

Suggested reviewers

  • parkuiery
  • JunJaBoy

Poem

🐰 New icons hop in, tidy and spry,
Notices whisper their latest reply,
Tokens snuggle safe in datastores deep,
Bonus points bounce where old pluses sleep,
A rabbit cheers β€” the build hops on by! πŸŽ‰

πŸš₯ Pre-merge checks | βœ… 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Title check ⚠️ Warning The PR title mentions dark theme icon color contrast issues, but the actual changes include launcher icons, notification UI refactoring, point naming changes, withdrawal flow, and device datastore implementationsβ€”far broader scope than the title suggests. Update the title to reflect the full scope: consider 'Add latest notice feature and refactor notification/point components' or similar that captures the main changes.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
βœ… Passed checks (1 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing touches
  • πŸ“ Generate docstrings
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/822-λ‹€ν¬ν…Œλ§ˆ-μ‹œ-μ•„μ΄μ½˜-컬러-λŒ€λΉ„-ν•΄κ²°

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

❀️ Share

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

Copy link

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

Caution

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

⚠️ Outside diff range comments (2)
feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt (1)

220-246: Same modifier reuse issue exists here.

NotificationItem has the same bug as the extracted NoticeItem - the outer modifier parameter is incorrectly reused for inner composables (Column, Row, Icon, Text, Spacer), which would apply unintended modifiers like fillMaxWidth() and clickable() to child elements.

πŸ› Proposed fix
         Column(
-            modifier = modifier.startPadding(12.dp),
+            modifier = Modifier.startPadding(12.dp),
         ) {
             Text(
                 text = notification.title,
                 style = DmsTheme.typography.bodyM,
             )
             Row(
-                modifier = modifier.topPadding(6.dp)
+                modifier = Modifier.topPadding(6.dp)
             ) {
                 if (!notification.isRead) {
                     Icon(
-                        modifier = modifier.size(4.dp),
+                        modifier = Modifier.size(4.dp),
                         imageVector = Icons.Filled.Circle,
                         contentDescription = null,
                         tint = DmsTheme.colorScheme.primaryContainer,
                     )
                 }
                 Text(
-                    modifier = modifier
+                    modifier = Modifier
                         .startPadding(4.dp),
                     text = notification.content,
                     style = DmsTheme.typography.labelM,
                 )
             }
         }
-        Spacer(modifier = modifier.weight(1f))
+        Spacer(modifier = Modifier.weight(1f))
feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt (1)

49-111: Prevent multiple withdraw submissions.

The confirm button stays enabled and the dialog remains open, so users can trigger multiple destructive requests. Please disable the button and/or show loading until the request finishes (and reset on success/failure).

βœ… Suggested fix (pairs with a WithdrawFailed side effect)
-    val (shouldShowWithdrawDialog, onShouldShowWithdrawDialogChange) = remember {
-        mutableStateOf(false)
-    }
+    val (shouldShowWithdrawDialog, onShouldShowWithdrawDialogChange) = remember { mutableStateOf(false) }
+    val (isWithdrawing, onWithdrawingChange) = remember { mutableStateOf(false) }
@@
             when (it) {
                 SettingSideEffect.CannotFetchNotificationStatus -> {
                     onShowSnackBar(DmsSnackBarType.ERROR, "μ•Œλ¦Ό μƒνƒœ 쑰회λ₯Ό μ‹€νŒ¨ν–ˆμ–΄μš”")
                 }
                 SettingSideEffect.SignOutSuccess -> onNavigateSignIn()
-                SettingSideEffect.WithdrawSuccess -> onNavigateSignIn()
+                SettingSideEffect.WithdrawSuccess -> {
+                    onWithdrawingChange(false)
+                    onNavigateSignIn()
+                }
+                SettingSideEffect.WithdrawFailed -> {
+                    onWithdrawingChange(false)
+                    onShowSnackBar(DmsSnackBarType.ERROR, "νšŒμ› νƒˆν‡΄μ— μ‹€νŒ¨ν–ˆμ–΄μš”")
+                }
             }
         }
     }
@@
             confirmButton = {
                 DmsButton(
                     text = "확인",
                     buttonType = ButtonType.Text,
                     buttonColor = ButtonColor.Primary,
-                    onClick = viewModel::withdraw,
+                    enabled = !isWithdrawing,
+                    isLoading = isWithdrawing,
+                    onClick = {
+                        onWithdrawingChange(true)
+                        viewModel.withdraw()
+                    },
                 )
             },
πŸ€– Fix all issues with AI agents
In `@app/src/dev/AndroidManifest.xml`:
- Around line 14-24: In the production AndroidManifest change the insecure
attributes so they are disabled: set android:allowBackup="false" and
android:usesCleartextTraffic="false" in the <application> element (the manifest
that currently contains android:name=".android.app.DevApplication" /
tools:replace="android:name"); update the production manifest's <application>
attributes to explicitly use these false values to prevent backups and block
cleartext HTTP in production.

In
`@core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt`:
- Line 4: Remove the unused import suspendRunCatching from the top of
DeviceDataStoreDataSourceImpl (it's not used in the prod implementation which
directly delegates calls); update the imports by deleting the line importing
team.aliens.dms.android.shared.exception.util.suspendRunCatching so there are no
unused imports remaining.

In
`@core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt`:
- Line 7: The import kotlinx.coroutines.runBlocking in DeviceStoreImpl is
unused; remove the unused import line (the runBlocking import) from the top of
DeviceStoreImpl.kt to clean up imports and avoid a lint warning.
- Around line 33-37: clearDeviceToken currently clears all preferences; change
it to remove only the device token key by calling deviceDataStore.edit {
preferences.remove(DEVICE_TOKEN_KEY) } inside the existing transform call
(mirror the pattern used in storeDeviceToken). Also add consistent error
handling like storeDeviceToken by attaching onFailure to the transform result
(or otherwise handling exceptions) so failures are logged/propagated the same
way.

In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt`:
- Around line 94-98: The outer Column in HomeScreen (the composable using
Modifier.fillMaxSize().background(DmsTheme.colorScheme.background).statusBarsPadding())
is missing bottom inset handling; update its modifier chain to also call
navigationBarsPadding() so the bottom action buttons aren't overlapped by
gesture/navigation barsβ€”i.e., locate the Column in HomeScreen.kt and append
.navigationBarsPadding() to the existing modifier chain (preserving
.statusBarsPadding()) to match MyPageScreen/ApplicationScreen.

In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt`:
- Around line 46-72: The inner composables are incorrectly reusing the
NoticeItem parameter 'modifier' (applied to Column, Row, Icon, Text, Spacer),
which can leak outer modifiers into children; update the file so only the root
composable receives the passed-in 'modifier' and replace all inner uses with
fresh Modifier instances (e.g., Column(... = modifier /* keep only at root */)
but Row(... = Modifier.topPadding(...)), Icon(... = Modifier.size(...)),
Text(... = Modifier.startPadding(...)), Spacer(Modifier.weight(1f)), etc.),
ensuring you reference the Column, Row, Icon, Text, Spacer and the 'modifier'
parameter in NoticeItem when making the change.

In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt`:
- Around line 99-103: The current remember call that computes pointHistoryList
using keys (page, state.allPointList) can return stale data when
state.bonusPointList or state.minusPointList change; update the computation in
PointHistoryScreen by either removing the remember (compute pointHistoryList
directly) or expanding the remember keys to include state.bonusPointList and
state.minusPointList and tabData[page], so that pointHistoryList reacts to
changes; locate the remember invocation that assigns pointHistoryList and modify
it accordingly (symbols: pointHistoryList, remember, tabData,
PointTab.All/Bonus/Minus,
state.allPointList/state.bonusPointList/state.minusPointList).

In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt`:
- Around line 48-54: The withdraw() coroutine currently ignores failures; update
the studentRepository.withdraw() call to handle onFailure and emit a failure
side effect so UI can show an error and reset loading stateβ€”e.g., in the block
where you call studentRepository.withdraw() inside
viewModelScope.launch(Dispatchers.IO), add .onFailure {
sendEffect(SettingSideEffect.WithdrawFailure(it)) } (or include a message from
the Throwable) alongside the existing
sendEffect(SettingSideEffect.WithdrawSuccess), and make the same change for the
other similar withdraw call in this file.
🧹 Nitpick comments (5)
app/src/dev/res/drawable/ic_launcher_background.xml (1)

1-170: Consider removing this unused drawable.

This appears to be the default Android Studio template for adaptive icon backgrounds (green with grid pattern). However, the adaptive icon definitions in ic_launcher.xml and ic_launcher_round.xml reference @color/ic_launcher_background (the white color resource), not this drawable.

If this file is intentionally kept as a fallback or for future use, consider adding a comment explaining its purpose. Otherwise, removing it would reduce confusion.

app/src/dev/AndroidManifest.xml (1)

26-29: Consider tablet/foldable accessibility.

Locking screenOrientation="portrait" prevents landscape usage on tablets and foldables, which may impact accessibility and user experience on larger form factors. If tablet support is planned, consider making this configurable or allowing landscape on larger screens using resource qualifiers.

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

49-53: Constrain long titles to avoid row height blow‑ups.
Dynamic notice titles can be long; keep the pill height stable by limiting lines and ellipsizing.

♻️ Suggested tweak
 Text(
     modifier = Modifier.padding(start = 8.dp),
     text = title,
     style = DmsTheme.typography.labelM,
     color = DmsTheme.colorScheme.inverseSurface,
+    maxLines = 1,
+    overflow = TextOverflow.Ellipsis,
 )
feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt (2)

16-19: Prefer private injected repositories.

Avoid exposing repositories as public properties on the ViewModel API.

♻️ Proposed refactor
 internal class HomeViewModel `@Inject` constructor(
-    val studentRepository: StudentRepository,
-    val noticeRepository: NoticeRepository
+    private val studentRepository: StudentRepository,
+    private val noticeRepository: NoticeRepository
 ) : BaseStateViewModel<HomeState, HomeSideEffect>(HomeState()) {

53-56: Represent "no notice" explicitly to distinguish loading/error states from valid data.

The current approach uses default LatestNotice(id=null, title="") for both initial state and on fetch failure. Since getLatestNotice().onFailure() doesn't update state, the UI always shows an empty AnnouncementButton regardless of whether data failed to load or hasn't been fetched yet. This prevents proper error feedback to users and may allow navigation with a null notice ID.

Making latestNotice nullable allows the UI to conditionally render the announcement section and properly distinguish between missing data and real content.

βœ… Suggested change
 internal data class HomeState(
     val myPage: MyPage = MyPage(),
-    val latestNotice: LatestNotice = LatestNotice(),
+    val latestNotice: LatestNotice? = null,
 )

Comment on lines +14 to +24
android:name=".android.app.DevApplication"
tools:replace="android:name"
android:allowBackup="true"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DMS"
android:usesCleartextTraffic="true"
tools:targetApi="tiramisu">
Copy link

@coderabbitai coderabbitai bot Jan 29, 2026

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 AndroidManifest.xml files
fd -t f 'AndroidManifest.xml'

Repository: team-aliens/DMS-Android

Length of output: 946


🏁 Script executed:

#!/bin/bash
# Check allowBackup and usesCleartextTraffic in app manifests
for manifest in "app/src/main/AndroidManifest.xml" "app/src/dev/AndroidManifest.xml" "app/src/prod/AndroidManifest.xml"; do
  if [ -f "$manifest" ]; then
    echo "=== $manifest ==="
    cat -n "$manifest" | grep -E "allowBackup|usesCleartextTraffic" || echo "  (not found)"
  fi
done

Repository: team-aliens/DMS-Android

Length of output: 388


🏁 Script executed:

#!/bin/bash
# View prod manifest with context around the security settings
echo "=== app/src/prod/AndroidManifest.xml (lines 10-30) ==="
sed -n '10,30p' app/src/prod/AndroidManifest.xml

Repository: team-aliens/DMS-Android

Length of output: 1030


🏁 Script executed:

#!/bin/bash
# View main manifest application tag
echo "=== app/src/main/AndroidManifest.xml (lines 1-40) ==="
head -40 app/src/main/AndroidManifest.xml

Repository: team-aliens/DMS-Android

Length of output: 181


Remove insecure security settings from production manifest.

Both android:allowBackup="true" and android:usesCleartextTraffic="true" are enabled in the production manifest (lines 17, 24 of app/src/prod/AndroidManifest.xml). These settings pose security risks in production:

  • allowBackup="true" allows sensitive app data to be backed up to cloud storage
  • usesCleartextTraffic="true" permits unencrypted HTTP traffic

These should be set to false in the production build to enforce HTTPS and prevent uncontrolled data backup.

πŸ€– Prompt for AI Agents
In `@app/src/dev/AndroidManifest.xml` around lines 14 - 24, In the production
AndroidManifest change the insecure attributes so they are disabled: set
android:allowBackup="false" and android:usesCleartextTraffic="false" in the
<application> element (the manifest that currently contains
android:name=".android.app.DevApplication" / tools:replace="android:name");
update the production manifest's <application> attributes to explicitly use
these false values to prevent backups and block cleartext HTTP in production.

Copy link
Member Author

Choose a reason for hiding this comment

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

dev둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν•  μ˜ˆμ •. skip

Copy link

Choose a reason for hiding this comment

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

@uson1004, understood! I'll skip this for now since you're planning to migrate to dev. Feel free to reach out if you need any assistance with the migration. πŸ‘

Comment on lines 94 to 98
modifier = Modifier
.fillMaxSize()
.background(DmsTheme.colorScheme.background)
.systemBarsPadding()
.navigationBarsPadding(),
.statusBarsPadding(),
) {
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

🧩 Analysis chain

🏁 Script executed:

# First, let's check if the file exists and understand the codebase structure
find . -type f -name "HomeScreen.kt" | head -5

Repository: team-aliens/DMS-Android

Length of output: 232


🏁 Script executed:

# Get the file size to understand how much we need to read
wc -l feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 152


🏁 Script executed:

# Read the relevant section around lines 94-98 with more context
sed -n '80,120p' feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 1347


🏁 Script executed:

# Read more of the file to see the complete structure and bottom content
sed -n '100,140p' feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 1526


🏁 Script executed:

# Check the parent composable that calls HomeScreen
sed -n '1,93p' feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 3707


🏁 Script executed:

# Check if this Home composable is used within a Scaffold in parent files
rg -r "Home\(" --type kotlin | grep -E "(Scaffold|fun)" | head -20

Repository: team-aliens/DMS-Android

Length of output: 463


🏁 Script executed:

# Also check if there are navigation patterns or if this is integrated into a Scaffold elsewhere
rg "navigationBarsPadding" feature/src/dev/kotlin/team/aliens/dms/android/feature/main/ --type kotlin -B2 -A2

Repository: team-aliens/DMS-Android

Length of output: 3506


🏁 Script executed:

# Check if systemBarsPadding is a combined approach
rg "systemBarsPadding" feature/src/dev/kotlin/team/aliens/dms/android/ --type kotlin -B1 -A1 | head -30

Repository: team-aliens/DMS-Android

Length of output: 3121


🏁 Script executed:

# Check what systemBarsPadding does - it combines both status and navigation bar padding
# Let's see the complete pattern by checking if Home is wrapped in a Scaffold at navigation level
find . -type f -name "*.kt" -path "*/navigation/*" | xargs grep -l "Home" | head -5

Repository: team-aliens/DMS-Android

Length of output: 253


🏁 Script executed:

# Also check the prod version to see if it has different padding handling
sed -n '80,130p' feature/src/prod/kotlin/team/aliens/dms/android/feature/main/home/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 2281


🏁 Script executed:

# Let's check the navigation route to understand the context
cat feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/navigation/HomeRoute.kt

Repository: team-aliens/DMS-Android

Length of output: 948


🏁 Script executed:

# Check if there's a parent scaffold handling insets
rg -A 10 "fun Home\(" feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt

Repository: team-aliens/DMS-Android

Length of output: 479


🏁 Script executed:

# Check if this Home composable is part of a Scaffold at a higher level
rg -B 5 "HomeRoute\(" feature/src/dev/kotlin/team/aliens/dms/android/feature/main/ --type kotlin

Repository: team-aliens/DMS-Android

Length of output: 765


Add navigationBarsPadding to prevent bottom content overlap. The outer Column currently uses only .statusBarsPadding(), leaving action buttons at the bottom of the scrollable content exposed to gesture navigation bar overlap. The import for navigationBarsPadding already exists but is unused. Similar screens in the codebase (MyPageScreen, ApplicationScreen) use both top and bottom inset handling. Add .navigationBarsPadding() to the modifier chain to match the established pattern.

🧩 Suggested fix
         modifier = Modifier
             .fillMaxSize()
             .background(DmsTheme.colorScheme.background)
-            .statusBarsPadding(),
+            .statusBarsPadding()
+            .navigationBarsPadding(),
πŸ“ 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
.fillMaxSize()
.background(DmsTheme.colorScheme.background)
.systemBarsPadding()
.navigationBarsPadding(),
.statusBarsPadding(),
) {
modifier = Modifier
.fillMaxSize()
.background(DmsTheme.colorScheme.background)
.statusBarsPadding()
.navigationBarsPadding(),
) {
πŸ€– Prompt for AI Agents
In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt`
around lines 94 - 98, The outer Column in HomeScreen (the composable using
Modifier.fillMaxSize().background(DmsTheme.colorScheme.background).statusBarsPadding())
is missing bottom inset handling; update its modifier chain to also call
navigationBarsPadding() so the bottom action buttons aren't overlapped by
gesture/navigation barsβ€”i.e., locate the Column in HomeScreen.kt and append
.navigationBarsPadding() to the existing modifier chain (preserving
.statusBarsPadding()) to match MyPageScreen/ApplicationScreen.

Comment on lines 99 to 103
val pointHistoryList = remember(page, state.allPointList) {
when (tabData[page]) {
PointTab.All -> state.allPointList
PointTab.BONUS -> state.plusPointList
PointTab.Bonus -> state.bonusPointList
PointTab.Minus -> state.minusPointList
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 stale list risk by removing or widening remember keys.
If bonusPointList or minusPointList updates without allPointList changing, the UI can keep showing stale data due to the current remember keys.

βœ… Proposed fix (remove unnecessary remember)
-                val pointHistoryList = remember(page, state.allPointList) {
-                    when (tabData[page]) {
-                        PointTab.All -> state.allPointList
-                        PointTab.Bonus -> state.bonusPointList
-                        PointTab.Minus -> state.minusPointList
-                    }
-                }
+                val pointHistoryList =
+                    when (tabData[page]) {
+                        PointTab.All -> state.allPointList
+                        PointTab.Bonus -> state.bonusPointList
+                        PointTab.Minus -> state.minusPointList
+                    }
πŸ€– Prompt for AI Agents
In
`@feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt`
around lines 99 - 103, The current remember call that computes pointHistoryList
using keys (page, state.allPointList) can return stale data when
state.bonusPointList or state.minusPointList change; update the computation in
PointHistoryScreen by either removing the remember (compute pointHistoryList
directly) or expanding the remember keys to include state.bonusPointList and
state.minusPointList and tabData[page], so that pointHistoryList reacts to
changes; locate the remember invocation that assigns pointHistoryList and modify
it accordingly (symbols: pointHistoryList, remember, tabData,
PointTab.All/Bonus/Minus,
state.allPointList/state.bonusPointList/state.minusPointList).

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

πŸ€– Fix all issues with AI agents
In @.github/workflows/ci.yml:
- Around line 37-40: In the "Create google-services.json" step, stop using
unquoted echo and the hardcoded absolute path; instead write the secret safely
with a quoted printf to preserve newlines/whitespace (use printf '%s\n' "$DATA")
and redirect into a path built from the $GITHUB_WORKSPACE variable (quote the
destination like "$GITHUB_WORKSPACE/.../app/google-services.json"), ensuring
DATA is referenced as "$DATA" and the destination is quoted for portability.

@uson1004 uson1004 merged commit e7aa006 into develop Feb 3, 2026
0 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

performance μ„±λŠ₯을 κ°œμ„  ν•  경우 refactor μ½”λ“œ λ¦¬νŒ©ν† λ§ ν•  경우

Projects

None yet

Development

Successfully merging this pull request may close these issues.

λ‹€ν¬ν…Œλ§ˆ μ‹œ μ•„μ΄μ½˜ 컬러 λŒ€λΉ„ ν•΄κ²°

1 participant