Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
d1389f4
feat :: dmsTab, TabRow κ΅¬ν˜„
uson1004 Dec 25, 2025
07b7176
feat :: applicationContent κ΅¬ν˜„
uson1004 Dec 25, 2025
f7f24f2
feat :: voting repository κ΅¬ν˜„
uson1004 Dec 26, 2025
b83a1cb
feat :: voteContent κ΅¬ν˜„
uson1004 Dec 26, 2025
489f189
feat :: application screen navhost μ—°κ²°
uson1004 Dec 26, 2025
0ad1246
feat :: μž”λ₯˜ μ‹ μ²­ screen κ΅¬ν˜„
uson1004 Dec 26, 2025
b1f9bc0
refactor :: dataλͺ¨λ“ˆ remain repository κ΅¬ν˜„
uson1004 Dec 26, 2025
b67332a
refactor :: μž”λ₯˜ μ‹ μ²­ λ·°λͺ¨λΈ κ΅¬ν˜„
uson1004 Dec 26, 2025
c1eb5a0
feat :: μž”λ₯˜ μ‹ μ²­ screen κ΅¬ν˜„
uson1004 Dec 26, 2025
60285c5
refactor :: maxLine에 맞게 크기 μ§€μ •ν•˜λ„λ‘ λ³€κ²½
uson1004 Dec 27, 2025
5bf40d7
feat :: Meal Screen scroll 적용
uson1004 Dec 27, 2025
be65977
refactor :: applicationCard appliedText κ°œμ„ 
uson1004 Dec 27, 2025
1f3f44c
feat :: λ°±μŠ€νƒμœΌλ‘œ 데이터 전달할 수 있게 resultStore κ΅¬ν˜„
uson1004 Dec 27, 2025
eacf820
refactor :: μž”λ₯˜ μ‹ μ²­ μ‹œκ°„ 둜직 κ°œμ„ 
uson1004 Dec 27, 2025
2167158
feat :: μž”λ₯˜ μ‹ μ²­ ν† μŠ€νŠΈ κ΅¬ν˜„
uson1004 Dec 27, 2025
24183d0
refactor :: application screen appliedText ui 적용 및 μˆ˜μ •
uson1004 Dec 27, 2025
4c54f55
fix :: νˆ¬ν‘œ 쑰회 λžŒλ‹€ μ§€μ •ν•˜μ—¬ 데이터 적용
uson1004 Dec 27, 2025
6157fdc
refactor :: μž”λ₯˜ μ‹ μ²­ 데이터 λ‘œμ»¬μ— μ €μž₯
uson1004 Dec 27, 2025
bdbc00a
refactor :: νŒ¨ν‚€μ§€ 루트 μˆ˜μ •
uson1004 Dec 28, 2025
6630bb5
refactor :: vote navHost 등둝
uson1004 Dec 28, 2025
42fcb52
feat :: νˆ¬ν‘œ μ•„μ΄μ½˜ 및 Shadow modifier μΆ”κ°€
uson1004 Dec 28, 2025
0c5bdbd
refactor :: voting 데이터 λ ˆμ΄μ–΄ μˆ˜μ •
uson1004 Dec 28, 2025
d578bf1
feat :: νˆ¬ν‘œ UI μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„
uson1004 Dec 28, 2025
7ac60c6
feat :: νˆ¬ν‘œ ν™”λ©΄ 및 ViewModel κ΅¬ν˜„
uson1004 Dec 28, 2025
009e581
refactor :: μ•± μ„€μ • 및 μœ ν‹Έ μˆ˜μ •
uson1004 Dec 28, 2025
33f9f15
feat :: vote screen localtime κ΅¬ν˜„
uson1004 Dec 28, 2025
5ce938a
feat :: DmsLayeredButton κ΅¬ν˜„
uson1004 Dec 29, 2025
55af2a7
refactor :: vote api, dataSource result 객체둜 λž˜ν•‘
uson1004 Dec 29, 2025
3b46807
refactor :: 데이터 λͺ¨λΈ νƒ€μž… λ³€κ²½
uson1004 Dec 29, 2025
cff3a34
refactor :: minSdk 26으둜 λ³€κ²½
uson1004 Dec 29, 2025
d79859d
refactor :: JwtProviderImpl μ—λŸ¬ 처리 μΆ”κ°€
uson1004 Dec 29, 2025
f08f3d1
refactor :: 컬러 ν•˜λ“œ μ½”λ”© μˆ˜μ •
uson1004 Dec 29, 2025
8520fe7
chore :: unused import remove
uson1004 Dec 29, 2025
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
6 changes: 1 addition & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ android {
applicationIdSuffix = ".dev"
versionNameSuffix = "-dev"
buildConfigField("String", "ENVIRONMENT", "\"dev\"")

compileOptions {
isCoreLibraryDesugaringEnabled = true
}
}

create("prod") {
Expand Down Expand Up @@ -144,7 +140,7 @@ dependencies {
implementation(libs.material)

implementation(libs.javax.inject)
coreLibraryDesugaring(libs.desugar.jdk.libs)
// coreLibraryDesugaring(libs.desugar.jdk.libs)

implementation(libs.okhttp)
implementation(libs.okhttp.interceptor.logging)
Expand Down
68 changes: 58 additions & 10 deletions app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
Expand All @@ -22,12 +23,16 @@ 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.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.remain.navigation.RemainApplicationRoute
import team.aliens.dms.android.feature.signin.navigation.SignInRoute
import team.aliens.dms.android.feature.vote.navigation.VoteRoute

@Serializable
data object OnboardingScreenNav : NavKey
Expand All @@ -44,6 +49,12 @@ data object MealScreenNav : NavKey
@Serializable
data object ApplicationScreenNav : NavKey

@Serializable
data class VoteScreenNav(val title: String, val startTime: String, val endTime: String) : NavKey

@Serializable
data object RemainScreenNav : NavKey

@Serializable
data object MyPageScreenNav : NavKey

Expand All @@ -58,6 +69,7 @@ fun DmsApp(
val isJwtAvailableState by isJwtAvailable.collectAsState()

val backStack = rememberNavBackStack(OnboardingScreenNav)
val resultStore = rememberResultStore()
val currentScreen = backStack.lastOrNull()
val shouldShowBottomBar = currentScreen in listOf(
HomeScreenNav,
Expand Down Expand Up @@ -98,13 +110,14 @@ fun DmsApp(
}
}
) { paddingValues ->
NavDisplay(
modifier = Modifier
.padding(paddingValues)
.navigationBarsPadding(),
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
CompositionLocalProvider(LocalResultStore provides resultStore) {
NavDisplay(
modifier = Modifier
.padding(paddingValues)
.navigationBarsPadding(),
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
entry<OnboardingScreenNav> {
OnboardingRoute(
navigateToSignIn = {
Expand Down Expand Up @@ -136,18 +149,53 @@ fun DmsApp(
)
}
entry<ApplicationScreenNav> {
ApplicationRoute()
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.removeLastOrNull() }
onNavigateBack = { backStack.remove(MealScreenNav) }
)
}
},
)
)
}
SnackbarHost(
modifier = Modifier
.statusBarsPadding()
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/ProjectProperties.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
object ProjectProperties {
const val COMPILE_SDK = 36
const val MIN_SDK = 24
const val MIN_SDK = 26
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟑 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Search for references to old minSdk values that might need updating

# Search for hardcoded references to API 24 or 25
rg -nP '\b(24|25)\b' --type=xml -g '**/AndroidManifest.xml' -C2

# Search for minSdkVersion references in XML files
rg -nP 'minSdkVersion.*["\']?(24|25)["\']?' --type=xml -C2

# Search for SDK_INT comparisons that might need adjustment
rg -nP 'SDK_INT\s*[<>=]+\s*(24|25|Build\.VERSION_CODES\.(N|N_MR1))' --type=kotlin --type=java -C3

Repository: team-aliens/DMS-Android

Length of output: 212


🏁 Script executed:

#!/bin/bash
# Description: Search for references to old minSdk values that might need updating

echo "=== Searching for minSdkVersion in XML files ==="
rg 'minSdkVersion' --type=xml -C2

echo ""
echo "=== Searching for hardcoded references to API 24 or 25 ==="
rg '\b(24|25)\b' --type=xml --type=kotlin --type=java -C1

echo ""
echo "=== Searching for SDK_INT comparisons with N or N_MR1 ==="
rg 'SDK_INT|Build\.VERSION_CODES\.(N|N_MR1)' --type=kotlin --type=java -C2

echo ""
echo "=== Checking current MIN_SDK definition ==="
rg 'MIN_SDK' --type=kotlin

Repository: team-aliens/DMS-Android

Length of output: 50380


🏁 Script executed:

#!/bin/bash
# More targeted search for minSdk configuration and version checks

echo "=== Searching for build.gradle files with minSdk ==="
fd -e gradle -e kts | head -20 | xargs grep -l minSdk 2>/dev/null || echo "No matches"

echo ""
echo "=== Checking actual minSdk values in gradle files ==="
fd -e gradle -e kts | xargs grep -n "minSdk" 2>/dev/null | head -20

echo ""
echo "=== Searching for SDK_INT version checks in code ==="
rg 'SDK_INT' --type=kotlin --type=java -A2 | head -40

echo ""
echo "=== Searching for Build.VERSION_CODES references ==="
rg 'Build\.VERSION_CODES\.(N|NOUGAT)' --type=kotlin --type=java | head -20

echo ""
echo "=== Verify ProjectProperties.kt content ==="
cat buildSrc/src/main/kotlin/ProjectProperties.kt

Repository: team-aliens/DMS-Android

Length of output: 5444


🏁 Script executed:

#!/bin/bash
# Check the TODO and look for any version checks that are now unnecessary

echo "=== MealWorker.kt context around TODO ==="
cat -n core/widget/src/prod/kotlin/team/aliens/dms/android/core/widget/MealWorker.kt | grep -A 10 -B 5 "TODO"

echo ""
echo "=== Searching for version checks <= 26 that are now always true or false ==="
rg 'SDK_INT\s*[<].*\s*(26|25|24|O|N)' --type=kotlin --type=java

echo ""
echo "=== Check if there are conditions that assume API < 26 ==="
rg 'SDK_INT\s*<\s*(26|Build\.VERSION_CODES\.O)' --type=kotlin --type=java

Repository: team-aliens/DMS-Android

Length of output: 1333


Remove unreachable code in MealWorker.kt related to the minSdk increase.

The change from minSdk 24 to 26 is complete with no residual references to APIs 24-25 found in the codebase. However, the else branch in MealWorker.kt (line 42) containing TODO("VERSION.SDK_INT < O") is now unreachable since Build.VERSION_CODES.O equals API level 26. Remove this dead code path and keep only the PeriodicWorkRequestBuilder branch.

πŸ€– Prompt for AI Agents
In buildSrc/src/main/kotlin/ProjectProperties.kt (minSdk changed to 26) and in
app/src/.../MealWorker.kt around line 42, remove the unreachable else branch
that contains TODO("VERSION.SDK_INT < O") and any dead references to
VERSION.SDK_INT checks; keep only the PeriodicWorkRequestBuilder branch (the
code path for API >= O), delete the else block and its TODO, and remove any
now-unused imports or variables introduced solely for that dead branch.

const val TARGET_SDK = 36
const val VERSION_CODE = 28
const val VERSION_NAME = "1.5.3"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
Expand All @@ -21,6 +27,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import team.aliens.dms.android.core.designsystem.DmsTheme
import team.aliens.dms.android.core.designsystem.bodyM
Expand Down Expand Up @@ -308,8 +315,6 @@ fun DmsButton(
PaddingValues(horizontal = 20.dp, vertical = 16.dp)
}

// val buttonShape = if (buttonType == ButtonType.Rounded) RoundedCornerShape(24.dp) else shape

BasicButton(
modifier = modifier,
backgroundColor = backgroundColor,
Expand Down Expand Up @@ -349,3 +354,35 @@ fun DmsButton(
}
}
}
@Composable
fun DmsLayeredButton(
modifier: Modifier = Modifier,
text: String,
buttonType: ButtonType,
buttonColor: ButtonColor,
enabled: Boolean = true,
shape: RoundedCornerShape,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟑 Minor

Shape parameter not forwarded to inner button despite comment intent.

The Korean comment on line 386-387 indicates the intention to pass a shape to the button, but the DmsButton call doesn't include a shape parameter. Additionally, the parameter is restricted to RoundedCornerShape while DmsButton accepts any Shape, making this inconsistently restrictive.

πŸ”Ž Proposed fix to forward shape parameter

If the intent is to pass the shape to the inner button:

         DmsButton(
             modifier = Modifier
                 .fillMaxWidth()
                 .align(Alignment.Center),
             text = text,
             buttonType = buttonType,
             buttonColor = buttonColor,
             enabled = enabled,
-            // 3. λ²„νŠΌμ—λ„ λ³„λ„μ˜ shapeλ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
+            shape = shape,
             isLoading = isLoading,
             onClick = onClick,
         )

Alternatively, if the outer shape should remain independent, consider removing the misleading comment and updating the parameter type to accept generic Shape:

-    shape: RoundedCornerShape,
+    shape: Shape,

Also applies to: 378-389

πŸ€– Prompt for AI Agents
In
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/Button.kt
around line 366 (and similarly 378–389), the shape parameter is declared as
RoundedCornerShape but is not forwarded to the inner DmsButton call and the type
is unnecessarily restrictive; update the outer function to accept a generic
Shape (androidx.compose.ui.graphics.Shape) and pass that shape through to the
inner DmsButton shape parameter, or if outer shape should not be forwarded,
remove or update the misleading comment and change the parameter type to Shape
(or remove it entirely) so the signature and behavior are consistent.

backgroundColor: Color = DmsTheme.colorScheme.surfaceVariant,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | πŸ”΄ Critical

Critical: backgroundColor parameter is unused; hard-coded white breaks theming.

Two related issues:

  1. The backgroundColor parameter (line 365) is declared with a theme-aware default but never used in the function body.
  2. Line 372 hard-codes Color.White for the background, breaking theming and dark mode support.

This suggests an incomplete implementation where the developer likely intended to use the backgroundColor parameter instead of the hard-coded value.

πŸ”Ž Proposed fix
     Box(
         modifier = modifier
-            .background(color = Color.White, shape = shape)
+            .background(color = backgroundColor, shape = shape)
             .windowInsetsPadding(WindowInsets.navigationBars)
             .padding(layerOffset),
     ) {

Also applies to: 372-372

πŸ€– Prompt for AI Agents
In
core/design-system/src/dev/java/team/aliens/dms/android/core/designsystem/button/Button.kt
around lines 365 and 372, the backgroundColor parameter declared at line 365 is
never used and the composable hard-codes Color.White at line 372, breaking
theming and dark mode; fix this by replacing the hard-coded Color.White with the
backgroundColor parameter (or a resolved theme-aware color) so the
passed-in/default DmsTheme.colorScheme.surfaceVariant is actually applied, and
remove any unused imports/values if they become redundant.

layerOffset: Dp = 24.dp,
isLoading: Boolean,
onClick: () -> Unit,
) {
Box(
modifier = modifier
.background(color = Color.White, shape = shape)
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(layerOffset),
) {
DmsButton(
modifier = Modifier
.fillMaxWidth()
.align(Alignment.Center),
text = text,
buttonType = buttonType,
buttonColor = buttonColor,
enabled = enabled,
isLoading = isLoading,
onClick = onClick,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package team.aliens.dms.android.core.designsystem.card

import androidx.annotation.DrawableRes
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
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.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
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.bodyB
import team.aliens.dms.android.core.designsystem.endPadding
import team.aliens.dms.android.core.designsystem.foundation.DmsIcon
import team.aliens.dms.android.core.designsystem.labelB
import team.aliens.dms.android.core.designsystem.labelM
import team.aliens.dms.android.core.designsystem.util.clickable

@Composable
fun DmsApplicationCard(
modifier: Modifier = Modifier,
title: String,
description: String? = null,
period: String? = null,
appliedTitle: String? = null,
@DrawableRes iconRes: Int,
isSelected: Boolean = false,
onClick: () -> Unit,
) {
val borderColor by animateColorAsState(
targetValue = if (isSelected) {
DmsTheme.colorScheme.onPrimaryContainer
} else {
DmsTheme.colorScheme.surfaceTint
},
)
Column(
modifier = modifier
.fillMaxWidth()
.clip(RoundedCornerShape(32.dp))
.background(DmsTheme.colorScheme.surfaceTint)
.clickable(onClick = onClick)
.border(
width = 2.dp,
color = borderColor,
shape = RoundedCornerShape(32.dp),
)
.padding(horizontal = 16.dp, vertical = 24.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
) {
Image(
modifier = Modifier.size(32.dp),
painter = painterResource(iconRes),
contentDescription = null,
)
Text(
modifier = Modifier.padding(start = 8.dp),
text = title,
style = DmsTheme.typography.bodyB,
color = DmsTheme.colorScheme.inverseOnSurface,
)
Spacer(modifier = Modifier.weight(1f))
if (description == null && appliedTitle != null) {
AppliedTitleText(
modifier = Modifier.endPadding(16.dp),
appliedTitle = appliedTitle,
)
}
Icon(
painter = painterResource(DmsIcon.Forward),
tint = DmsTheme.colorScheme.scrim,
contentDescription = null,
)
}
period?.let {
Text(
text = period,
style = DmsTheme.typography.labelM,
color = DmsTheme.colorScheme.onPrimaryContainer,
)
}
description?.let {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
) {
Text(
text = description,
style = DmsTheme.typography.labelM,
color = DmsTheme.colorScheme.inverseSurface,
)
Spacer(modifier = Modifier.weight(1f))
appliedTitle?.let {
AppliedTitleText(appliedTitle = appliedTitle)
}
}
}
}
}

@Composable
private fun AppliedTitleText(
modifier: Modifier = Modifier,
appliedTitle: String,
) {
Text(
modifier = modifier
.background(
color = DmsTheme.colorScheme.primary,
shape = RoundedCornerShape(6.dp),
)
.padding(horizontal = 22.dp, vertical = 8.dp),
text = appliedTitle,
style = DmsTheme.typography.labelB,
color = DmsTheme.colorScheme.onPrimaryContainer,
)
}
Loading
Loading