Skip to content
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
47176ad
style :: ์•„์ด์ฝ˜ ์ถ”๊ฐ€
uson1004 Dec 31, 2025
267ff00
feat :: mypage screen ๊ตฌํ˜„
uson1004 Dec 31, 2025
5369f65
refactor :: navigationPadding ์ œ๊ฑฐ
uson1004 Jan 1, 2026
5f42c87
feat :: setting screen ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
uson1004 Jan 1, 2026
c155b0d
feat :: setting screen NavHost ๋“ฑ๋ก
uson1004 Jan 1, 2026
6010d51
refactor :: Setting screen UI ๊ตฌํ˜„
uson1004 Jan 1, 2026
8033939
refactor :: drawableResource stable ํ•˜๊ฒŒ ์ „๋‹ฌ
uson1004 Jan 1, 2026
e4ab791
refactor :: ์ด๋ฏธ์ง€ ์—†์„ ์‹œ ๋Œ€์ฒด ์•„์ด์ฝ˜ ์ ์šฉ
uson1004 Jan 1, 2026
8f10ac1
feat :: ์„ค์ • screen ๊ตฌํ˜„
uson1004 Jan 1, 2026
29123d2
feat :: PointHistory NavHost์— ๋“ฑ๋ก
uson1004 Jan 1, 2026
8ebd86c
feat :: point history ๊ตฌํ˜„
uson1004 Jan 3, 2026
c424966
feat :: ResetPassword Navhost์— ๋“ฑ๋ก
uson1004 Jan 3, 2026
040cf85
feat :: ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๊ตฌํ˜„
uson1004 Jan 3, 2026
4093e61
refactor :: ๋””์ž์ธ ์‹œ์Šคํ…œ DmsSymbolContent ์— ํ…์ŠคํŠธ ์ ์šฉ
uson1004 Jan 3, 2026
b8567d6
feat :: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋กœ์ง ๊ตฌํ˜„
uson1004 Jan 4, 2026
c316c49
feat :: design system dialog ๊ตฌํ˜„
uson1004 Jan 4, 2026
7fd03ea
feat :: ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„
uson1004 Jan 4, 2026
18593ae
feat :: SelectProfile NavHost์— ๋“ฑ๋ก
uson1004 Jan 4, 2026
7dbe1ca
build :: telephoto, permissions ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„
uson1004 Jan 5, 2026
a963b0d
feat :: ์ด๋ฏธ์ง€ read ๊ถŒํ•œ ์„ค์ •
uson1004 Jan 5, 2026
78e3336
feat :: selectProfile NavHost์— ๋“ฑ๋ก
uson1004 Jan 5, 2026
fa59029
feat :: selectProfile ui ๊ตฌํ˜„
uson1004 Jan 5, 2026
76ea845
feat :: ํ”„๋กœํ•„ ์กฐ์ • ์Šคํฌ๋ฆฐ ๊ตฌํ˜„
uson1004 Jan 5, 2026
fa6d38a
refactor :: ์„ ํƒ ํ•ด์ œ ์—†์ด ๋‹ค๋ฅธ ์š”์†Œ ์„ ํƒ์œผ๋กœ button enabled ๋น„ํ™œ์„ฑํ™” ๊ฐœ์„ 
uson1004 Jan 5, 2026
70c3250
feat :: ํ”„๋กœํ•„ ์กฐ์ • ui ๊ตฌํ˜„
uson1004 Jan 5, 2026
6875c99
feat :: file data ๊ตฌํ˜„
uson1004 Jan 5, 2026
c00eaec
refactor :: file upload response ๋ชจ๋ธ ๊ตฌํ˜„
uson1004 Jan 5, 2026
275a56e
feat :: ํ† ์ŠคํŠธ ๊ตฌํ˜„
uson1004 Jan 5, 2026
e1fd3a8
refactor :: ์ด๋ฏธ์ง€ ์„ ํƒ ์—…๋กœ๋“œ ๋ฐฉ์‹ ๊ฐœ์„ 
uson1004 Jan 5, 2026
47bdf1d
refactor :: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ํ™•์ธ ์ ์šฉ
uson1004 Jan 6, 2026
7fadcd0
refactor :: ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ ์ ์šฉ
uson1004 Jan 6, 2026
39c90a0
refactor :: ๋ชจ๋‹ฌ title ์‚ฌ์ด์ฆˆ ์กฐ์ •
uson1004 Jan 6, 2026
86a792a
refactor :: ์•ˆ์“ฐ์ด๋Š” ํŒŒ์ผ ์ œ๊ฑฐ
uson1004 Jan 6, 2026
5aad9fc
refactor :: deviceToken ์ €์žฅ ํ›„ ์ฒ˜๋ฆฌ ๊ฐœ์„ 
uson1004 Jan 7, 2026
b35db89
refactor :: sdk 33 ์ดํ•˜ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ตฌํ˜„
uson1004 Jan 7, 2026
3d147f0
refactor :: ๋งˆ์ดํŽ˜์ด์ง€ ์ •๋ณด ์กฐํšŒ ์‹คํŒจ ์‹œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ ์šฉ
uson1004 Jan 7, 2026
d235cfa
refactor :: vote data resultStore๋กœ stableํ•˜๊ฒŒ ์ „๋‹ฌ
uson1004 Jan 7, 2026
d5b84fa
chore :: ์ž์ž˜ํ•œ ๋กœ์ง ์ˆ˜์ •
uson1004 Jan 7, 2026
1271bcb
chore :: ์ด๋ฏธ์ง€ ์กฐํšŒ ๋ทฐ๋ชจ๋ธ ์Šค์ฝ”ํ”„ ๋ณ€๊ฒฝ
uson1004 Jan 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/dev/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

Choose a reason for hiding this comment

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

high

READ_MEDIA_IMAGES ๊ถŒํ•œ์€ API 33 ์ด์ƒ์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. minSdk๊ฐ€ 26์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ํ•˜์œ„ ๋ฒ„์ „(API 32 ์ดํ•˜)์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด READ_EXTERNAL_STORAGE ๊ถŒํ•œ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. maxSdkVersion="32" ์†์„ฑ๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฒ„์ „๋ณ„๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์ด ์‚ฌ์šฉ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, SelectProfileScreen.kt์—์„œ ๊ถŒํ•œ์„ ์š”์ฒญํ•  ๋•Œ๋„ Build.VERSION.SDK_INT์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Suggested change
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />


<application
android:name="team.aliens.dms.android.app.DevApplication"
Expand Down
260 changes: 176 additions & 84 deletions app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package team.aliens.dms.android.app

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Scaffold
Expand All @@ -19,18 +18,24 @@ import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.ui.NavDisplay
import kotlinx.coroutines.flow.StateFlow
import kotlinx.serialization.Serializable
import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBar
import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBarVisuals
import team.aliens.dms.android.core.ui.navigation.LocalResultStore
import team.aliens.dms.android.core.ui.navigation.rememberResultStore
import team.aliens.dms.android.data.point.model.PointType
import team.aliens.dms.android.feature.main.application.navigation.ApplicationRoute
import team.aliens.dms.android.feature.main.home.navigation.HomeRoute
import team.aliens.dms.android.feature.main.mypage.navigation.MyPageRoute
import team.aliens.dms.android.feature.meal.navigation.MealRoute
import team.aliens.dms.android.feature.onboarding.navigation.OnboardingRoute
import team.aliens.dms.android.feature.point.navigation.PointHistoryRoute
import team.aliens.dms.android.feature.profile.route.AdjustProfileRoute
import team.aliens.dms.android.feature.profile.route.SelectProfileRoute
import team.aliens.dms.android.feature.remain.navigation.RemainApplicationRoute
import team.aliens.dms.android.feature.resetpassword.navigation.CheckPasswordRoute
import team.aliens.dms.android.feature.resetpassword.navigation.ResetPasswordRoute
import team.aliens.dms.android.feature.setting.navigation.SettingRoute
import team.aliens.dms.android.feature.signin.navigation.SignInRoute
import team.aliens.dms.android.feature.vote.navigation.VoteRoute

Expand Down Expand Up @@ -58,15 +63,32 @@ data object RemainScreenNav : NavKey
@Serializable
data object MyPageScreenNav : NavKey

@Serializable
data object SettingScreenNav : NavKey

@Serializable
data class PointHistoryScreenNav(val pointType: PointType) : NavKey

@Serializable
data object CheckPasswordScreenNav : NavKey

@Serializable
data object ResetPasswordScreenNav : NavKey

@Serializable
data object SelectProfileScreenNav : NavKey

@Serializable
data class AdjustProfileScreenNav(val model: String) : NavKey

@Composable
fun DmsApp(
windowSizeClass: WindowSizeClass,
isJwtAvailable: StateFlow<Boolean>,
isJwtAvailable: Boolean,
mainViewModel: MainActivityViewModel,
appState: DmsAppState = rememberDmsAppState(),
) {
val isOnboardingCompleted by mainViewModel.isOnboardingCompleted.collectAsState()
val isJwtAvailableState by isJwtAvailable.collectAsState()

val backStack = rememberNavBackStack(OnboardingScreenNav)
val resultStore = rememberResultStore()
Expand All @@ -77,10 +99,10 @@ fun DmsApp(
MyPageScreenNav,
)

LaunchedEffect(isOnboardingCompleted, isJwtAvailableState) {
LaunchedEffect(isOnboardingCompleted, isJwtAvailable) {
val initialScreen = when {
!isOnboardingCompleted -> OnboardingScreenNav
isJwtAvailableState -> HomeScreenNav
isJwtAvailable -> HomeScreenNav
else -> SignInScreenNav
}

Expand Down Expand Up @@ -113,87 +135,157 @@ fun DmsApp(
CompositionLocalProvider(LocalResultStore provides resultStore) {
NavDisplay(
modifier = Modifier
.padding(paddingValues)
.navigationBarsPadding(),
.padding(paddingValues),
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
entry<OnboardingScreenNav> {
OnboardingRoute(
navigateToSignIn = {
backStack.clear()
backStack.add(SignInScreenNav)
},
)
}
entry<SignInScreenNav> {
SignInRoute(
navigateToMain = {
backStack.clear()
backStack.add(HomeScreenNav)
},
navigateToSignUp = {},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<HomeScreenNav> {
HomeRoute(
onNavigateMeal = {
backStack.add(MealScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<ApplicationScreenNav> {
ApplicationRoute(
onNavigateRemainApplication = {
backStack.add(RemainScreenNav)
},
onNavigateOutingApplication = {},
onNavigateVolunteerApplication = {},
onNavigateVote = {
backStack.add(VoteScreenNav(it.topicName, it.startTime.toString(), it.endTime.toString()))
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<VoteScreenNav> { voteNav ->
VoteRoute(
title = voteNav.title,
startTime = voteNav.startTime,
endTime = voteNav.endTime,
onNavigateBack = { backStack.remove(VoteScreenNav(voteNav.title, voteNav.startTime, voteNav.endTime)) },
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
}
)
}
entry<RemainScreenNav> {
RemainApplicationRoute(
onNavigateBack = { title ->
resultStore.setResult<String?>("remain_application_result", title)
backStack.remove(RemainScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
}
)
}
entry<MyPageScreenNav> {
MyPageRoute()
}
entry<MealScreenNav> {
MealRoute(
onNavigateBack = { backStack.remove(MealScreenNav) }
)
}
},
entry<OnboardingScreenNav> {
OnboardingRoute(
navigateToSignIn = {
backStack.clear()
backStack.add(SignInScreenNav)
},
)
}
entry<SignInScreenNav> {
SignInRoute(
navigateToMain = {
backStack.clear()
backStack.add(HomeScreenNav)
},
navigateToSignUp = {},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<HomeScreenNav> {
HomeRoute(
onNavigatePointHistory = {
backStack.add(PointHistoryScreenNav(it))
},
onNavigateMeal = {
backStack.add(MealScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<ApplicationScreenNav> {
ApplicationRoute(
onNavigateRemainApplication = {
backStack.add(RemainScreenNav)
},
onNavigateOutingApplication = {},
onNavigateVolunteerApplication = {},
onNavigateVote = {
backStack.add(VoteScreenNav(it.topicName, it.startTime.toString(), it.endTime.toString()))
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<VoteScreenNav> { voteNav ->
VoteRoute(
title = voteNav.title,
startTime = voteNav.startTime,
endTime = voteNav.endTime,
onNavigateBack = { backStack.remove(VoteScreenNav(voteNav.title, voteNav.startTime, voteNav.endTime)) },
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
}
)
}
entry<RemainScreenNav> {
RemainApplicationRoute(
onNavigateBack = { title ->
resultStore.setResult<String?>("remain_application_result", title)
backStack.remove(RemainScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
}
)
}
entry<MyPageScreenNav> {
MyPageRoute(
onNavigatePointHistory = {
backStack.add(PointHistoryScreenNav(it))
},
onNavigateSetting = {
backStack.add(SettingScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<MealScreenNav> {
MealRoute(
onNavigateBack = { backStack.remove(MealScreenNav) }
)
}
entry<SettingScreenNav> {
SettingRoute(
onBackPressed = { backStack.remove(SettingScreenNav) },
onNavigateResetPassword = { backStack.add(CheckPasswordScreenNav) },
onNavigateSelectProfile = { backStack.add(SelectProfileScreenNav) },
onNavigateSignIn = {
backStack.clear()
backStack.add(SignInScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
}
)
}
entry<PointHistoryScreenNav> {
PointHistoryRoute(
onBackClick = { backStack.remove(PointHistoryScreenNav(it.pointType)) }
)
}
entry<ResetPasswordScreenNav> {
ResetPasswordRoute(
onBackPressed = { backStack.removeLastOrNull() },
onNavigateSetting = {
backStack.removeLastOrNull()
backStack.remove(CheckPasswordScreenNav)
},
onShowSnackBar = { snackBar, message ->
appState.showSnackBar(snackBar, message)
},
)
}
entry<CheckPasswordScreenNav> {
CheckPasswordRoute(
onBackPressed = { backStack.remove(CheckPasswordScreenNav) },
onNavigateResetPassword = { backStack.add(ResetPasswordScreenNav) },
onShowSnackBar = { snackBar, message ->
appState.showSnackBar(snackBar, message)
}
)
}
entry<SelectProfileScreenNav> {
SelectProfileRoute(
onBackPressed = { backStack.remove(SelectProfileScreenNav) },
onNavigateAdjustProfile = { backStack.add(AdjustProfileScreenNav(model = it)) },
onShowSnackBar = { snackBar, message ->
appState.showSnackBar(snackBar, message)
}
)
}
entry<AdjustProfileScreenNav> {
AdjustProfileRoute(
onBackPressed = { backStack.remove(AdjustProfileScreenNav(it.model)) },
model = it.model,
onShowSnackBar = { snackBar, message ->
appState.showSnackBar(snackBar, message)
}
)
}
},
)
}
SnackbarHost(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package team.aliens.dms.android.app

import android.os.Bundle
import android.util.Log
import android.view.WindowManager
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
Expand Down Expand Up @@ -60,7 +61,7 @@ class MainActivity : ComponentActivity() {
DmsTheme {
DmsApp(
windowSizeClass = windowSizeClass,
isJwtAvailable = isJwtAvailable,
isJwtAvailable = isJwtAvailable.value,
mainViewModel = mainViewModel,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,10 @@ fun DmsLayeredButton(
buttonType: ButtonType,
buttonColor: ButtonColor,
enabled: Boolean = true,
shape: RoundedCornerShape,
shape: RoundedCornerShape = RoundedCornerShape(
topStart = 32.dp,
topEnd = 32.dp,
),
backgroundColor: Color = DmsTheme.colorScheme.surfaceVariant,
layerOffset: Dp = 24.dp,
isLoading: Boolean,
Expand All @@ -370,7 +373,6 @@ fun DmsLayeredButton(
Box(
modifier = modifier
.background(color = Color.White, shape = shape)
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(layerOffset),
) {
DmsButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package team.aliens.dms.android.core.designsystem.button

import androidx.annotation.DrawableRes
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Row
Expand All @@ -20,6 +21,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
Expand All @@ -31,7 +33,7 @@ import team.aliens.dms.android.core.designsystem.util.clickable
@Composable
fun DmsItemButton(
modifier: Modifier = Modifier,
iconRes: Painter,
@DrawableRes iconRes: Int,
text: String,
enabled: Boolean = true,
onClick: () -> Unit,
Expand Down Expand Up @@ -61,8 +63,9 @@ fun DmsItemButton(
verticalAlignment = Alignment.CenterVertically,
) {
Image(
modifier = Modifier.size(24.dp),
painter = iconRes,
modifier = Modifier
.size(24.dp),
painter = painterResource(iconRes),
contentDescription = null,
)
Text(
Expand Down
Loading
Loading