From a2ccc40d567855d81e5ff6fa540d9bb488d1faf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Tue, 20 Jan 2026 16:28:00 +0900 Subject: [PATCH 01/19] =?UTF-8?q?refactor=20::=20=EB=B0=94=ED=85=80=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=83=89=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A7=80=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/kotlin/team/aliens/dms/android/app/DmsApp.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt b/app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt index 364430415..e30e1de56 100644 --- a/app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt +++ b/app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt @@ -5,8 +5,11 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.windowsizeclass.WindowSizeClass @@ -130,10 +133,10 @@ fun DmsApp( } Box( - modifier = Modifier.fillMaxSize() + modifier = Modifier + .fillMaxSize(), ) { Scaffold( - contentWindowInsets = WindowInsets(0), bottomBar = { if (shouldShowBottomBar) { BottomNavigationBar( @@ -154,12 +157,12 @@ fun DmsApp( } ) } - } + }, + contentWindowInsets = WindowInsets(0), ) { paddingValues -> CompositionLocalProvider(LocalResultStore provides resultStore) { NavDisplay( modifier = Modifier - .background(DmsTheme.colorScheme.surfaceTint) .padding(paddingValues), backStack = backStack, onBack = { backStack.removeLastOrNull() }, From 4587179f81e797027543bf1ead694831f19a01ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Tue, 20 Jan 2026 16:29:05 +0900 Subject: [PATCH 02/19] =?UTF-8?q?refactor=20::=20point=20type=20BONUS=20->?= =?UTF-8?q?=20PLUS=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/model/PointType.kt | 2 +- .../feature/main/home/ui/HomeScreen.kt | 4 +- .../main/mypage/ui/component/PointCards.kt | 10 +-- .../notification/ui/NotificationScreen.kt | 61 +------------ .../notification/ui/component/NoticeItem.kt | 85 +++++++++++++++++++ .../feature/point/ui/PointHistoryScreen.kt | 6 +- .../feature/point/ui/component/PointItem.kt | 2 +- .../point/viewmodel/PointHistoryViewModel.kt | 4 +- 8 files changed, 100 insertions(+), 74 deletions(-) create mode 100644 feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt index f1e07406b..9708ce1ff 100644 --- a/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt @@ -1,6 +1,6 @@ package team.aliens.dms.android.data.point.model enum class PointType { - ALL, BONUS, MINUS, + ALL, PLUS, MINUS, ; } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt index ed78a6b77..9764ba3c0 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -85,8 +86,7 @@ private fun HomeScreen( modifier = Modifier .fillMaxSize() .background(DmsTheme.colorScheme.background) - .systemBarsPadding() - .navigationBarsPadding(), + .statusBarsPadding(), ) { HomeTopAppBar( onOutingPassClick = onOutingPassClick, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt index b69caf40b..e3d62bdbb 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt @@ -23,7 +23,7 @@ import team.aliens.dms.android.data.point.model.PointType @Composable internal fun PointCards( modifier: Modifier = Modifier, - bonusPoint: Int, + PLUSPoint: Int, minusPoint: Int, onNavigatePointHistory: (PointType) -> Unit, ) { @@ -33,9 +33,9 @@ internal fun PointCards( ) { PointCard( modifier = Modifier.weight(1f), - point = bonusPoint, - pointType = PointType.BONUS, - onClick = { onNavigatePointHistory(PointType.BONUS) }, + point = PLUSPoint, + pointType = PointType.PLUS, + onClick = { onNavigatePointHistory(PointType.PLUS) }, ) PointCard( modifier = Modifier.weight(1f), @@ -54,7 +54,7 @@ private fun PointCard( onClick: () -> Unit, ) { val (text, textColor, backgroundColor) = when (pointType) { - PointType.BONUS -> Triple("상점", DmsTheme.colorScheme.secondary, DmsTheme.colorScheme.primary) + PointType.PLUS -> Triple("상점", DmsTheme.colorScheme.secondary, DmsTheme.colorScheme.primary) PointType.MINUS -> Triple("벌점", DmsTheme.colorScheme.onErrorContainer, DmsTheme.colorScheme.error) else -> Triple("", DmsTheme.colorScheme.onSurface, DmsTheme.colorScheme.surface) } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt index 635d1a722..eb7afc49b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt @@ -44,6 +44,7 @@ import team.aliens.dms.android.core.designsystem.tab.DmsTabRow import team.aliens.dms.android.core.designsystem.topPadding import team.aliens.dms.android.core.designsystem.util.clickable import team.aliens.dms.android.data.point.model.PointType +import team.aliens.dms.android.feature.notification.ui.component.NoticeItem import team.aliens.dms.android.feature.notification.viewmodel.NotificationSideEffect import team.aliens.dms.android.feature.notification.viewmodel.NotificationViewModel import team.aliens.dms.android.feature.notification.viewmodel.NotificationState @@ -256,63 +257,3 @@ internal fun NotificationItem( ) } } - - -@Composable -internal fun NoticeItem( - modifier: Modifier = Modifier, - notice: NotificationUi, - onNotificationDetailClick: (UUID, UUID) -> Unit, -) { - Row( - modifier = modifier - .fillMaxWidth() - .clickable(onClick = { onNotificationDetailClick(notice.linkId, notice.id) }) - .padding(horizontal = 24.dp, vertical = 22.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(DmsIcon.Notice), - tint = DmsTheme.colorScheme.scrim, - contentDescription = null, - ) - Column( - modifier = modifier.startPadding(12.dp), - ) { - Text( - text = notice.title, - style = DmsTheme.typography.bodyM, - ) - Row( - modifier = modifier.topPadding(6.dp) - ) { - if (!notice.isRead) { - Icon( - modifier = modifier.size(4.dp), - imageVector = Icons.Filled.Circle, - contentDescription = null, - tint = DmsTheme.colorScheme.primaryContainer, - ) - } - Text( - modifier = modifier - .startPadding(4.dp), - text = notice.content, - style = DmsTheme.typography.labelM, - ) - } - } - Spacer(modifier = modifier.weight(1f)) - Text( - modifier = Modifier.padding(horizontal = 10.dp), - text = notice.elapsedText, - style = DmsTheme.typography.bodyM, - color = DmsTheme.colorScheme.inverseSurface, - ) - Icon( - painter = painterResource(DmsIcon.Forward), - tint = DmsTheme.colorScheme.scrim, - contentDescription = null, - ) - } -} diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt new file mode 100644 index 000000000..ac6f6b9a4 --- /dev/null +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt @@ -0,0 +1,85 @@ +package team.aliens.dms.android.feature.notification.ui.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Circle +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import team.aliens.dms.android.core.designsystem.DmsTheme +import team.aliens.dms.android.core.designsystem.bodyM +import team.aliens.dms.android.core.designsystem.foundation.DmsIcon +import team.aliens.dms.android.core.designsystem.labelM +import team.aliens.dms.android.core.designsystem.startPadding +import team.aliens.dms.android.core.designsystem.topPadding +import team.aliens.dms.android.core.designsystem.util.clickable +import team.aliens.dms.android.feature.notification.viewmodel.NotificationUi +import java.util.UUID + +@Composable +internal fun NoticeItem( + modifier: Modifier = Modifier, + notice: NotificationUi, + onNotificationDetailClick: (UUID, UUID) -> Unit, +) { + Row( + modifier = modifier + .fillMaxWidth() + .clickable(onClick = { onNotificationDetailClick(notice.linkId, notice.id) }) + .padding(horizontal = 24.dp, vertical = 22.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(DmsIcon.Notice), + tint = DmsTheme.colorScheme.scrim, + contentDescription = null, + ) + Column( + modifier = modifier.startPadding(12.dp), + ) { + Text( + text = notice.title, + style = DmsTheme.typography.bodyM, + ) + Row( + modifier = modifier.topPadding(6.dp) + ) { + if (!notice.isRead) { + Icon( + modifier = modifier.size(4.dp), + imageVector = Icons.Filled.Circle, + contentDescription = null, + tint = DmsTheme.colorScheme.primaryContainer, + ) + } + Text( + modifier = modifier + .startPadding(4.dp), + text = notice.content, + style = DmsTheme.typography.labelM, + ) + } + } + Spacer(modifier = modifier.weight(1f)) + Text( + modifier = Modifier.padding(horizontal = 10.dp), + text = notice.elapsedText, + style = DmsTheme.typography.bodyM, + color = DmsTheme.colorScheme.inverseSurface, + ) + Icon( + painter = painterResource(DmsIcon.Forward), + tint = DmsTheme.colorScheme.scrim, + contentDescription = null, + ) + } +} diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt index 26d4c95de..b6044f527 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt @@ -62,7 +62,7 @@ private fun PointHistoryScreen( ) val tabData = listOf( PointTab.All, - PointTab.BONUS, + PointTab.PLUS, PointTab.Minus, ) val pagerState = rememberPagerState( @@ -99,7 +99,7 @@ private fun PointHistoryScreen( val pointHistoryList = remember(page, state.allPointList) { when (tabData[page]) { PointTab.All -> state.allPointList - PointTab.BONUS -> state.plusPointList + PointTab.PLUS -> state.plusPointList PointTab.Minus -> state.minusPointList } } @@ -129,6 +129,6 @@ internal sealed class PointTab( val pointType: PointType, ) { data object All : PointTab(title = "전체", pointType = PointType.ALL) - data object BONUS : PointTab(title = "상점", pointType = PointType.BONUS) + data object PLUS : PointTab(title = "상점", pointType = PointType.PLUS) data object Minus : PointTab(title = "벌점", pointType = PointType.MINUS) } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt index 38fb8ce94..b340d5747 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt @@ -44,7 +44,7 @@ internal fun PointItem( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), ) { - val (backgroundColor, icon, pointColor) = if (pointType == PointType.BONUS) { + val (backgroundColor, icon, pointColor) = if (pointType == PointType.PLUS) { Triple( DmsTheme.colorScheme.onPrimary, R.drawable.ic_plus, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt index ec6240fef..111060049 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt @@ -27,12 +27,12 @@ internal class PointHistoryViewModel @Inject constructor( size = null, ).onSuccess { pointHistory -> val pointHistories = pointHistory.points - val bonusPoints = pointHistories.filter { it.type == PointType.BONUS } + val plusPoints = pointHistories.filter { it.type == PointType.PLUS } val minusPoints = pointHistories.filter { it.type == PointType.MINUS } setState { it.copy( allPointList = pointHistories, - plusPointList = bonusPoints, + plusPointList = plusPoints, minusPointList = minusPoints, ) } From db03d5c932f9e118844091d0ad56195c576e3953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Tue, 20 Jan 2026 16:32:27 +0900 Subject: [PATCH 03/19] =?UTF-8?q?chore=20::=20=EC=95=88=20=EC=93=B0?= =?UTF-8?q?=EC=9D=B4=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/model/NotificationTopicGroup.kt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 network/src/dev/kotlin/team.aliens.dms.android.network/notification/model/NotificationTopicGroup.kt diff --git a/network/src/dev/kotlin/team.aliens.dms.android.network/notification/model/NotificationTopicGroup.kt b/network/src/dev/kotlin/team.aliens.dms.android.network/notification/model/NotificationTopicGroup.kt deleted file mode 100644 index c144aafe5..000000000 --- a/network/src/dev/kotlin/team.aliens.dms.android.network/notification/model/NotificationTopicGroup.kt +++ /dev/null @@ -1,6 +0,0 @@ -package team.aliens.dms.android.network.notification.model - -enum class NotificationTopicGroup { - NOTICE, STUDY_ROOM, - ; -} From 49ce51e98f15400602374993e250f008c522b6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:00:01 +0900 Subject: [PATCH 04/19] =?UTF-8?q?refactor=20::=20pointType=20PLUS=20->=20B?= =?UTF-8?q?ONUS=20=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/model/PointType.kt | 2 +- .../android/feature/main/home/model/DmsPointCotent.kt | 6 +++--- .../dms/android/feature/main/home/ui/HomeScreen.kt | 5 +++-- .../dms/android/feature/main/mypage/ui/MyPageScreen.kt | 2 +- .../feature/main/mypage/ui/component/PointCards.kt | 10 +++++----- .../dms/android/feature/point/ui/PointHistoryScreen.kt | 6 +++--- .../android/feature/point/ui/component/PointItem.kt | 2 +- .../feature/point/viewmodel/PointHistoryViewModel.kt | 6 +++--- 8 files changed, 20 insertions(+), 19 deletions(-) diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt index 9708ce1ff..f1e07406b 100644 --- a/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/point/model/PointType.kt @@ -1,6 +1,6 @@ package team.aliens.dms.android.data.point.model enum class PointType { - ALL, PLUS, MINUS, + ALL, BONUS, MINUS, ; } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt index 71368be15..151182c6e 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/DmsPointCotent.kt @@ -25,7 +25,7 @@ import team.aliens.dms.android.core.designsystem.foundation.DmsIcon @Composable fun DmsPointContent( modifier: Modifier = Modifier, - plusPoint: Int, + bonusPoint: Int, minusPoint: Int, ) { Column( @@ -49,7 +49,7 @@ fun DmsPointContent( buttonColor = DmsTheme.colorScheme.onSurface, icon = DmsIcon.Equal, title = "총점", - point = plusPoint - minusPoint, + point = bonusPoint - minusPoint, ) PointItem( modifier = Modifier.padding(top = 12.dp), @@ -57,7 +57,7 @@ fun DmsPointContent( buttonColor = DmsTheme.colorScheme.primary, icon = DmsIcon.Plus, title = "상점", - point = plusPoint, + point = bonusPoint, ) PointItem( modifier = Modifier.padding(top = 12.dp), diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt index 9764ba3c0..eb208b88b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt @@ -102,7 +102,8 @@ private fun HomeScreen( modifier = Modifier .fillMaxWidth() .padding(start = 4.dp), - onClick = { onNavigateNoticeDetail(state.noticeId) }, + title = state.latestNotice.title, + onClick = { onNavigateNoticeDetail(state.latestNotice.id) }, ) MealContent( modifier = Modifier @@ -115,7 +116,7 @@ private fun HomeScreen( modifier = Modifier .fillMaxWidth() .padding(top = 20.dp), - plusPoint = state.myPage.bonusPoint, + bonusPoint = state.myPage.bonusPoint, minusPoint = state.myPage.minusPoint, ) DmsItemButton( diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt index f6ee823bb..e29aff389 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/MyPageScreen.kt @@ -101,7 +101,7 @@ private fun MyPageScreen( ) DmsPointContent( modifier = Modifier, - plusPoint = state.myPage.bonusPoint, + bonusPoint = state.myPage.bonusPoint, minusPoint = state.myPage.minusPoint, ) DmsItemButton( diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt index e3d62bdbb..b69caf40b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/mypage/ui/component/PointCards.kt @@ -23,7 +23,7 @@ import team.aliens.dms.android.data.point.model.PointType @Composable internal fun PointCards( modifier: Modifier = Modifier, - PLUSPoint: Int, + bonusPoint: Int, minusPoint: Int, onNavigatePointHistory: (PointType) -> Unit, ) { @@ -33,9 +33,9 @@ internal fun PointCards( ) { PointCard( modifier = Modifier.weight(1f), - point = PLUSPoint, - pointType = PointType.PLUS, - onClick = { onNavigatePointHistory(PointType.PLUS) }, + point = bonusPoint, + pointType = PointType.BONUS, + onClick = { onNavigatePointHistory(PointType.BONUS) }, ) PointCard( modifier = Modifier.weight(1f), @@ -54,7 +54,7 @@ private fun PointCard( onClick: () -> Unit, ) { val (text, textColor, backgroundColor) = when (pointType) { - PointType.PLUS -> Triple("상점", DmsTheme.colorScheme.secondary, DmsTheme.colorScheme.primary) + PointType.BONUS -> Triple("상점", DmsTheme.colorScheme.secondary, DmsTheme.colorScheme.primary) PointType.MINUS -> Triple("벌점", DmsTheme.colorScheme.onErrorContainer, DmsTheme.colorScheme.error) else -> Triple("", DmsTheme.colorScheme.onSurface, DmsTheme.colorScheme.surface) } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt index b6044f527..8ff542d4b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/PointHistoryScreen.kt @@ -62,7 +62,7 @@ private fun PointHistoryScreen( ) val tabData = listOf( PointTab.All, - PointTab.PLUS, + PointTab.Bonus, PointTab.Minus, ) val pagerState = rememberPagerState( @@ -99,7 +99,7 @@ private fun PointHistoryScreen( val pointHistoryList = remember(page, state.allPointList) { when (tabData[page]) { PointTab.All -> state.allPointList - PointTab.PLUS -> state.plusPointList + PointTab.Bonus -> state.bonusPointList PointTab.Minus -> state.minusPointList } } @@ -129,6 +129,6 @@ internal sealed class PointTab( val pointType: PointType, ) { data object All : PointTab(title = "전체", pointType = PointType.ALL) - data object PLUS : PointTab(title = "상점", pointType = PointType.PLUS) + data object Bonus : PointTab(title = "상점", pointType = PointType.BONUS) data object Minus : PointTab(title = "벌점", pointType = PointType.MINUS) } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt index b340d5747..38fb8ce94 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/ui/component/PointItem.kt @@ -44,7 +44,7 @@ internal fun PointItem( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), ) { - val (backgroundColor, icon, pointColor) = if (pointType == PointType.PLUS) { + val (backgroundColor, icon, pointColor) = if (pointType == PointType.BONUS) { Triple( DmsTheme.colorScheme.onPrimary, R.drawable.ic_plus, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt index 111060049..31b9e58e2 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/point/viewmodel/PointHistoryViewModel.kt @@ -27,12 +27,12 @@ internal class PointHistoryViewModel @Inject constructor( size = null, ).onSuccess { pointHistory -> val pointHistories = pointHistory.points - val plusPoints = pointHistories.filter { it.type == PointType.PLUS } + val bonusPoints = pointHistories.filter { it.type == PointType.BONUS } val minusPoints = pointHistories.filter { it.type == PointType.MINUS } setState { it.copy( allPointList = pointHistories, - plusPointList = plusPoints, + bonusPointList = bonusPoints, minusPointList = minusPoints, ) } @@ -47,7 +47,7 @@ internal class PointHistoryViewModel @Inject constructor( internal data class PointHistoryState( val allPointList: List = emptyList(), - val plusPointList: List = emptyList(), + val bonusPointList: List = emptyList(), val minusPointList: List = emptyList(), val initialTab: Int = 0, ) From 127a94e0a7327130498fca82fa71afc0c489b0d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:00:22 +0900 Subject: [PATCH 05/19] =?UTF-8?q?feat=20::=20=EA=B0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=B5=9C=EA=B7=BC=20=EA=B3=B5=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/apiservice/NoticeApiService.kt | 5 +++++ .../notice/datasource/NetworkNoticeDataSource.kt | 3 +++ .../notice/datasource/NetworkNoticeDataSourceImpl.kt | 4 ++++ .../notice/model/FetchLatestNoticeResponse.kt | 9 +++++++++ 4 files changed, 21 insertions(+) create mode 100644 network/src/dev/kotlin/team.aliens.dms.android.network/notice/model/FetchLatestNoticeResponse.kt diff --git a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/apiservice/NoticeApiService.kt b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/apiservice/NoticeApiService.kt index c4267c523..99c51114b 100644 --- a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/apiservice/NoticeApiService.kt +++ b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/apiservice/NoticeApiService.kt @@ -4,6 +4,7 @@ import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query import team.aliens.dms.android.core.jwt.RequiresAccessToken +import team.aliens.dms.android.network.notice.model.FetchLatestNoticeResponse import team.aliens.dms.android.network.notice.model.FetchNoticeDetailsResponse import team.aliens.dms.android.network.notice.model.FetchNoticesResponse import team.aliens.dms.android.network.notice.model.FetchWhetherNewNoticesExistResponse @@ -22,4 +23,8 @@ internal interface NoticeApiService { @GET("/notices") @RequiresAccessToken suspend fun fetchNotices(@Query("order") order: String): FetchNoticesResponse + + @GET("/notices/latest") + @RequiresAccessToken + suspend fun fetchLatestNotice(): FetchLatestNoticeResponse } diff --git a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSource.kt b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSource.kt index fe5133329..f114c7f16 100644 --- a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSource.kt +++ b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSource.kt @@ -1,5 +1,6 @@ package team.aliens.dms.android.network.notice.datasource +import team.aliens.dms.android.network.notice.model.FetchLatestNoticeResponse import team.aliens.dms.android.network.notice.model.FetchNoticeDetailsResponse import team.aliens.dms.android.network.notice.model.FetchNoticesResponse import team.aliens.dms.android.network.notice.model.FetchWhetherNewNoticesExistResponse @@ -12,4 +13,6 @@ abstract class NetworkNoticeDataSource { abstract suspend fun fetchNotices(order: String): Result abstract suspend fun fetchNoticeDetails(noticeId: UUID): Result + + abstract suspend fun fetchLatestNotice(): Result } diff --git a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSourceImpl.kt b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSourceImpl.kt index c43e4120b..a4916b1a0 100644 --- a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSourceImpl.kt +++ b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/datasource/NetworkNoticeDataSourceImpl.kt @@ -1,5 +1,6 @@ package team.aliens.dms.android.network.notice.datasource import team.aliens.dms.android.network.notice.apiservice.NoticeApiService +import team.aliens.dms.android.network.notice.model.FetchLatestNoticeResponse import team.aliens.dms.android.network.notice.model.FetchNoticeDetailsResponse import team.aliens.dms.android.network.notice.model.FetchNoticesResponse import team.aliens.dms.android.network.notice.model.FetchWhetherNewNoticesExistResponse @@ -18,4 +19,7 @@ internal class NetworkNoticeDataSourceImpl @Inject constructor( override suspend fun fetchNoticeDetails(noticeId: UUID): Result = suspendRunCatching { noticeApiService.fetchNoticeDetails(noticeId) } + + override suspend fun fetchLatestNotice(): Result = + suspendRunCatching { noticeApiService.fetchLatestNotice() } } diff --git a/network/src/dev/kotlin/team.aliens.dms.android.network/notice/model/FetchLatestNoticeResponse.kt b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/model/FetchLatestNoticeResponse.kt new file mode 100644 index 000000000..2cad70e7c --- /dev/null +++ b/network/src/dev/kotlin/team.aliens.dms.android.network/notice/model/FetchLatestNoticeResponse.kt @@ -0,0 +1,9 @@ +package team.aliens.dms.android.network.notice.model + +import com.google.gson.annotations.SerializedName +import java.util.UUID + +data class FetchLatestNoticeResponse( + @SerializedName("id") val id: UUID, + @SerializedName("title") val title: String, +) From 31a7c2c6ab1c1688f84f212e483f3f0cee3bcb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:01:29 +0900 Subject: [PATCH 06/19] =?UTF-8?q?feat=20::=20=EA=B0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=20=EA=B3=B5=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?repositoy=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/mapper/NoticeMapper.kt | 7 +++++++ .../notice/model/LatestNotice.kt | 8 ++++++++ .../notice/repository/NoticeRepository.kt | 4 ++++ .../notice/repository/NoticeRepositoryImpl.kt | 5 +++++ 4 files changed, 24 insertions(+) create mode 100644 data/src/dev/kotlin/team.aliens.dms.android.data/notice/model/LatestNotice.kt diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/mapper/NoticeMapper.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/mapper/NoticeMapper.kt index 6b13be2aa..0a4ae8e2e 100644 --- a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/mapper/NoticeMapper.kt +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/mapper/NoticeMapper.kt @@ -1,7 +1,9 @@ package team.aliens.dms.android.data.notice.mapper import team.aliens.dms.android.core.database.entity.NoticeEntity +import team.aliens.dms.android.data.notice.model.LatestNotice import team.aliens.dms.android.data.notice.model.Notice +import team.aliens.dms.android.network.notice.model.FetchLatestNoticeResponse import team.aliens.dms.android.network.notice.model.FetchNoticeDetailsResponse import team.aliens.dms.android.network.notice.model.FetchNoticesResponse import team.aliens.dms.android.shared.date.toLocalDateTime @@ -31,3 +33,8 @@ internal fun FetchNoticeDetailsResponse.toModel(): Notice = Notice( content = this.content, createdAt = this.createdAt.toLocalDateTime(), ) + +internal fun FetchLatestNoticeResponse.toModel(): LatestNotice = LatestNotice( + id = this.id, + title = this.title, +) diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/model/LatestNotice.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/model/LatestNotice.kt new file mode 100644 index 000000000..61a980129 --- /dev/null +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/model/LatestNotice.kt @@ -0,0 +1,8 @@ +package team.aliens.dms.android.data.notice.model + +import java.util.UUID + +data class LatestNotice( + val id: UUID? = null, + val title: String = "", +) diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepository.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepository.kt index 6fd773934..4a7b4528a 100644 --- a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepository.kt +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepository.kt @@ -1,6 +1,8 @@ package team.aliens.dms.android.data.notice.repository +import team.aliens.dms.android.data.notice.model.LatestNotice import team.aliens.dms.android.data.notice.model.Notice +import team.aliens.dms.android.network.notice.model.FetchLatestNoticeResponse import team.aliens.dms.android.shared.model.Order import java.util.UUID @@ -11,4 +13,6 @@ abstract class NoticeRepository { abstract suspend fun fetchNoticeDetails(noticeId: UUID): Result abstract suspend fun fetchNotices(order: Order = Order.NEW): Result> + + abstract suspend fun fetchLatestNotice(): Result } diff --git a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepositoryImpl.kt b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepositoryImpl.kt index 9c44720cd..b707316fa 100644 --- a/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepositoryImpl.kt +++ b/data/src/dev/kotlin/team.aliens.dms.android.data/notice/repository/NoticeRepositoryImpl.kt @@ -1,6 +1,7 @@ package team.aliens.dms.android.data.notice.repository import team.aliens.dms.android.data.notice.mapper.toModel +import team.aliens.dms.android.data.notice.model.LatestNotice import team.aliens.dms.android.data.notice.model.Notice import team.aliens.dms.android.network.notice.datasource.NetworkNoticeDataSource import team.aliens.dms.android.shared.model.Order @@ -22,4 +23,8 @@ internal class NoticeRepositoryImpl @Inject constructor( override suspend fun fetchNotices(order: Order): Result> = networkNoticeDataSource.fetchNotices(order.name) .map { it.toModel() } + + override suspend fun fetchLatestNotice(): Result = + networkNoticeDataSource.fetchLatestNotice() + .map { it.toModel() } } From 8983c87c5d33d7e68bd44e16caf133142e8c0529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:02:11 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feat=20::=20=EA=B0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=B5=9C=EA=B7=BC=20=EA=B3=B5=EC=A7=80=20ui=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/application/ui/ApplicationScreen.kt | 17 +++++++++++++++++ .../main/home/model/AnnouncementButton.kt | 3 ++- .../main/home/viewmodel/HomeViewModel.kt | 17 +++++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt index 1420fb31b..7d125ac2c 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/application/ui/ApplicationScreen.kt @@ -1,13 +1,17 @@ package team.aliens.dms.android.feature.main.application.ui +import android.R import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -15,10 +19,12 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.launch import team.aliens.dms.android.core.designsystem.DmsTheme +import team.aliens.dms.android.core.designsystem.bodyM import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBarType import team.aliens.dms.android.core.designsystem.tab.DmsTab import team.aliens.dms.android.core.designsystem.tab.DmsTabRow @@ -120,6 +126,17 @@ private fun ApplicationScreen( onNavigateVolunteerApplication = onNavigateVolunteerApplication, ) } else { + if (state.votes.isEmpty()) { + Text( + text = """ + 예정된 투표가 없습니다. + 결과를 확인하시고 싶으시면 알림함을 확인해주세요! + """.trimIndent(), + style = DmsTheme.typography.bodyM, + color = DmsTheme.colorScheme.inverseSurface, + textAlign = TextAlign.Center, + ) + } VoteContent( votes = state.votes, onNavigateVote = onNavigateVote, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt index e5f1ec07a..c610228a4 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/model/AnnouncementButton.kt @@ -23,6 +23,7 @@ import team.aliens.dms.android.core.designsystem.util.clickable @Composable internal fun AnnouncementButton( modifier: Modifier = Modifier, + title: String, onClick: () -> Unit, ) { Row( @@ -47,7 +48,7 @@ internal fun AnnouncementButton( ) Text( modifier = Modifier.padding(start = 8.dp), - text = "새로운 공지사항을 확인하세요", + text = title, style = DmsTheme.typography.labelM, color = DmsTheme.colorScheme.inverseSurface, ) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt index 94fdbeca9..d3a6cf236 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt @@ -5,6 +5,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import team.aliens.dms.android.core.ui.viewmodel.BaseStateViewModel +import team.aliens.dms.android.data.notice.model.LatestNotice +import team.aliens.dms.android.data.notice.repository.NoticeRepository import team.aliens.dms.android.data.student.model.MyPage import team.aliens.dms.android.data.student.repository.StudentRepository import java.util.UUID @@ -13,10 +15,12 @@ import javax.inject.Inject @HiltViewModel internal class HomeViewModel @Inject constructor( val studentRepository: StudentRepository, + val noticeRepository: NoticeRepository ) : BaseStateViewModel(HomeState()) { init { getMyPage() + getLatestNotice() } private fun getMyPage() { @@ -29,15 +33,24 @@ internal class HomeViewModel @Inject constructor( } } + private fun getLatestNotice() { + viewModelScope.launch(Dispatchers.IO) { + noticeRepository.fetchLatestNotice().onSuccess { latestNotice -> + setState { + it.copy(latestNotice = latestNotice) + } + } + } + } + internal fun showOutingPassDialog() { sendEffect(HomeSideEffect.ShowOutingPassDialog) } } internal data class HomeState( - val newNoticesExist: Boolean = false, val myPage: MyPage = MyPage(), - val noticeId: UUID? = null + val latestNotice: LatestNotice = LatestNotice(), ) internal sealed interface HomeSideEffect { From 6cfcbca16b9c06074713ec00b3f6d0a1a31d5165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:02:48 +0900 Subject: [PATCH 08/19] =?UTF-8?q?chore=20::=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/notification/navigation/NotificationRoute.kt | 6 +++--- .../android/feature/notification/ui/NotificationScreen.kt | 6 +++--- .../resetpassword/viewmodel/ResetPasswordViewModel.kt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/navigation/NotificationRoute.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/navigation/NotificationRoute.kt index 7064b9fb8..ac1ee1899 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/navigation/NotificationRoute.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/navigation/NotificationRoute.kt @@ -3,7 +3,7 @@ package team.aliens.dms.android.feature.notification.navigation import androidx.compose.runtime.Composable import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBarType import team.aliens.dms.android.data.point.model.PointType -import team.aliens.dms.android.feature.notification.ui.NotificationScreen +import team.aliens.dms.android.feature.notification.ui.Notification import java.util.UUID @Composable @@ -13,10 +13,10 @@ fun NotificationRoute( onNavigatePointHistory: (PointType) -> Unit, onShowSnackBar: (DmsSnackBarType, String) -> Unit, ) { - NotificationScreen( + Notification( onBackClick = onBackClick, onNavigateNotificationDetailClick = onNavigateNotificationDetailClick, onNavigatePointHistory = onNavigatePointHistory, - onShowSnackBar = onShowSnackBar + onShowSnackBar = onShowSnackBar, ) } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt index eb7afc49b..ebfe5804b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt @@ -52,7 +52,7 @@ import team.aliens.dms.android.feature.notification.viewmodel.NotificationUi import java.util.UUID @Composable -internal fun NotificationScreen( +internal fun Notification( onBackClick: () -> Unit, onNavigateNotificationDetailClick: (UUID) -> Unit, onNavigatePointHistory: (PointType) -> Unit, @@ -84,7 +84,7 @@ internal fun NotificationScreen( } } - NotificationScreenContent( + NotificationScreen( state = state, tabData = tabData.toPersistentList(), pagerState = pagerState, @@ -107,7 +107,7 @@ internal fun NotificationScreen( } @Composable -private fun NotificationScreenContent( +private fun NotificationScreen( state: NotificationState, tabData: ImmutableList, pagerState: PagerState, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/resetpassword/viewmodel/ResetPasswordViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/resetpassword/viewmodel/ResetPasswordViewModel.kt index 6fe40c90a..6c063cfb6 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/resetpassword/viewmodel/ResetPasswordViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/resetpassword/viewmodel/ResetPasswordViewModel.kt @@ -10,7 +10,7 @@ import javax.inject.Inject @HiltViewModel class ResetPasswordViewModel @Inject constructor( - private val userRepository: UserRepository + private val userRepository: UserRepository, ): BaseStateViewModel(ResetPasswordState()) { internal fun setNewPassword(password: String) { From 25ced3da45ebdd11ee0289115665a9dcabc49a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:03:58 +0900 Subject: [PATCH 09/19] =?UTF-8?q?refactor=20::=20core=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20datastore=20=EB=B9=8C=EB=93=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/device/build.gradle.kts | 11 +++++ .../datastore/DeviceDataStoreDataSource.kt | 0 .../DeviceDataStoreDataSourceImpl.kt | 0 .../device/datastore/store/DeviceStore.kt | 0 .../device/datastore/store/DeviceStoreImpl.kt | 0 .../CannotStoreDeviceTokenException.kt | 0 .../store/exception/TokenNotFoundException.kt | 0 .../core/device/di/DataSourceModule.kt | 0 .../dms/android/core/device/di/StoreModule.kt | 0 core/device/src/main/AndroidManifest.xml | 4 -- .../datastore/DeviceDataStoreDataSource.kt | 10 +++++ .../DeviceDataStoreDataSourceImpl.kt | 17 ++++++++ .../device/datastore/store/DeviceStore.kt | 10 +++++ .../device/datastore/store/DeviceStoreImpl.kt | 42 +++++++++++++++++++ .../CannotStoreDeviceTokenException.kt | 5 +++ .../store/exception/TokenNotFoundException.kt | 7 ++++ .../core/device/di/DataSourceModule.kt | 18 ++++++++ .../dms/android/core/device/di/StoreModule.kt | 18 ++++++++ 18 files changed, 138 insertions(+), 4 deletions(-) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/di/DataSourceModule.kt (100%) rename core/device/src/{main/java => dev/kotlin}/team/aliens/dms/android/core/device/di/StoreModule.kt (100%) delete mode 100644 core/device/src/main/AndroidManifest.xml create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt create mode 100644 core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt diff --git a/core/device/build.gradle.kts b/core/device/build.gradle.kts index 137dd4116..254a632c6 100644 --- a/core/device/build.gradle.kts +++ b/core/device/build.gradle.kts @@ -35,6 +35,17 @@ android { kotlinOptions { jvmTarget = Versions.java.toString() } + + flavorDimensions += "environment" + + productFlavors { + create("dev") { + dimension = "environment" + } + create("prod") { + dimension = "environment" + } + } } dependencies { diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/di/DataSourceModule.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/di/DataSourceModule.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt diff --git a/core/device/src/main/java/team/aliens/dms/android/core/device/di/StoreModule.kt b/core/device/src/dev/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt similarity index 100% rename from core/device/src/main/java/team/aliens/dms/android/core/device/di/StoreModule.kt rename to core/device/src/dev/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt diff --git a/core/device/src/main/AndroidManifest.xml b/core/device/src/main/AndroidManifest.xml deleted file mode 100644 index a5918e68a..000000000 --- a/core/device/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt new file mode 100644 index 000000000..71ba259fc --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSource.kt @@ -0,0 +1,10 @@ +package team.aliens.dms.android.core.device.datastore + +abstract class DeviceDataStoreDataSource { + + abstract suspend fun loadDeviceToken(): String + + abstract suspend fun storeDeviceToken(deviceToken: String) + + abstract suspend fun clearDeviceToken() +} diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt new file mode 100644 index 000000000..08b2633e7 --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/DeviceDataStoreDataSourceImpl.kt @@ -0,0 +1,17 @@ +package team.aliens.dms.android.core.device.datastore + +import team.aliens.dms.android.core.device.datastore.store.DeviceStore +import team.aliens.dms.android.shared.exception.util.suspendRunCatching +import javax.inject.Inject + +internal class DeviceDataStoreDataSourceImpl @Inject constructor( + private val deviceStore: DeviceStore, +) : DeviceDataStoreDataSource() { + override suspend fun loadDeviceToken(): String = deviceStore.loadDeviceToken() + + override suspend fun storeDeviceToken(deviceToken: String) = + deviceStore.storeDeviceToken(deviceToken) + + override suspend fun clearDeviceToken() = + deviceStore.clearDeviceToken() +} diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt new file mode 100644 index 000000000..ac641c0e9 --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStore.kt @@ -0,0 +1,10 @@ +package team.aliens.dms.android.core.device.datastore.store + +internal abstract class DeviceStore { + + abstract suspend fun loadDeviceToken(): String + + abstract suspend fun storeDeviceToken(deviceToken: String) + + abstract suspend fun clearDeviceToken() +} diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt new file mode 100644 index 000000000..32fb861ea --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/DeviceStoreImpl.kt @@ -0,0 +1,42 @@ +package team.aliens.dms.android.core.device.datastore.store + +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.runBlocking +import team.aliens.dms.android.core.datastore.DeviceDataStore +import team.aliens.dms.android.core.datastore.PreferencesDataStore +import team.aliens.dms.android.core.datastore.util.transform +import team.aliens.dms.android.core.device.datastore.store.exception.CannotStoreDeviceTokenException +import team.aliens.dms.android.core.device.datastore.store.exception.DeviceTokenNotFoundException +import javax.inject.Inject + +internal class DeviceStoreImpl @Inject constructor( + @DeviceDataStore private val deviceDataStore: PreferencesDataStore, +) : DeviceStore() { + + override suspend fun loadDeviceToken(): String = deviceDataStore.data.map { preferences -> + preferences[DEVICE_TOKEN] ?: throw DeviceTokenNotFoundException() + }.first() + + override suspend fun storeDeviceToken(deviceToken: String) { + transform( + onFailure = { throw CannotStoreDeviceTokenException() }, + ) { + deviceDataStore.edit { preferences -> + preferences[DEVICE_TOKEN] = deviceToken + } + } + } + + override suspend fun clearDeviceToken() { + transform { + deviceDataStore.edit { preferences -> preferences.clear() } + } + } + + private companion object { + val DEVICE_TOKEN = stringPreferencesKey("device-token") + } +} diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt new file mode 100644 index 000000000..0a51c63e9 --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/CannotStoreDeviceTokenException.kt @@ -0,0 +1,5 @@ +package team.aliens.dms.android.core.device.datastore.store.exception + +import team.aliens.dms.android.core.datastore.exception.TransformFailureException + +class CannotStoreDeviceTokenException : TransformFailureException("Cannot store deviceToken") diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt new file mode 100644 index 000000000..10583752b --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/datastore/store/exception/TokenNotFoundException.kt @@ -0,0 +1,7 @@ +package team.aliens.dms.android.core.device.datastore.store.exception + +import team.aliens.dms.android.core.datastore.exception.LoadFailureException + +sealed class TokenNotFoundException(message: String?) : LoadFailureException(message) + +class DeviceTokenNotFoundException : TokenNotFoundException("Device token not found") diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt new file mode 100644 index 000000000..3ecf4ae4d --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/DataSourceModule.kt @@ -0,0 +1,18 @@ +package team.aliens.dms.android.core.device.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import team.aliens.dms.android.core.device.datastore.DeviceDataStoreDataSource +import team.aliens.dms.android.core.device.datastore.DeviceDataStoreDataSourceImpl +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal abstract class DataSourceModule { + + @Binds + @Singleton + abstract fun bindDeviceDataStoreDataSource(impl: DeviceDataStoreDataSourceImpl): DeviceDataStoreDataSource +} diff --git a/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt new file mode 100644 index 000000000..f5311733c --- /dev/null +++ b/core/device/src/prod/kotlin/team/aliens/dms/android/core/device/di/StoreModule.kt @@ -0,0 +1,18 @@ +package team.aliens.dms.android.core.device.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import team.aliens.dms.android.core.device.datastore.store.DeviceStore +import team.aliens.dms.android.core.device.datastore.store.DeviceStoreImpl +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal abstract class StoreModule { + + @Binds + @Singleton + abstract fun bindDeviceStore(impl: DeviceStoreImpl): DeviceStore +} From dbd9c8b2736957d9b74a811d4f515bd0778e0cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 22 Jan 2026 20:04:37 +0900 Subject: [PATCH 10/19] =?UTF-8?q?style=20::=20=EB=8B=A4=ED=81=AC=ED=85=8C?= =?UTF-8?q?=EB=A7=88=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/dev/res/drawable-night/ic_equal.xml | 15 +++++++++++++++ .../src/dev/res/drawable-night/ic_minus.xml | 12 ++++++++++++ .../src/dev/res/drawable-night/ic_plus.xml | 15 +++++++++++++++ .../src/dev/res/drawable-night/img_morning.png | Bin 0 -> 99781 bytes 4 files changed, 42 insertions(+) create mode 100644 core/design-system/src/dev/res/drawable-night/ic_equal.xml create mode 100644 core/design-system/src/dev/res/drawable-night/ic_minus.xml create mode 100644 core/design-system/src/dev/res/drawable-night/ic_plus.xml create mode 100644 core/design-system/src/dev/res/drawable-night/img_morning.png diff --git a/core/design-system/src/dev/res/drawable-night/ic_equal.xml b/core/design-system/src/dev/res/drawable-night/ic_equal.xml new file mode 100644 index 000000000..e566f5b20 --- /dev/null +++ b/core/design-system/src/dev/res/drawable-night/ic_equal.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/core/design-system/src/dev/res/drawable-night/ic_minus.xml b/core/design-system/src/dev/res/drawable-night/ic_minus.xml new file mode 100644 index 000000000..8fea3687d --- /dev/null +++ b/core/design-system/src/dev/res/drawable-night/ic_minus.xml @@ -0,0 +1,12 @@ + + + + diff --git a/core/design-system/src/dev/res/drawable-night/ic_plus.xml b/core/design-system/src/dev/res/drawable-night/ic_plus.xml new file mode 100644 index 000000000..677d42886 --- /dev/null +++ b/core/design-system/src/dev/res/drawable-night/ic_plus.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/core/design-system/src/dev/res/drawable-night/img_morning.png b/core/design-system/src/dev/res/drawable-night/img_morning.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c3bd9a34a2a73e3075a039e1f9bc788ea116f6 GIT binary patch literal 99781 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 z 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 Date: Thu, 22 Jan 2026 20:04:50 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat=20::=20app=20info=20detail=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/dev/AndroidManifest.xml | 20 ++- .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 82 +++++++++ .../dev/res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/dev/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1116 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2474 bytes app/src/dev/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 906 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1704 bytes app/src/dev/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1386 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3524 bytes .../dev/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2296 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5434 bytes .../dev/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3096 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 6968 bytes .../dev/res/values/ic_launcher_background.xml | 4 + app/src/dev/res/values/strings.xml | 3 + 17 files changed, 281 insertions(+), 8 deletions(-) create mode 100644 app/src/dev/res/drawable/ic_launcher_background.xml create mode 100644 app/src/dev/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/dev/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/dev/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/dev/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/dev/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/dev/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/dev/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/dev/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/dev/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/dev/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/dev/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/dev/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/dev/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/dev/res/values/ic_launcher_background.xml create mode 100644 app/src/dev/res/values/strings.xml diff --git a/app/src/dev/AndroidManifest.xml b/app/src/dev/AndroidManifest.xml index 3d0dd1c6b..a480689de 100644 --- a/app/src/dev/AndroidManifest.xml +++ b/app/src/dev/AndroidManifest.xml @@ -11,18 +11,22 @@ + 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"> + android:screenOrientation="portrait"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/dev/res/drawable/ic_launcher_foreground.xml b/app/src/dev/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..bd5df3f76 --- /dev/null +++ b/app/src/dev/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/dev/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/dev/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..7353dbd1f --- /dev/null +++ b/app/src/dev/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/dev/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/dev/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..7353dbd1f --- /dev/null +++ b/app/src/dev/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/dev/res/mipmap-hdpi/ic_launcher.webp b/app/src/dev/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..583d0ec80a3592f6aa6c3eb0025984d63c65b55d GIT binary patch literal 1116 zcmV-i1f%;>Nk&Fg1ONb6MM6+kP&iCS1ONapN5ByfO()-aaUqVDo0KaN* zCpI&Wa3jfft;~7gs1eR&Pio^z$&ca?$*&cEJ5k^@qG&1wo!7-j8A~0ZQEhz{r=JMiEX1y+U$T` zw#)_CwlVm>ubKIqf1(bGZEMSxb6?!u8_hjYNj3mRKxB3_cPF~L^Si$P|2}RbNm8V& zJ$O)AegA#@2}W+)IO4SJ>(k^92>#tdB4B}kd>$DbcmyU74j9uWfkTyo$MC^52PNzj zS=9(c_4a_P)&iHdN;uFO!-=)H8L<%tC#4_&{mGk(papEbe>a8nyaHd{0001hk${6Rc)>>)TO9%c0DwIARe6{9 z0mw8KVLV2`3aX-N0RR91Dy6c^k8Or1uA55fpBx)d0rk>9P+7I-&CO=W;yX3Q%Hs5Z zq<`Re)z1iqEOn<~Y(N8Qk_k{qOps!#O3gL|3s6e+p)zR{Dn*#WRK+zm7O5r!P$nIq zm>9scGy-r4X~u)3UOKd!XUY-?U=dO)?i2UY^`rs-Ampc+>$XRrMAEcrzafJ&BOVvl zW5wgX^UG|^Mx`k?s$`U-gdAn27;(TQbm^9qUN|4;3(M|N<<$`5Lt}M^hjOX|3`hu0 zR7Fi=Onjr@#HrLe#iS-APCBMRna<|~FydAlUR;}pKZ9vh#ip+L)indiDqvZE7Z$(L z-fm`+LYBt9hyd15NgXshsaOdnqpX59i=A5Qj^&k{uvGbZ7N*Ig~(TU{27=CMEfVl^Nk3E z!$Sl;o^GL`^f$uJ>C66dt7e7690wmBc6agHHaSR_@U^#mzOquEr=WVX!^7jj67NUK zM81mL8ktRhLRbK?Z iyso{6@|D>REhU=4p{blHw`7|i{FSN>vaFi_lK=oEl>WT{ literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/dev/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c9fac50a16c1f09d027ce0b8892761b2cfcea43 GIT binary patch literal 2474 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 literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-mdpi/ic_launcher.webp b/app/src/dev/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..55b51f4f85f7f92ef3d433cf1e032db450a7bdb8 GIT binary patch literal 906 zcmV;519kjTNk&G30{{S5MM6+kP&iC>0{{RoFTe{Bmj*kMZPm)Gy|3U-MC3!f`s?mo zIp?f2AV;>XT3P$v|8aL1l79dM!_@t`-m~4twyi4bE8c%Ylt4&op*!3IE3$3XQQt?u zArGt}HX?<6kc3ExjhJAj;kf~T01}Xc01}Xbnw>uo!5e&lZxBHQe|CVKog9=wf-zuh zFg64h4ivah6%y+NhN{sPs+l@y30PWGh@iY;!OC>V=g2bhy9Hst)g{((N&^WYLL_{x ztbkF_cqvO!%#@k6kGaEY#LmOlSJAYRfdnbijSQ4Y=%52c0%8zDVi1Gq1c_yr?F?IL z(C;$sv$sR;(4F%ANWb^d?KC9xuqnXOPFmJqu+y*Q|8M6}%m46Mo$Iyy@ALF7wWy>; z#oL$N`{sGuS>}&ve62qIPhC6Ve|T)g_r9M}|HuzAQqu$e%R5%eRP`8AU% z!8o8`6wG8mg@Z6PFf`FE$Y3yr*DXavCbwuqOz0SiSg8kGY@<{S{o=wdyzEl0uNpKF zTPh_onOn*sH6jBMnbWhS^QQnOsYyVPnjcUCSuOu0bGMM1|46OR>YUr@*@@tk z5&fS4)?XTYg&Q0*N)VLN0SS0}dI{FSU{sOt`Dn2U*FR`5s=YV+QT*h@GvHT`U$3oC zuuV7rT*eG`zWCGa*9YO!{G*lWyro@4+8yX7vf{rI5W)|l5t^8tQ&w71TvT2)heX1R z=B9?RV@8i0zNw>vLek`MwBo0Yr{zCu05i$av1{7k&Ty1wu7^TfD(p g1=7`H?W)y+vChNQ$kgQ;H+SLCC3CoCfpDGmmyU$X(*OVf literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/dev/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d9e9145d73fd5aa28a434345cb56f956d289b9a GIT binary patch literal 1704 zcmV;Z23Pq~Nk&GX1^@t8MM6+kP&iDJ1^@srFTe{B)rNtzZCd}bxBV6(Vgg7}<;Rrd zZ2#Igze|+Pz<7Y(fVsU!HOqEYbwzt-W@ct)W~O2M+x|;|znvR=!&W?{f6-DTS8|6k z8ER6r#)*Jy+qSXi{}|i0D;u3{+g4}u0c__1Y$v~a*0G%rhk@Hhiqd7~yEj0VZQHc- z!?tbP#W+iBajZQHhO+kFC2l5Nw~ zj&0k?vu(z0Ir{m?{BMX?oN1m(gY9AV?AW}oBimL&p zF)WV3;uWgIky2$9Mj%&8`Ic8$uq^|`0q(1D9jP)3m6Rfd4nyIV192k78#G#lq(Vyr z`jeCztu_PH(Gzp|JpE?EK>OkVL#* z9Oh26!V1TRTJOAK$`nOVf8!}WN%rMmWVg4nZwlEL#f2WBfw>6~gUlw_g8eS>(P$M= zS2vi5#wr7;ET%(1I>H#q^_q zu>JP{#+3?%C?i4|-INoQS>+XkWR}FGm8B$CWX0DM#ne|sHr9o;v;?8a&<49h46#aMUk&wb@U|NOH*iIOrC*y2vVaM8{8YNm4BRQK0`PjxzzoXBCB| zwS*S6MKm;ENsWzNu0r6_=S&IrTz*8BkI~D=>E)C4L}D{myc;Dy=-bv;(h-so=Jbz^RYn4$xmH7mIlBD;h zAqtrB9X4!(3sdPq6$j+;LVS~2ESgr#o7c=+)-2jqEIL=LIv1=v=j?hXx^8vQFS^eq zRpM~G*Dqid(61&+Y(*k7xF>*_faSx|S+3CfBC$gy{5@Ig+1!g96{)--q607o&< zB2y|ATE}5%z3R#yX+N=^z`F%oe+&pk1<^ZjU)IMO9srw^cegOmSQpvYCYOfFd)g1I zLx6SHjAZwV4xyp$_Dk1vlCmB8j*-b@p;RbXQNpjvf;TM<*XH-R4i68XEIOB*`UavV zQ|N0}3m+_p=n(-QLjGysnbe<*8LH0xJX>Q_7yLO9&D_`x*xC^r4d zBmW^W0RplZ&EfUm#wgBD)&>^X)^YdZVaEjxCcYXv$rbkxv0JZ?S zAXRVQ?OCrWwM5?$BFLs0;10F`Toc#W{O<4u*(QFAzf)1NJFr>+%?hQk#`tVD*Y92@ z`)C?srK4oMYB=*(`bGkuO<%tJT{_aBYXPr2S(A}@MVNAYvrhOibn8stNnI9B%&v)v zas`boCrO7~mh{|_*30H*m8lC;vbkB-H!bQVSGU~Y@5o6aO2(bsXSJL=ees%Npn}sJ zkR$&T!pqn5r~Z$YznL`Y$p)j!;QtTh)p1 z-h%)P2~baw9`y~ukN}D7{{#fT1u}RV#bn`|fvljc~{q$IlrDk?Rn25^j;Zladm;yT1F*1jw;%N0Fqb zNGNO?W@e9E-p1?}-S&pTV&+K-sVSpLV~r!Xwry2g=DzQ}4|jK$28fCN4k(fa{urkO zm&jc|mjgMHBt??vyjFkVRtIJ}sL7ZBgx=~<=m6pUhtR-6{Va=gv2eJ+$n%lPP=x^& z3x(!N=u}hXCs-9h#}@TV04Wjt=TFLf2ls@NnhlKzrRz z;CDUtVB6vYaRfa7^1+?EzPtynfBR%{TRjD?*JF?GX{W$-jprjj1APA$A3NZ?#p{US z+%LX&!1*7<74JR)-dA6BU)T>u3Z?m`8ml(6@um8KACBSfOFp&lW<~DVK2sg)Rm?)C4@4VSO@Id@PS6plk@su^v`;V$Z-LziKpl}jPw*U>nSPm z0W9JX%{lRyFd;K+0D!Qbyks~5U?a_5wjyJ)l)(xsv2=T|vvcrd>?a zrpjbZE?H#JsT%;g)}jl#pbNUxE&FEl)D=koZ5;Vmk_g@b$vPwmcgh0moRis#I|p0V zvy+8ZZ-VTruIFslLcE#b5bK!XVgt@*L7K!0Nl}Izk-SAiUjP8eT2G(5sgPzeDigg}4pfT-yd3QPIaeq^5()`` z0;`Lmw~uY9fJ7hwjuNomqF>?vNK&L@Q?O%!gtJZCH$=iqsu?SPi=eYe!nV|osV)_^ z6(sog{<5XdA%}NHi<}MuLU64@B-B(@cOY5 ze06z#S@eU3?8IAs@wvLcY93)a2kH;?n=h~Kk1FqsZvD>#`e{J${^PUV7Z-0{`whXW z2(Gz5?mwMfT~WU=d)z|7L^}E4-rbSOqg@kbU7+rc^YYx&q<%}`vWq1EaoJ8<-|wFg sYUfB#hDLGipMtW99KPAWfC;X%vQ83KP00kDUT>t<8 literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/dev/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..aa7ac79abdbf2bff7d28c4c0a693a3b121d2d9c0 GIT binary patch literal 3524 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 literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/dev/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2b77aeab986560eba7925aec933a5a973befbab GIT binary patch literal 2296 zcmVn<^XNJ@F3YxUhxe>t?bzJWQ@JXwK@b42 zY?SZKw$HY0`)1qhaJFsRwpj=Q0G5rivu)e9nWc8`X4{=@|C&K0NsY+Z01L>$zX|xz z2GX|4_TR)6$hEdjk(4jl#ob-+fM_$Wz#($aiQEa@ePSeEB6oLpkKO62!lC-iPh|hf zc(3nPjhvbj0mrtrW6%0t{I(g}wlxGhRVr%)PL<3hE9KvZrS0_2^Zwsu!j%p|1 zoH6o0K}PX!-r#Nz2YN5!(^8&)EukcyTun1`L~DljcG5^nkW$f8oSn9nTAw0tZ{G-_ zMa_F$O+f7AI(r+ki#sEdw8%)@dYa(35uN#Xw)~P1IxT9G4ejD z?Q&W3#hTBbn=aQaEj3V-_)tVh&M^JdE-fK3Ur-WHI?Z;F9?T+eRRZ zxqlUJ#|5DoA&WU!rG9pcy$K?W;p;J;_D_T{``g0@opUt)B8|Sf#wCd3lC_Ftvm(tEf>EXBfPg?AMxY~HG>$1JnOhm* z<(r(+ibLYF6Qc7oPL~uNuc$gw+i+Z1bw*Q=Xpc$uDA2i6edQ4=D=QouXUU@(+Iiv* z*EH>K=-S`fby(VT#*i21N=k%ckhxiM>v1b9EQ?^M;%Q_ufWwle1or6Zmcg#jq6Rm|uD^r@l z)tp!s!WmPm~71f)C zg}dR4odk)Op^-`zW-ui)X1S9tSh$5>9Pz)zt!OhPK$2O5*r6mWoV7m$A|j5VkV+I5 zFp@cgq8Y0reGN!BTYlIxA;3`B{BZj`myt;_=MUX~WoKZ|i5K#1R(8%`)v?TEc34>lh>611SzXQ;cBpM`-y8ua+ zBy+F|TBb4vlxCGe(YhVH0u{VDfR;Q)r*?iD(5{ZMq3s{TPRkheAej02%yvnhZ(pRR`OV#P|q=X-!Gl7y4yyv@`yi8ee{Fb(NU#aBT=kO z1+4zFDHJAo%xUCj1XlViLCfkY3KKmX)crPtBK5Cra~XYv_;kL`p-8c1gs$Cr6l7

Cpm*UztXzRel^8AhJJwf8Jg1F#kVco16D ztiuA~LZ$MH9(TW|H@Kd&!{;?oto9UEfp@({{>-Rn#d0Cczz?UIk8g0g~&ejUSmM-7e~40E>uu!r^a>L{qJ zLQ$7|myLXxwWbIFGE7-S8fA4VYF2`hf-(Z;eZ)kqWnZ)w StSU;tsw!*QM=b&Q4<#A@UtTf* literal 0 HcmV?d00001 diff --git a/app/src/dev/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/dev/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e23d28e3b8646e0e855c44f0d56072bce4a9912c GIT binary patch literal 5434 zcmV-A6~*dONk&F86#xKNMM6+kP&iB_6#xJ)kH8}k6$gX1Z3HFZ&wAVaLx_k8;8va$ zKriLgraY@ME9#h|C0lwx1bD*3F%NqE0q+5z$~r0pRSE)7z-MIRRCaZ!_?am;{y(*H z)YSFpkX-^sj+hEzW@eD|AK_|$S{btA=%Sr1!MVmUWuB2DNAF(fOre=c1^6{!b)e92 z3?+C|a|N%0bK*9(ZKYa86H2V z8N=P(-QA&%Lw@;94uW$V*X+@ob%*V{^8>MC$Cl@TAOHZN=6%_=?b)`yjKgf(wr$(X zNwjUtkfd_8jj?ST$rqUsW!n{H+vZpIpOM>0iadOAqqr` zXcJ>%LEMNJ@goEQ>Dcd}w*QLi^53%-`^nkrtvXGR(w-r*M2Q#@$05&bU>Tue4Ri?| zI&`L;3?XQvd@WIDvJJ4I!e#CtwSoA|{IDFRdcESa@?#2lPK7#Gw~3hyIr$Azsvx=WC%h zY0=q2RvdMbvP!1D`!a@Oa>H3r?J4kfS-qIn*zBcz{C5Wsv6LYC$Ex!At)^2m(NQmVj_ zpv2RCJgZmbAkWJOp$gK^DR3s74zg{d!8{*ia|YVNpb8{5*$T~B8)4%SL-{i~S0`{R z^!>$#zZ7BeHkRhsk}S$-6RN85l|nLB#@qM?CiIw~CV`WoXd;cCl(zD=G^7joh@H1Y z^$YBF5$v>K?_R)5oQG__c`mM>OHaMIx6#zwZ0Kv( z_jhXt`ZWWCs=-nD@U(1rRx+}fH-0$(OW=_jqueDRBkm!zQCXAu7TX&XU3veLwkhws`zU4`2@1JYJ{Y?FzcwAq0Fi z)sQ7yN-%VA_SR{gqRnI?VPqi!*3*qv4Xu-UOPDiI{eg97-Dss(0=@;vliJ z-X;n{zuL&REJ6~Yp4yAk<~C#@AoP26>u27CYfRm>7Lo9Y70aizOTh^A4b&!ekaqs{ zV1Cn|-fE+02#)$F_!STd5jaz;RYyE$&ORT_ga0y>7#&|r*&y$aEzU5y{cH&_AZ2#<@mYf|5Aaa6q-R=^I;)#6>{KN=VT|xaZ^ykT(uR!(m%9!Gf~c^19!RtrfVx*pxKnh$FSrxd(I-q&sd2d zI)XA@54pb5Xh={hq&{-K^RYbMoV%uMNH-*k zI1!Qq#cLqL8X&UL{8vl~s3tdv9z)(X_B2(>79vfw>nNhv#DIh}|Y+?U>Wm)XCj z381(lrtSg+vv_47>+is_KeBf{r{KRh2`K)}EJsXFnDN_riigC9fptx9#mZ+W^7NsS zsgxC0XiG#K*We}9-^EHGJ5Jt<6T-AzP~fn$4@^Nat8mL;72fPprg7zr4SFJNKM z?ESg<|HSJbd9NFo!owgCIqb?x9H&Qu$}QmYq=HSTxkM}%&*Wo80*uj|(v;>^gm+gQGKBbt;GkEtBKb2xzyv`9!2uxvVFDYEB3UwBPWb7H zva;xEQ+$(3?$l=XtMWz_#S_ZjX@TpC)^eJtn+IXqNu~)Hj2(CFT?8h700Upz`SL#m z0k;PhhoS{_I zOr6)srDIeB^c$L6EgiKq&}HGg`|9jLhCPtE zBB%*bDg8+?ncLmDO*qOFw7Q|F=5|v@qqVn+&qNZGjeQ^s$am8WPM}H+AT}}w(Ep{I zEB(h~VuBWtP_+w8)>Bao7F+wP*c2fvW8(2ZeTsqQt1dw>5eNo;vuK5-fLv zsRr|!(X4E^g3U(M#EhGlXW&!7taT8JQyTc!E=>BxZ-QnMUyTn;JC-rbP}xX@2jXy= z=5r$hFQQ!ae#6AV^j`!Ckm#`lz>Kp=(_BI}R>373A@gzI>_g{9RJR6K#R|e=^A8Ru z0+4Qv#pw!znHS=gxfnIvK~>3-^A7MAmDG6=0o26=jUQuT3Gh8e6(AKqz+k*djiQDaC(vmg0-su1d&E4ly`q~h_*e{ z{SJ$~1Q)4XCPoxMu}5llxFT@&r3f|FK~=o$2|hQS<&(G+)uM&Okg8BN@h+y)4KGPqp2oXr z;{+jPBQ_Fc9H$gPSPb$O`QdzPUc*AFbYzaGOzb6T#uqW@Bn^KC+h%RPXH9f~V~e2J zEwc#VUGvq94-l1ZV&FxT@xuXS9X{412V$uLM-(BVILQXY;DYO}mgzd8QuWVHF+PH( z^Dd8~O4Kl7MFL3x$i;z0A%B)v0M|+g@7zNuUj5XTOuW=CFUAQe01^wo0kOki*A-^r zylZ~b3dP%~Sm{H8beb9;tZ(!VD{LNOqY)tjzaEKMpPPXTZn%9LK0NvJZsj!Ih@u11 zhL6MwNi;`_CQ5`2`~#*`3fI2rXy0+*U8i!r0JZV%q&oI-SRko)88b{4X3{XLLWBT( z(VUbNpmW!TmK~YpHpn-(s{_q%!~${kUlC0HSeSI&mu8@22qVM<0|W_3m;*c*)?nS| zG(^hd)*G?tJc0wF3WqRpH-x@aLvOM%oM;Nin`kMC(B->TY*8@*xMOiBtVX&o&FWy9 zul)Tb8c$|}u+TDu3Qu>ur7PCjWwdr`Y&~)_Bf&JCFnIiz!C@LtXdI!j#F`MLvYNHI zovMONglQpWS&Z10L%sVLOJ6l4-yY2b2+|BCElj|oGs@O(a%){Y2`7PKDMU82pAbb2q$YmUTS_q+2ti zpAv3TDk>7J;vRAeuxLJW=^q06)y!9Mzl`V`u_OkT98Lh*8fQg$f>pd@b^+Ed6FG*? zDXxRz%S$rAo36_TRsJpP(r$DFW-M@-eUlAq59nLCDv}%n&~5{e2`xLe~?Yo_80UjGuivq7Qhuj$Mq3Klah-*Or7R7#pB?W7j5)qLVcu*|G$e zKh)pDYI@3GP*5F4?8YIbTUWX)Zps#Zg?H!TBLN(1uKth~g0Az-cfdNN)M#f$ za(4plEK8d}#}-_k*#E18%jlo(e7lGA(!13=ww!(q>1Q_%4=>9D#f?HW^F<#!1XP}b z+qWb*`>K01qQIFgWGT8~WP~De&8o zdKTzOG#@>_lEAY1$H~)Q!(kQHEybkAzcj8A*lK%L@nt2TdugBAF(sUEmIV)v9$k$_ z6ks2__oShS8teDIJn_d5-{DeHprr_yfHSrlY&m{z1U;JN;R$ySmDxYxj{o7@P~^%| z4HNwPr%*SO2JrUf$B?vsT-U0#VhhX0V&&l4kb_lCROerP`zB$P+3W7tzxC+SqC!|XDeGj4f-__m|`xm=i^SEqplV4;qU%*G2Lu5H+%5Tt*_p)bgp4j zY@hqWNv37+*K<#Yk_086O)kFqbaNW)&-1heS4wL=nv6b~J$SZ@>A;$F+3z~yd7(4N z*u7&Xm%{;-1XMQGP|PKk-M&BTJ(SRbp<_|JZsQ^J94YM|R1dCP=l-RLMf@dJEG&h; zZJm6!XYKx=Pb2Y!uE2+9*6?P@bR>25^T78F2{9OyvENN`4cy=N)BBNzjHCL}!+Vse zGx#*d`s3m|V%)U{4`zphD!}FE!Y}5`C&O>&zcK#Vczr_V`g`~PlKK=)6VM(yN+OjO`Ong2n&U!K}M{XHGeaPig z3gmRwYsqSW6nU4!{u`MwhLTA-E0hklP;rwdKvlz=~&2JGNZ zae6lk=hqq&T!7$D2i0z(rtx0vM*lFz10a;{=I#|M9rg`>Ley2%4?fjvBwZ6R6kT|4u{>%zjZ^{*`P*YERyd!4ZQLVF-? z5c6b$--F0!I{g8 zp#YMc87Ip;rmwYkHrfgJ*4?cs=tuE@PZoO1wyZT(aIViF#I5a?w&pdvV!^lfQcb&Q zwm@IVE)aifNXM{#&z*ZuexVTlW$9CK?<}kQY=TR-?dREVpKtYYg(BYNI;ReX!8EeZ zEDOJSb?W!q9BFZ~SQwlZu?%L;eepUo_9b8x?B%#06xk-4e@ z1P5DV3_b_>LdL3he>FyyXM-VKJ2VYE2w&`saQQ(+iL%hG`+WTO>l=7cM~IBja`fmx1MjLU~ltn`@QdrR5^>+hN#ow5)AUBPe*L~@AIB7Z`0r0 z`^WQv5tPxhslpS%9==iOyk@7Ton`L_X4`j+V7Fdm>v7>;U7g*1*ZMietsefnHs9 z0Lu`b_<;hkW?AHNot`r5oyR6Ro#I9I%69)-C*1T%fzU!cvLV8!&tD8VD_8y0ub({o zvYmUIV@>fxc)+qlmtG7G0XM+t_ABpdtq)l*KGH+AWNmKR=SeePwe|g({CZ$*y&A|s z*ll@QCFTZ5_sM~1?`lhdd0^+TzW8AS5KvhYdw>13(c50O%Qd=RujjJ67+t5yTCJF< z@I_0bqViEMYv0xx2e_ttH5k7qdR0`QnaTB_ zbY{C%CEb)@v`m7L)&i5-CDP@{(ySBN;*5awr^$E zA6{)IkR&Nm)lATVf|u{G1OWgDCw6W|l2p*+-V-e}r4-F?ADS19$ z;J5q>H*%RK-&Md0xt0fquLw7gFZc<#&R0%~*?fnt&&f89uibnf~T=!{J zf-$H*!{cRkBUP0k*oCUB5{}IB9bUNyZAYo}21F;z%>k0)M0u=XQp>U}=iH>If}f~hV%^YhSf^CX&ri<#0hiOeh} zf();k&&n$u%~EhZ3+ACTE~_$4L=@Gl%1On^GdLLN>^Qjl)0vzR6fY~sm3AG@lK}pX zOmT5k`QIcYAl#ZIE{>>Z*iRt9NCw_C3_KiYb=`T6HtuD9NKXY~RnDdiwjkef_@P zet*wEpnEXbH5BR`3ct}Y9BChkwgItLFx~;F@}_rR6&szN->G?~=arhX^DK|HcDXbN4FG(LvGMX&>%( zeg@kKz3$-U>^79eMbvQ9~NyC!_6{s zOFI3=h23}qA8Qn#oB!>7gt|%AvDnRh^*sPRq-$yH=05r!L2t4(WU7{dZt>T!f;*F{ ziA)Uz-AO~w*7?m`4JuU;*d5rLE7n4CB@PGmN%wU;U zZUuZ+EQ7!syBI5%0^ps{>DH2m8HVJ=_`6i z_NOYvZ|H4ecF?=L7CA(3=6;~+|0)~fvN^7}U^zcD7mg}vm|TGi>K+I-=Oo?nc}I%o z$km*csc0eY>LYkxa2`(ebG)|X7?vatq1*j>fnca;9#R{4Kd-M6-_;~3UF zXbzIGgE83{zhoqHBI8BH^Z9U-Ebh+QA63(*w!LlYtvTSL8_NSSwm)`h-+n7u5UF4$ zTq#o+x*O)fsvXpvxQeLNOxB)^Uy31D9$PlTNOH#l*!(&KVW)ZPJVNw%SRW zrFiRT)X5j1n7A9s`yxWVO}R6}olcUr(MZQs$SD+%n7AJ)hC^b$P55ww-ENw$>3~Bl zB2g*;1$`S07YBMgB;7Oq&Z(eTr~y%~02CWckYq~u@~kwyv);CesF82rP;LP7!HDRP zv7v^VTr~Z2o_Z|^=&j%?Cf@Bk1v=W|NUyqOG6PsK{q1*_3T&RNco`|TwM=BgN-UVCdbVwzB!ceG& z^ZAHuii=jrc&VqDI| zWoKNhym@w_fq4&-_N7!rWV1-gjkqkrpJ*ZSuUMe8KeGj7CWn%O2-yr55clMX0xRay zF^HjEER#p2a+!1-E!h*7Yf9VDM8Or)W0zML+NC73*+d4H4xwdR{BkYL*-4tvin8|h z5JS7Pcsd_T6_TNB#*MmsNf|4uH6;#LEJcVWiID^;5-TM_xTGtabs%L+{32O%vOPA6 zSU64&#VEljQy{_|2r~yl%)wAoB94oN3(-(98X`u5rEs|1)DzZ&MIEGR;nK$%q^w3O z*Hu{cZoH<#t7@X6rYjn{tYu1CuB78Ny-+lW1%q5L%6X%bHz_%jnlr08i;}e}8LOJH zY8jiBuAV+%*cRfCwD=;dzA)=($oukOn>Wxt65ts2cMkcwhJu`yk<2o>OG|bSdJ&uj z$e=eI;;>^$^t=)FMmd1qXtcF+&Ox(`>6Q*3F?=^^0*NM~o0!&tj~RR_ov%c*3Tq&3Y87_TZ~RLQ9OJ)%_Pg1Zek027o9+adF$-v34@MiV97l5-_ML~ z+ZS$K#hjeb>6oN>+IQ@0j2T-CM4BH*E@C|BNy= zp;#rA$?V=(W|EuO*3h!Dq}TH~z_!Ej^8MY9lTX7;qLzv)Zx5LnS}RsTyVsX5GsPWz zHMxz>>iQU(cn1Gq|NXAjmBl{;Gl4TZp%X?rW;kYE2HsvlpRFLyp2W|ez%Cv~FISLf8^-qbY%YymjZHlbozUyJ zb{6#pX&>mGx1UeXylrGzmiEBa_xtTOnMav@6Fh2@773t@<|+ON zLG<}skK=u`Gc6F%w4&~9Z4Cq%KEypZX&*5yPO|~pl9FVE4O}M%BYaTIe!bVckH3L0 zk*ZRv~(iE_;$|i;cPmV#%ptwQt1Jjl?tZ7=;s(076 znUSuZc&WN6ku8GtsT4mw;A*o81P+dv6gw$yQ0y-Y0T|EZ^Rkf0)^@pnbf~c0(F}L^ zA_$>_qsGQgjGvY;Em7xo?i(9p{ZRwoShG9bcOi@jB-p_j9`J!*p$5Uax290v;gsjv zBVI`uCK&L=Tyr_xVvg>OrOTUh#lMrLPf{+ET}FFt5Vmb?IUU>9))uU7H@cGETjH=S mvj=oC66w;pkw~)CV_LQ+{n1#KDF7|Y)A>(Z0LtIEPyzr1lm3cy9 zf8_W3Z6e52_iIcNdli1{E0RQ#w!P9s*GU`tJON~uT#@IQ0Far(!fkC^)3MDeu=HP* z@R&u`A6gptjk()Mk`yVA8T_~IMCK>y!;K_Kij(G97jq|Ou+XFp{r>^7nDzmBfGkD- zCjkFHGR!nNIj3BSQIRKJYfMRa@p4_@)j8%G@RM`qh8Pz>0NCaIv|ll=ZTla9l%vQ2 zYfg0Pe#!L;?o`MmjqY!lCln5YJ2WoM)s?&7M3Q9NrfrS6_Q8F&ZTIDO z?bm(-e(~4X0o%5%8}It;y(Go9?b^zi=YKS04Rn(Q{I@WXGn~b+Z6rlLeE$9mWu5?E z*#EC?8*STf$E~M^-EXi6Mc62#Q zOWOXHG?Wg{tX@k;GyY!CVM>S8=wJF@d|jR?Lwfi(v^EOI!L6EjAZpq+g3KRc?_qHB ztwHU!w&Rg>-OuyJDO+vZwr$&-pEI9q+n#9_+je)*WyZ<-KKDHVgn$oC=pt2UUP3^! zGzwHz1=C_Og;K-urAwd+T1+flA}9jFD||OSD)b!?wlE?i(l6gAk|Oa!Ol%Y+OAnV) z6%NKfLsW=iqDBmUNK}d0o(^C_E4nWf55yyJTRar6HUg-qwWUE_X#pcfi5X(9 znELPkiScv^Q3arR5CB3|2VuPEtBISUL0l70EMSzj=(#i^K=_|8mW##jcpCt?3^hg$F>i)dUJJlGZ_$5D?ib#9!jK zH@*;BiCCoS8UdGzO=7E<{XD>K)j;88vZf9N+$);I_u{8VfC_C9x&;wbEENZD6y-p) z)zndl*1_t~farXs_*nc;REkdBl<{h@O&ohSz{^b?g==Rj+kp$jd*Zt{K}|8KYZ)S6 z>=&o+1R@t6sKL9m;p>1a#9QK1l+_dq7nump5c|a&VjLK`w2M%LbePI^hzDZdGY}a; zMZrYSF`LEl3&7}>0Deh_d7WPHwEt5?#{U8(#KH!L#dOft1NbRtw&G@Sup4uV6rdS{v{x4N99Dgr+EN+N^tO= z;yKMIp$iZe1!my;1N(c0B{wY z5Fhga!cb1iVTRz@QAoOoS$fA}NWCipi^5Dj-qhjU9dU zpEsQ59TyoNgJRdWjriyDy}nd9UicEkj4wq}=ouKFL|%20_g*5P;O!VaEVag$Ttayu zLaUZB|H8ua8+G=5W&JlO{+V|Txbg`uW|<{z*bA^GD+92~ zJA$S+Nd4{K!8@iAJK*hm-kh-mV9^-!wzY14uE0ldp0pwMq4+JlXSUg4?0~n&#_L54uxdCAa~+)hROVCAV1R+#nDSqFRUz5KG~ zz^-G?Kf^Uy(8bmOrCDp$@qv0^-LernRlk?b`d(y`>JDeN*=7OZ z!0bH@HoDjcQ|-`gop66DHj}dt#bqYCf~cF7Cf@TeuyDNv+RgYKv-D@^$yr6rJS!mh zO0)K~vRTDSaoi!e$Qqr4C*?b+9bdwowG25DLq@s%?ZhcIf=k+<)6$RT--~=FH5s2w z?MuGPc$XUva>1yCf?Z$tN8M-q)869X47FYlwF6DqxamA#l~CR_%mWU%z!oCT5Gf8HS5QaA^H$QP#;vH22n$3 zP#xAD%z@j)KsDqDVgONcOLLq;F%E8pF4N6PxX$vs)OQdQHv>5WZ$B7!03}qD^asFi z?@`u_ZzkiQZ1wF=_~BlMau zewqV7mi8N*CV+&52r6zN8lheFXDQPjI=`KfzK^>;;IV((ImN{^MS!bL_`}JWJ%Yxyrx=JnhW##66#3MxKae(6Vv2} z-ZOfy(1-607*1i(00~7xzvJKXd4Hr!=rKkp@WxS&7$QHYg7F0UFfs-KM!=s^%!_z+ z4wVn|O9dtfU`T;zkt#nVeGxJGgji;pf>F3NLib7X6?v*q*jZo#93ZC9q`@Xg_-7-JBL7y_7lY?OBSiCPK>G)+Kj=d@Fx0RCB9vwp@?MLy z0*)0bxrPX6kUe@Ihdla(a}-o;JR!O)?ML}^A~eu}1Aw#-v5W@v-_ED>;ok#>4HQy> zMi-$_E%_6D~HO3FI!6k(=z& z{Eq=R0=OW-HOfKW>j?VU3a4jKZGm(OvC5-)q5mQ#G(;14_!JcGK{>oUA7GVCf&+Z3 zbOGArTX{7aP>KO9r=Nxg6vR0Dq>=Xuf|F$wHV$qpAe~0-LN#&{F^zf*h@hc^$>lNj z^QEwg46Q97r6hO2#^GCC1@ui6f(WRCGZ={Qu74R8kZ3s?YI zNa^L(mvenUH)2X#A-HX!QU&96#+xKFd@GZTcmpKx2uC5Qi%&zoT#VSS9qPU8NsY}p z){Yo26OYnpKrOcQ6%jFjsiq;Rjk{3H2WiZ8+Mp~rfD+>oHWrX=R7IO@hLN%xl>YEg13Cw1f&y*oDWI*JX$VX&D+5CsXkc|p_`}))fv&8tvkLUBB&Lz2n zg+nw=`n7QsBkz8~(?rL_LO%fT)vz{$64z5CG8&L}Pzk4;peEV7`^N?ZAOHwJ<*Uk9 zm9OxvZ&cMc;86h;ShAXwIA4SVBrgtP9-uv|2UX8i`Ai?aK6ZY7c;Oazia8F%S!W1} z`R=6H@j|?cc@S^sFNmdtK+oB`TDxpO+h6DvvIc|e1I{2zkl>`}2umhl1crq~_Wq?9 zd2Zvo zLaK(F2Xq|osojYDc?M&DQcu!T(0>}np9=~6uXVz|=e0eX;XmR$e6`@!ZXrg|cREHS z3W>K5!8-Rv?&=;UKZ0|JJ;fcDBd92K_>Dm=7-E*WZ99QrJ^(X}{R0nD!eP~8P9G_A z7+~J1-ex&A3&Ha_(YJcF&MnYqP6KbiastLzYlE=dqn~wOnB{Du+#bkP z%zHp|mJ4I>FbgGuV;vay1joFZL#>5#)QjAIT+9+#X`7hn&(x3VbkNp9S%xF4%YY_1 zD`FngXtmx$U5MgXFp-sHFGo1vCA3mg4nm`xwiA3hV89d891X?=2l`;SJHO&#c?E|o zvw(Ij=L1l5qQ5VCcwv(EmgS6iLI15!@QH+R3!zrS8UB0W)$7=n$Sg>;ky;7o>0W5q zYpY%&q3aY)SLln$^Bfpo4O^kp(6u^Okr`FZ2Iv6n%v#3z7zGKXH+V^R&*vhpxxRNh zZzATwfrP^MQQ0fI3u_P*ldIkI8knoM(`ccrUr6Obo4cX?fOx4-Ow5bnG}UV8e6ia) zS&B(jMRgP%Ahtxww5@uF96d)dCmYcJHdqH3U$v`XzRII?rvXr%3;-!KkItYEkVr8x zmV>>ccbMksy4s*`2fRbT{B1eba{ONGm(69}g~?Xk)CYgAeYq>s^o6!_iRdxV9>e<+ zFuy8f%ek)aFVYV=q&i6ojKZEQJ;WC&h|$(Fm4^BGaB}q@DcT-9NG1w{Z8>^5oZxHh z!F3CulLJ6EuOVON!g39pg?L7zP%dK5N*A<8#)gqPFy95Pfu(MJt6$gRXDKFK6`ObG z(hn9-sBNIsD=xQ)oas3?A$+tcL7tdLFhA55DyHIn**Fp9I@EPu<1=I({u7Z-eg|0> zd8Ep#<6NZU)Hu-o<>QSu0mC4MwL#uKp1<)dYem!!Ue>DBnXr=CiKTg{{+ntE~$O&A=N~K4+2tcOB^V$HQqJA;3{kjJR|Y@4>>; zTLIKM6r1NzS<>J|gVGpcXaqSq$nfB(aGWDn33U6@G*1iHu^O;+!66BhRg@6UlK)Nv z2mv}3z#yJOA1O9R+7)O3uX3CCjCDot$MQdo%|`Tylb=A+jSMrx$L zKLOM5P@GCDT&Qi7vw;3L0JRCDmIj$zCZ8)n2oC71= zhr3>FK_onq!t?1tro;12!?y%s387su&!7&WA@*yo^#}nDaHjUw`hli5@iyS?B|{iA z<4&IUG~*EAsR0fFdO<;QDv5=)(Bvrwr9!~R=b9*7Pi;gbp25qY^76;38Fkm#P8};B3jXfz4xx#f4ck3Td%r z;&=ei8oU(%NUoF})IL33OhRl3o7izq=A2uH4 z3A^Yt=6GKiPjVFVfkSjIcXvo?0CK1-xbV>SEBd8YyLYhm2WHX?Nx(;7$p?VrTwCkq zbtBXaeXLruNoozO5jtH9@c?N-_$X;4siYFO#Myy$7mjdjWG#J%#01e0yAc@urGL&- zzglu7jMA9#6Bn=zWAqAGE_t4&zxTJWIW@$NCIIO#07%*>ilRPFH^sjfJ=m}3X<5m> zWR&8JU$}r6=B69YXD@U8aKG*?%zIxJMNwo)!k1~S6;2eT*;!`F{(_rF`0-pfdO0_w zXwIO@uZkFEmcHS9&RK38?Z;ns%}z~kjiR!(mhfkiv{6(pN5kv{nc@$-e5fzZ)^NVe zxiCZvnt2F;Q@}&moPH-0^=TY;a9fZ*!KGDfMY zT9yTe8USiQ$4C~nQ9Cklrhx-J_;T~#*V0`~UZ`p=ysZ^xst5vv9;u>MLuf`|9c)>l z?R>XSbm8Y+8Iooj*d!+{R|cSJj6uOoSOb6p7j0^$TB%X2`thni-JHedE;9DXUC<3L zOn{52K>&msqzcq()Y~t5TOX{2mD+keJX_P>Ydlz#?4q(vpPX=nT^2c2HAWRStg$5l zB86{nrIRF$6rZ5>lTF*h%=tzwRNcwn2_3L84)3H^p}|Dq`ob2hA*9}ZQ3?iO0Q#j? zXkF#WQrGu){Qyz2k+h;DGb}5Nu*)xeVOiCvDvD%11%L!*8(9gi1eGDr5`k4uv{*eg)yp%B3d7Un4O&!x{;M&wa~RbqN`>Ce-^RCPsu`y4Yk(VWh=G6uKnRy#et8UcU-qsvB&CO?2K5YR@Atabv$MS1$IBHG zg2`^=q7f#;PBT%tTz+9WiXv-O1&XYW15ufsovqAPOdD4#?V^6HP?-6A@1y8F)$OA4 zE$zx%6*kHf0hcGv9j9kww1a$t|7ODT`vjN5p|B;zlKKaA4eIUDcDm>(`c_L>5PVZD z$qch?RF2B!a#XevEm4dW0LNQe%VB(vY2;3z1cd|)Lk6G#R82e2BK~gf7VbFJMB%P1 z9+B&lTOl zRAHd1P?VNRg0Rr>P*tcxF`ghn5+tcGP^c26CIJGV0t$r!iabDoAP7KF$`XKLykbHH KKuk!CCwv#n`SA7t literal 0 HcmV?d00001 diff --git a/app/src/dev/res/values/ic_launcher_background.xml b/app/src/dev/res/values/ic_launcher_background.xml new file mode 100644 index 000000000..c5d5899fd --- /dev/null +++ b/app/src/dev/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/dev/res/values/strings.xml b/app/src/dev/res/values/strings.xml new file mode 100644 index 000000000..5b0c78e41 --- /dev/null +++ b/app/src/dev/res/values/strings.xml @@ -0,0 +1,3 @@ + + DMS + \ No newline at end of file From 65ab7a54f4eefe41457e1d65a02eadc3b73aea2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Sat, 24 Jan 2026 23:58:43 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat=20::=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/setting/ui/SettingScreen.kt | 35 +++++++++++++++++++ .../setting/viewmodel/SettingViewModel.kt | 11 ++++++ 2 files changed, 46 insertions(+) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt index 5f76b40a5..90d70890a 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt @@ -46,6 +46,9 @@ internal fun Setting( val (shouldShowSignOutDialog, onShouldShowSignOutDialogChange) = remember { mutableStateOf(false) } + val (shouldShowWithdrawDialog, onShouldShowWithdrawDialogChange) = remember { + mutableStateOf(false) + } LaunchedEffect(Unit) { viewModel.sideEffect.collect { @@ -54,6 +57,7 @@ internal fun Setting( onShowSnackBar(DmsSnackBarType.ERROR, "알림 상태 조회를 실패했어요") } SettingSideEffect.SignOutSuccess -> onNavigateSignIn() + SettingSideEffect.WithdrawSuccess -> onNavigateSignIn() } } } @@ -82,12 +86,37 @@ internal fun Setting( ) } + if (shouldShowWithdrawDialog) { + AlertDialog( + title = { Text(text = "회원 탈퇴", style = DmsTheme.typography.sTitleM) }, + text = { Text(text = "회원 탈퇴 시 복구할 수 없습니다. 정말 탈퇴하시겠습니까?", style = DmsTheme.typography.bodyM) }, + onDismissRequest = { onShouldShowWithdrawDialogChange(false) }, + confirmButton = { + DmsButton( + text = "확인", + buttonType = ButtonType.Text, + buttonColor = ButtonColor.Primary, + onClick = viewModel::withdraw, + ) + }, + dismissButton = { + DmsButton( + text = "취소", + buttonType = ButtonType.Text, + buttonColor = ButtonColor.Primary, + onClick = { onShouldShowWithdrawDialogChange(false) }, + ) + }, + ) + } + SettingScreen( rotated = state.isOnNotification, onNavigateResetPassword = onNavigateResetPassword, onNavigateSelectProfile = onNavigateSelectProfile, onNotificationClick = { viewModel.updateNotificationStatus(state.isOnNotification) }, onShowSignOutDialogChange = { onShouldShowSignOutDialogChange(true) }, + onShowWithdrawDialogChange = { onShouldShowWithdrawDialogChange(true) }, onBackPressed = onBackPressed, ) } @@ -99,6 +128,7 @@ private fun SettingScreen( onNavigateSelectProfile: () -> Unit, onNotificationClick: () -> Unit, onShowSignOutDialogChange: () -> Unit, + onShowWithdrawDialogChange: () -> Unit, onBackPressed: () -> Unit, ) { Column( @@ -137,6 +167,11 @@ private fun SettingScreen( text = "로그아웃", onClick = onShowSignOutDialogChange, ) + DmsItemButton( + iconRes = R.drawable.img_3d_out, + text = "회원 탈퇴", + onClick = onShowWithdrawDialogChange, + ) } } } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt index 7a54eb85d..8b2582622 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt @@ -8,6 +8,7 @@ import team.aliens.dms.android.core.device.datastore.DeviceDataStoreDataSource import team.aliens.dms.android.core.ui.viewmodel.BaseStateViewModel import team.aliens.dms.android.data.auth.repository.AuthRepository import team.aliens.dms.android.data.notification.model.NotificationTopicGroup +import team.aliens.dms.android.data.student.repository.StudentRepository import team.aliens.dms.android.data.notification.repository.NotificationRepository import javax.inject.Inject @@ -16,6 +17,7 @@ class SettingViewModel @Inject constructor( val notificationRepository: NotificationRepository, val authRepository: AuthRepository, val deviceDataStoreDataSource: DeviceDataStoreDataSource, + val studentRepository: StudentRepository, ): BaseStateViewModel(SettingState()) { init { @@ -43,6 +45,14 @@ class SettingViewModel @Inject constructor( } } + internal fun withdraw() { + viewModelScope.launch(Dispatchers.IO) { + studentRepository.withdraw().onSuccess { + sendEffect(SettingSideEffect.WithdrawSuccess) + } + } + } + private fun fetchNotificationStatus() { viewModelScope.launch { val deviceToken = uiState.value.deviceToken ?: return@launch @@ -80,4 +90,5 @@ data class SettingState( sealed class SettingSideEffect { object CannotFetchNotificationStatus : SettingSideEffect() object SignOutSuccess : SettingSideEffect() + object WithdrawSuccess : SettingSideEffect() } From 944c51d30ad2164c09e1970c369ed672cd11d277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 29 Jan 2026 22:42:18 +0900 Subject: [PATCH 13/19] =?UTF-8?q?refactor=20::=20home=20screen=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aliens/dms/android/feature/main/home/ui/HomeScreen.kt | 8 ++++++++ .../android/feature/main/home/viewmodel/HomeViewModel.kt | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt index eb208b88b..2c540a99c 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/ui/HomeScreen.kt @@ -57,6 +57,14 @@ internal fun Home( DmsSnackBarType.SUCCESS, "개발중인 기능이에요", ) + is HomeSideEffect.FailFetchMyPage -> onShowSnackBar( + DmsSnackBarType.ERROR, + effect.message, + ) + is HomeSideEffect.FailFetchLatestNotice -> onShowSnackBar( + DmsSnackBarType.ERROR, + effect.message, + ) } } } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt index d3a6cf236..1e6108b88 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/main/home/viewmodel/HomeViewModel.kt @@ -28,7 +28,7 @@ internal class HomeViewModel @Inject constructor( studentRepository.fetchMyPage().onSuccess { myPage -> setState { it.copy(myPage = myPage) } }.onFailure { - throw it + sendEffect(HomeSideEffect.FailFetchMyPage("내 정보 조회를 실패했어요")) } } } @@ -39,6 +39,8 @@ internal class HomeViewModel @Inject constructor( setState { it.copy(latestNotice = latestNotice) } + }.onFailure { + sendEffect(HomeSideEffect.FailFetchLatestNotice("공지를 가져오는데 실패했어요")) } } } @@ -55,4 +57,8 @@ internal data class HomeState( internal sealed interface HomeSideEffect { data object ShowOutingPassDialog : HomeSideEffect + + data class FailFetchLatestNotice(val message: String) : HomeSideEffect + + data class FailFetchMyPage(val message: String) : HomeSideEffect } From 7c5a63f701f24af6a72e5b6441a22e1e12cd1ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Thu, 29 Jan 2026 22:44:46 +0900 Subject: [PATCH 14/19] =?UTF-8?q?refactor=20::=20=EA=B3=B5=EC=A7=80?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20Ui=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aliens/dms/android/feature/notice/ui/NoticeDetailScreen.kt | 3 ++- .../dms/android/feature/notification/ui/NotificationScreen.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notice/ui/NoticeDetailScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notice/ui/NoticeDetailScreen.kt index aba82e61c..96fdba7c3 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notice/ui/NoticeDetailScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notice/ui/NoticeDetailScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -105,7 +106,7 @@ private fun NotificationDetailContent( .horizontalPadding(10.dp) .background(color = DmsTheme.colorScheme.surfaceTint, shape = RoundedCornerShape(32.dp)) .padding(vertical = 24.dp, horizontal = 32.dp) - .horizontalScroll(rememberScrollState()), + .verticalScroll(rememberScrollState()), ) { Text( text = notice.title, diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt index ebfe5804b..0dbaf980b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/NotificationScreen.kt @@ -186,7 +186,7 @@ private fun NoticeItems( onNotificationDetailClick: (UUID, UUID) -> Unit, ) { LazyColumn( - modifier = modifier.fillMaxWidth(), + modifier = modifier.fillMaxSize(), ) { items( items = notices, From e7131bc9da941cf399b39a96ffe8842086ffecff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=9C=A0=EC=84=AD?= <166105837+uson1004@users.noreply.github.com> Date: Thu, 29 Jan 2026 23:03:03 +0900 Subject: [PATCH 15/19] Update CI workflow to create google-services.json --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e49256c5..07e28e748 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,9 +34,10 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Generate google-services.json - run: | - printf "%s" "${{ secrets.GOOGLE_SERVICES }}" | base64 --decode > ./app/google-services.json + - name: Create google-services.json + env: + DATA: ${{ secrets.GOOGLE_SERVICES_JSON }} + run: echo $DATA > /home/runner/work/DMS-ANDROID/DMS-ANDROID/app/google-services.json - name: Build with Gradle run: ./gradlew build From a960f986687ecb791b3f6ad3c5e2939a62889b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=9C=A0=EC=84=AD?= <166105837+uson1004@users.noreply.github.com> Date: Thu, 29 Jan 2026 23:09:28 +0900 Subject: [PATCH 16/19] Refactor google-services.json creation in CI workflow Updated the creation of google-services.json to use the workspace path and fixed the environment variable usage. --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07e28e748..a0da15158 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,10 +35,10 @@ jobs: run: chmod +x gradlew - name: Create google-services.json - env: - DATA: ${{ secrets.GOOGLE_SERVICES_JSON }} - run: echo $DATA > /home/runner/work/DMS-ANDROID/DMS-ANDROID/app/google-services.json - + run: | + mkdir -p ${{ github.workspace }}/app + echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ${{ github.workspace }}/app/google-services.json + - name: Build with Gradle run: ./gradlew build From 9e42a0b5bd8c5f2c6ddaf26d2cd281a340042ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=9C=A0=EC=84=AD?= <166105837+uson1004@users.noreply.github.com> Date: Thu, 29 Jan 2026 23:17:32 +0900 Subject: [PATCH 17/19] Change Gradle build command to assembleDebug --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a0da15158..eed75ff06 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,7 +40,7 @@ jobs: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ${{ github.workspace }}/app/google-services.json - name: Build with Gradle - run: ./gradlew build + run: ./gradlew assembleDebug --parallel - name: Run test run: ./gradlew test From 37f88a1c73a9a7573b1bb177f321b58cddfb44a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Tue, 3 Feb 2026 16:13:27 +0900 Subject: [PATCH 18/19] =?UTF-8?q?refactor=20::=20noticeItem=20=EC=99=B8?= =?UTF-8?q?=EB=B6=80=20modifier=20=EC=A0=84=EB=8B=AC=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/ui/component/NoticeItem.kt | 86 ++++++++++--------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt index ac6f6b9a4..05aaaef6d 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/notification/ui/component/NoticeItem.kt @@ -31,55 +31,59 @@ internal fun NoticeItem( notice: NotificationUi, onNotificationDetailClick: (UUID, UUID) -> Unit, ) { - Row( + Column( modifier = modifier - .fillMaxWidth() - .clickable(onClick = { onNotificationDetailClick(notice.linkId, notice.id) }) - .padding(horizontal = 24.dp, vertical = 22.dp), - verticalAlignment = Alignment.CenterVertically, ) { - Icon( - painter = painterResource(DmsIcon.Notice), - tint = DmsTheme.colorScheme.scrim, - contentDescription = null, - ) - Column( - modifier = modifier.startPadding(12.dp), + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = { onNotificationDetailClick(notice.linkId, notice.id) }) + .padding(horizontal = 24.dp, vertical = 22.dp), + verticalAlignment = Alignment.CenterVertically, ) { - Text( - text = notice.title, - style = DmsTheme.typography.bodyM, + Icon( + painter = painterResource(DmsIcon.Notice), + tint = DmsTheme.colorScheme.scrim, + contentDescription = null, ) - Row( - modifier = modifier.topPadding(6.dp) + Column( + modifier = Modifier.startPadding(12.dp), ) { - if (!notice.isRead) { - Icon( - modifier = modifier.size(4.dp), - imageVector = Icons.Filled.Circle, - contentDescription = null, - tint = DmsTheme.colorScheme.primaryContainer, - ) - } Text( - modifier = modifier - .startPadding(4.dp), - text = notice.content, - style = DmsTheme.typography.labelM, + text = notice.title, + style = DmsTheme.typography.bodyM, ) + Row( + modifier = Modifier.topPadding(6.dp) + ) { + if (!notice.isRead) { + Icon( + modifier = Modifier.size(4.dp), + imageVector = Icons.Filled.Circle, + contentDescription = null, + tint = DmsTheme.colorScheme.primaryContainer, + ) + } + Text( + modifier = Modifier + .startPadding(4.dp), + text = notice.content, + style = DmsTheme.typography.labelM, + ) + } } + Spacer(modifier = Modifier.weight(1f)) + Text( + modifier = Modifier.padding(horizontal = 10.dp), + text = notice.elapsedText, + style = DmsTheme.typography.bodyM, + color = DmsTheme.colorScheme.inverseSurface, + ) + Icon( + painter = painterResource(DmsIcon.Forward), + tint = DmsTheme.colorScheme.scrim, + contentDescription = null, + ) } - Spacer(modifier = modifier.weight(1f)) - Text( - modifier = Modifier.padding(horizontal = 10.dp), - text = notice.elapsedText, - style = DmsTheme.typography.bodyM, - color = DmsTheme.colorScheme.inverseSurface, - ) - Icon( - painter = painterResource(DmsIcon.Forward), - tint = DmsTheme.colorScheme.scrim, - contentDescription = null, - ) } } From 6b34decba39088b7779899b1815aba758b8fb4e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=84=AD?= Date: Tue, 3 Feb 2026 16:13:45 +0900 Subject: [PATCH 19/19] =?UTF-8?q?feat=20::=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=EC=9D=B4=ED=8E=99=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/android/feature/setting/ui/SettingScreen.kt | 11 +++++------ .../feature/setting/viewmodel/SettingViewModel.kt | 7 ++++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt index 90d70890a..61fc97c1e 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt @@ -27,8 +27,6 @@ import team.aliens.dms.android.core.designsystem.button.DmsItemButton import team.aliens.dms.android.core.designsystem.dialog.AlertDialog import team.aliens.dms.android.core.designsystem.sTitleM import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBarType -import team.aliens.dms.android.core.designsystem.titleB -import team.aliens.dms.android.core.designsystem.titleM import team.aliens.dms.android.feature.setting.ui.component.SettingRotateContent import team.aliens.dms.android.feature.setting.viewmodel.SettingSideEffect import team.aliens.dms.android.feature.setting.viewmodel.SettingViewModel @@ -53,11 +51,12 @@ internal fun Setting( LaunchedEffect(Unit) { viewModel.sideEffect.collect { when (it) { - SettingSideEffect.CannotFetchNotificationStatus -> { + is SettingSideEffect.CannotFetchNotificationStatus -> onShowSnackBar(DmsSnackBarType.ERROR, "알림 상태 조회를 실패했어요") - } - SettingSideEffect.SignOutSuccess -> onNavigateSignIn() - SettingSideEffect.WithdrawSuccess -> onNavigateSignIn() + is SettingSideEffect.SignOutSuccess -> onNavigateSignIn() + is SettingSideEffect.WithdrawSuccess -> onNavigateSignIn() + is SettingSideEffect.WithdrawFailed -> + onShowSnackBar(DmsSnackBarType.ERROR, "회원 탈퇴에 실패했어요") } } } diff --git a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt index 8b2582622..7da6bae6b 100644 --- a/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt +++ b/feature/src/dev/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt @@ -47,9 +47,9 @@ class SettingViewModel @Inject constructor( internal fun withdraw() { viewModelScope.launch(Dispatchers.IO) { - studentRepository.withdraw().onSuccess { - sendEffect(SettingSideEffect.WithdrawSuccess) - } + studentRepository.withdraw() + .onSuccess { sendEffect(SettingSideEffect.WithdrawSuccess) } + .onFailure { sendEffect(SettingSideEffect.WithdrawFailed) } } } @@ -91,4 +91,5 @@ sealed class SettingSideEffect { object CannotFetchNotificationStatus : SettingSideEffect() object SignOutSuccess : SettingSideEffect() object WithdrawSuccess : SettingSideEffect() + object WithdrawFailed : SettingSideEffect() }