Skip to content

Commit 5b2a292

Browse files
authored
πŸ”€ :: (#810) ν™ˆ ν™”λ©΄ κ΅¬ν˜„
πŸ”€ :: (#810) ν™ˆ ν™”λ©΄ κ΅¬ν˜„
2 parents 4925831 + 93976dd commit 5b2a292

File tree

120 files changed

+1860
-181
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+1860
-181
lines changed

β€Žapp/build.gradle.ktsβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ android {
3535
applicationIdSuffix = ".dev"
3636
versionNameSuffix = "-dev"
3737
buildConfigField("String", "ENVIRONMENT", "\"dev\"")
38+
39+
compileOptions {
40+
isCoreLibraryDesugaringEnabled = true
41+
}
3842
}
3943

4044
create("prod") {
@@ -140,6 +144,7 @@ dependencies {
140144
implementation(libs.material)
141145

142146
implementation(libs.javax.inject)
147+
coreLibraryDesugaring(libs.desugar.jdk.libs)
143148

144149
implementation(libs.okhttp)
145150
implementation(libs.okhttp.interceptor.logging)

β€Žapp/src/dev/AndroidManifest.xmlβ€Ž

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5+
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
7+
<uses-permission android:name="android.permission.CAMERA" />
8+
<uses-permission android:name="android.permission.VIBRATE" />
9+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
10+
511
<application
612
android:name="team.aliens.dms.android.app.DevApplication"
713
tools:replace="android:name">
@@ -24,5 +30,19 @@
2430
<category android:name="android.intent.category.LAUNCHER" />
2531
</intent-filter>
2632
</activity>
33+
34+
<service android:name=".android.app.service.DmsMessagingService"
35+
android:exported="true">
36+
<intent-filter>
37+
<action android:name="com.google.firebase.MESSAGING_EVENT" />
38+
</intent-filter>
39+
</service>
40+
41+
<meta-data
42+
android:name="com.google.firebase.messaging.default_notification_channel_id"
43+
android:value="@string/default_notification_channel_id" />
44+
<meta-data
45+
android:name="com.google.firebase.messaging.default_notification_color"
46+
android:resource="@color/primary" />
2747
</application>
2848
</manifest>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package team.aliens.dms.android.app
2+
3+
import androidx.annotation.DrawableRes
4+
import androidx.navigation3.runtime.NavKey
5+
import team.aliens.dms.android.core.designsystem.foundation.DmsIcon
6+
import team.aliens.dms.android.feature.main.application.navigation.ApplicationRoute
7+
import team.aliens.dms.android.feature.main.home.navigation.HomeRoute
8+
import team.aliens.dms.android.feature.main.mypage.navigation.MyPageRoute
9+
10+
sealed class BottomMenu(
11+
val route: NavKey,
12+
@DrawableRes val icon: Int,
13+
@DrawableRes val selectedIcon: Int,
14+
val title: String,
15+
) {
16+
data object Home : BottomMenu(
17+
route = HomeScreenNav,
18+
icon = DmsIcon.Home,
19+
selectedIcon = DmsIcon.HomeFill,
20+
title = "ν™ˆ",
21+
)
22+
23+
data object Application : BottomMenu(
24+
route = ApplicationScreenNav,
25+
icon = DmsIcon.CheckCircle,
26+
selectedIcon = DmsIcon.CheckCircleFill,
27+
title = "μ‹ μ²­",
28+
)
29+
30+
data object MyPage : BottomMenu(
31+
route = MyPageScreenNav,
32+
icon = DmsIcon.MyPage,
33+
selectedIcon = DmsIcon.MyPageFill,
34+
title = "λ§ˆμ΄νŽ˜μ΄μ§€",
35+
)
36+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package team.aliens.dms.android.app
2+
3+
import androidx.compose.animation.animateColorAsState
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.size
8+
import androidx.compose.foundation.shape.RoundedCornerShape
9+
import androidx.compose.material3.BottomAppBar
10+
import androidx.compose.material3.Icon
11+
import androidx.compose.material3.NavigationBarItem
12+
import androidx.compose.material3.NavigationBarItemColors
13+
import androidx.compose.material3.NavigationBarItemDefaults
14+
import androidx.compose.material3.Text
15+
import androidx.compose.runtime.Composable
16+
import androidx.compose.runtime.getValue
17+
import androidx.compose.ui.Alignment
18+
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.draw.clip
20+
import androidx.compose.ui.graphics.Color
21+
import androidx.compose.ui.res.painterResource
22+
import androidx.compose.ui.unit.dp
23+
import androidx.navigation3.runtime.NavKey
24+
import team.aliens.dms.android.core.designsystem.DmsTheme
25+
import team.aliens.dms.android.core.designsystem.labelB
26+
27+
private val bottomMenus = listOf(
28+
BottomMenu.Home,
29+
BottomMenu.Application,
30+
BottomMenu.MyPage,
31+
)
32+
33+
@Composable
34+
fun BottomNavigationBar(
35+
currentScreen: NavKey?,
36+
onNavigate: (NavKey) -> Unit,
37+
) {
38+
39+
BottomAppBar(
40+
modifier = Modifier
41+
.fillMaxWidth()
42+
.clip(RoundedCornerShape(topStart = 32.dp, topEnd = 32.dp)),
43+
containerColor = DmsTheme.colorScheme.surfaceTint,
44+
) {
45+
bottomMenus.forEach { destination ->
46+
val selected = currentScreen == destination.route
47+
val color by animateColorAsState(
48+
targetValue = if (selected) {
49+
DmsTheme.colorScheme.inverseOnSurface
50+
} else {
51+
DmsTheme.colorScheme.scrim
52+
},
53+
)
54+
55+
NavigationBarItem(
56+
selected = selected,
57+
enabled = !selected,
58+
onClick = {
59+
onNavigate(destination.route)
60+
},
61+
colors = NavigationBarItemDefaults.colors(
62+
indicatorColor = Color.Transparent,
63+
),
64+
icon = {
65+
Column(
66+
horizontalAlignment = Alignment.CenterHorizontally,
67+
) {
68+
Icon(
69+
modifier = Modifier.size(32.dp),
70+
painter = painterResource(id = if (selected) destination.selectedIcon else destination.icon),
71+
contentDescription = destination.title,
72+
tint = color,
73+
)
74+
Text(
75+
text = destination.title,
76+
style = DmsTheme.typography.labelB,
77+
color = color,
78+
)
79+
}
80+
},
81+
)
82+
}
83+
}
84+
}

β€Žapp/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.ktβ€Ž

Lines changed: 81 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package team.aliens.dms.android.app
22

33
import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.fillMaxWidth
5+
import androidx.compose.foundation.layout.navigationBarsPadding
56
import androidx.compose.foundation.layout.padding
67
import androidx.compose.foundation.layout.statusBarsPadding
78
import androidx.compose.foundation.layout.systemBarsPadding
9+
import androidx.compose.material3.Scaffold
810
import androidx.compose.material3.SnackbarHost
9-
import androidx.compose.material3.Text
1011
import androidx.compose.material3.windowsizeclass.WindowSizeClass
1112
import androidx.compose.runtime.Composable
1213
import androidx.compose.runtime.LaunchedEffect
@@ -15,16 +16,18 @@ import androidx.compose.runtime.getValue
1516
import androidx.compose.ui.Alignment
1617
import androidx.compose.ui.Modifier
1718
import androidx.compose.ui.unit.dp
18-
import androidx.compose.ui.zIndex
1919
import androidx.navigation3.runtime.NavKey
2020
import androidx.navigation3.runtime.entryProvider
2121
import androidx.navigation3.runtime.rememberNavBackStack
2222
import androidx.navigation3.ui.NavDisplay
2323
import kotlinx.coroutines.flow.StateFlow
2424
import kotlinx.serialization.Serializable
25-
import team.aliens.dms.android.core.designsystem.DmsTheme
2625
import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBar
2726
import team.aliens.dms.android.core.designsystem.snackbar.DmsSnackBarVisuals
27+
import team.aliens.dms.android.feature.main.application.navigation.ApplicationRoute
28+
import team.aliens.dms.android.feature.main.home.navigation.HomeRoute
29+
import team.aliens.dms.android.feature.main.mypage.navigation.MyPageRoute
30+
import team.aliens.dms.android.feature.meal.navigation.MealRoute
2831
import team.aliens.dms.android.feature.onboarding.navigation.OnboardingRoute
2932
import team.aliens.dms.android.feature.signin.navigation.SignInRoute
3033

@@ -35,7 +38,16 @@ data object OnboardingScreenNav : NavKey
3538
data object SignInScreenNav : NavKey
3639

3740
@Serializable
38-
data object MainScreenNav : NavKey
41+
data object HomeScreenNav : NavKey
42+
43+
@Serializable
44+
data object MealScreenNav : NavKey
45+
46+
@Serializable
47+
data object ApplicationScreenNav : NavKey
48+
49+
@Serializable
50+
data object MyPageScreenNav : NavKey
3951

4052
@Composable
4153
fun DmsApp(
@@ -48,11 +60,17 @@ fun DmsApp(
4860
val isJwtAvailableState by isJwtAvailable.collectAsState()
4961

5062
val backStack = rememberNavBackStack(OnboardingScreenNav)
63+
val currentScreen = backStack.lastOrNull()
64+
val shouldShowBottomBar = currentScreen in listOf(
65+
HomeScreenNav,
66+
ApplicationScreenNav,
67+
MyPageScreenNav,
68+
)
5169

5270
LaunchedEffect(isOnboardingCompleted, isJwtAvailableState) {
5371
val initialScreen = when {
5472
!isOnboardingCompleted -> OnboardingScreenNav
55-
isJwtAvailableState -> MainScreenNav
73+
isJwtAvailableState -> HomeScreenNav
5674
else -> SignInScreenNav
5775
}
5876

@@ -62,11 +80,29 @@ fun DmsApp(
6280
}
6381
}
6482

65-
Box(
66-
modifier = Modifier.fillMaxWidth(),
67-
) {
83+
Scaffold(
84+
bottomBar = {
85+
if (shouldShowBottomBar) {
86+
BottomNavigationBar(
87+
currentScreen = currentScreen,
88+
onNavigate = { destination ->
89+
if (currentScreen != destination) {
90+
backStack.removeAll {
91+
it is HomeScreenNav ||
92+
it is ApplicationScreenNav ||
93+
it is MyPageScreenNav
94+
}
95+
backStack.add(destination)
96+
}
97+
}
98+
)
99+
}
100+
}
101+
) { paddingValues ->
68102
NavDisplay(
69-
modifier = Modifier.systemBarsPadding(),
103+
modifier = Modifier
104+
.padding(paddingValues)
105+
.navigationBarsPadding(),
70106
backStack = backStack,
71107
onBack = { backStack.removeLastOrNull() },
72108
entryProvider = entryProvider {
@@ -80,35 +116,51 @@ fun DmsApp(
80116
}
81117
entry<SignInScreenNav> {
82118
SignInRoute(
83-
navigateToMain = { backStack.add(MainScreenNav) },
119+
navigateToMain = {
120+
backStack.clear()
121+
backStack.add(HomeScreenNav)
122+
},
84123
navigateToSignUp = {},
85124
onShowSnackBar = { snackBarType, message ->
86125
appState.showSnackBar(snackBarType, message)
87126
},
88127
)
89128
}
90-
entry<MainScreenNav> {
91-
Text(
92-
text = "Main Screen (TODO)",
93-
color = DmsTheme.colorScheme.onSurface,
129+
entry<HomeScreenNav> {
130+
HomeRoute(
131+
onNavigateMeal = {
132+
backStack.add(MealScreenNav)
133+
}
134+
)
135+
}
136+
entry<ApplicationScreenNav> {
137+
ApplicationRoute()
138+
}
139+
entry<MyPageScreenNav> {
140+
MyPageRoute()
141+
}
142+
entry<MealScreenNav> {
143+
MealRoute(
144+
onNavigateBack = { backStack.removeLastOrNull() }
94145
)
95146
}
96147
},
97148
)
98-
SnackbarHost(
99-
modifier = Modifier
100-
.align(Alignment.TopCenter)
101-
.statusBarsPadding()
102-
.padding(top = 16.dp)
103-
.zIndex(2f),
104-
hostState = appState.snackBarHostState,
105-
snackbar = {
106-
val visuals = it.visuals as? DmsSnackBarVisuals ?: return@SnackbarHost
107-
DmsSnackBar(
108-
snackBarType = visuals.snackBarType,
109-
message = visuals.message,
110-
)
111-
},
112-
)
149+
Box {
150+
SnackbarHost(
151+
modifier = Modifier
152+
.statusBarsPadding()
153+
.padding(top = 16.dp)
154+
.align(Alignment.Center),
155+
hostState = appState.snackBarHostState,
156+
snackbar = {
157+
val visuals = it.visuals as? DmsSnackBarVisuals ?: return@SnackbarHost
158+
DmsSnackBar(
159+
snackBarType = visuals.snackBarType,
160+
message = visuals.message,
161+
)
162+
},
163+
)
164+
}
113165
}
114166
}

β€Žapp/src/dev/kotlin/team/aliens/dms/android/app/di/app/AppConfigModule.ktβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import dagger.Module
44
import dagger.Provides
55
import dagger.hilt.InstallIn
66
import dagger.hilt.components.SingletonComponent
7-
import org.threeten.bp.ZoneOffset
7+
import java.time.ZoneOffset
88
import javax.inject.Singleton
99

1010
@Module

β€Žapp/src/prod/kotlin/team/aliens/dms/android/app/di/app/AppConfigModule.ktβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import dagger.Module
44
import dagger.Provides
55
import dagger.hilt.InstallIn
66
import dagger.hilt.components.SingletonComponent
7-
import org.threeten.bp.ZoneOffset
7+
import java.time.ZoneOffset
88
import javax.inject.Singleton
99

1010
@Module

β€ŽbuildSrc/src/main/kotlin/ProjectProperties.ktβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
object ProjectProperties {
22
const val COMPILE_SDK = 36
3-
const val MIN_SDK = 23
3+
const val MIN_SDK = 24
44
const val TARGET_SDK = 36
55
const val VERSION_CODE = 28
66
const val VERSION_NAME = "1.5.3"

β€Žcore/database/src/main/java/team/aliens/dms/android/core/database/converter/DateTypeConverter.ktβ€Ž

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package team.aliens.dms.android.core.database.converter
22

33
import androidx.room.ProvidedTypeConverter
44
import androidx.room.TypeConverter
5-
import org.threeten.bp.LocalDate
6-
import org.threeten.bp.LocalDateTime
7-
import org.threeten.bp.ZoneOffset
5+
import java.time.LocalDate
6+
import java.time.LocalDateTime
7+
import java.time.ZoneOffset
88
import team.aliens.dms.android.shared.date.toLocalDate
99
import team.aliens.dms.android.shared.date.toLocalDateTime
1010
import javax.inject.Inject

β€Žcore/database/src/main/java/team/aliens/dms/android/core/database/dao/MealDao.ktβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.room.Dao
44
import androidx.room.Insert
55
import androidx.room.OnConflictStrategy
66
import androidx.room.Query
7-
import org.threeten.bp.LocalDate
7+
import java.time.LocalDate
88
import team.aliens.dms.android.core.database.entity.MealEntity
99

1010
@Dao

0 commit comments

Comments
Β (0)