diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
index 25ed69d0..c1c37470 100644
--- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
+++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
@@ -7,13 +7,13 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navOptions
-import com.yapp.common.navigation.destination.OnboardingDestination
+import com.yapp.common.navigation.destination.MissionDestination
import com.yapp.common.navigation.destination.TopLevelDestination
class OrbitNavigator(
val navController: NavHostController,
) {
- val startDestination = OnboardingDestination.Route.route
+ val startDestination = MissionDestination.Route.route
private val currentDestination: NavDestination?
@Composable get() = navController
diff --git a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt b/core/common/src/main/java/com/yapp/common/navigation/Routes.kt
index d39203f6..5b607401 100644
--- a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt
+++ b/core/common/src/main/java/com/yapp/common/navigation/Routes.kt
@@ -24,4 +24,9 @@ object Routes {
const val ROUTE = "mypage_route"
const val MYPAGE = "mypage"
}
+
+ object Mission {
+ const val ROUTE = "mission_route"
+ const val MISSION = "mission"
+ }
}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt
new file mode 100644
index 00000000..3366da3d
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt
@@ -0,0 +1,8 @@
+package com.yapp.common.navigation.destination
+
+import com.yapp.common.navigation.Routes
+
+sealed class MissionDestination(val route: String) {
+ data object Route : MissionDestination(Routes.Mission.ROUTE)
+ data object Mission : MissionDestination(Routes.Mission.MISSION)
+}
diff --git a/core/designsystem/src/main/java/com/yapp/designsystem/theme/Theme.kt b/core/designsystem/src/main/java/com/yapp/designsystem/theme/Theme.kt
index 19008f08..3768269d 100644
--- a/core/designsystem/src/main/java/com/yapp/designsystem/theme/Theme.kt
+++ b/core/designsystem/src/main/java/com/yapp/designsystem/theme/Theme.kt
@@ -1,16 +1,10 @@
package com.yapp.designsystem.theme
-import android.app.Activity
-import android.graphics.drawable.ColorDrawable
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.remember
-import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.platform.LocalView
-import androidx.core.view.WindowCompat
fun orbitColors() = OrbitColors()
fun orbitFonts() = OrbitTypography()
@@ -31,15 +25,4 @@ fun OrbitTheme(
) {
ProvideTextStyle(typography.body2Medium, content = content)
}
-
- val view = LocalView.current
-
- if (!view.isInEditMode) {
- SideEffect {
- val window = (view.context as Activity).window
- window.statusBarColor = colors.gray_900.toArgb()
- window.setBackgroundDrawable(ColorDrawable(colors.gray_900.toArgb()))
- WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
- }
- }
}
diff --git a/core/designsystem/src/main/res/drawable-xhdpi/img_mission_main_background.png b/core/designsystem/src/main/res/drawable-xhdpi/img_mission_main_background.png
new file mode 100644
index 00000000..98cccb02
Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xhdpi/img_mission_main_background.png differ
diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/img_mission_main_background.png b/core/designsystem/src/main/res/drawable-xxhdpi/img_mission_main_background.png
new file mode 100644
index 00000000..501575a1
Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xxhdpi/img_mission_main_background.png differ
diff --git a/core/designsystem/src/main/res/drawable/ic_mission_main.xml b/core/designsystem/src/main/res/drawable/ic_mission_main.xml
new file mode 100644
index 00000000..b42bd971
--- /dev/null
+++ b/core/designsystem/src/main/res/drawable/ic_mission_main.xml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/designsystem/src/main/res/drawable/img_mission_main_background.png b/core/designsystem/src/main/res/drawable/img_mission_main_background.png
new file mode 100644
index 00000000..a10092c3
Binary files /dev/null and b/core/designsystem/src/main/res/drawable/img_mission_main_background.png differ
diff --git a/feature/mission/.gitignore b/feature/mission/.gitignore
new file mode 100644
index 00000000..42afabfd
--- /dev/null
+++ b/feature/mission/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/mission/build.gradle.kts b/feature/mission/build.gradle.kts
new file mode 100644
index 00000000..8549b07d
--- /dev/null
+++ b/feature/mission/build.gradle.kts
@@ -0,0 +1,19 @@
+import com.yapp.convention.setNamespace
+
+plugins {
+ id("orbit.android.feature")
+}
+
+android {
+ setNamespace("feature.mission")
+}
+
+dependencies {
+ implementation(projects.core.ui)
+ implementation(projects.core.common)
+ implementation(libs.orbit.core)
+ implementation(libs.orbit.compose)
+ implementation(libs.orbit.viewmodel)
+ implementation(libs.coil.compose)
+ implementation(libs.coil.gif)
+}
diff --git a/feature/mission/consumer-rules.pro b/feature/mission/consumer-rules.pro
new file mode 100644
index 00000000..e69de29b
diff --git a/feature/mission/proguard-rules.pro b/feature/mission/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/feature/mission/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/mission/src/main/AndroidManifest.xml b/feature/mission/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..8bdb7e14
--- /dev/null
+++ b/feature/mission/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt
new file mode 100644
index 00000000..b3c2d577
--- /dev/null
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt
@@ -0,0 +1,20 @@
+package com.yapp.mission
+
+import androidx.navigation.NavGraphBuilder
+import androidx.navigation.compose.composable
+import androidx.navigation.navigation
+import com.yapp.common.navigation.OrbitNavigator
+import com.yapp.common.navigation.destination.MissionDestination
+
+fun NavGraphBuilder.missionNavGraph(
+ navigator: OrbitNavigator,
+) {
+ navigation(
+ route = MissionDestination.Route.route,
+ startDestination = MissionDestination.Mission.route,
+ ) {
+ composable(route = MissionDestination.Mission.route) {
+ MissionRoute()
+ }
+ }
+}
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt
new file mode 100644
index 00000000..d27f2d8b
--- /dev/null
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt
@@ -0,0 +1,130 @@
+package com.yapp.mission
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+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.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.component.button.OrbitButton
+import com.yapp.ui.utils.heightForScreenPercentage
+
+@Composable
+fun MissionRoute() {
+ MissionScreen()
+}
+
+@Composable
+fun MissionScreen() {
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ ) {
+ Image(
+ painter = painterResource(id = core.designsystem.R.drawable.img_mission_main_background),
+ contentDescription = null,
+ contentScale = ContentScale.Crop,
+ modifier = Modifier.matchParentSize(),
+ )
+
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(horizontal = 20.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.SpaceBetween,
+ ) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.110f))
+ MissionTag(label = "기상미션")
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f))
+ MissionLabel(label = "10회를 흔들어", style = OrbitTheme.typography.headline2Medium)
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.01f))
+ MissionLabel(label = "부적을 뒤집어줘", style = OrbitTheme.typography.title1Bold)
+ }
+ Column(
+ modifier = Modifier
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ Image(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_mission_main),
+ contentDescription = "",
+ modifier = Modifier.wrapContentSize(),
+ )
+ }
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ OrbitButton(
+ modifier = Modifier.fillMaxWidth(),
+ label = "미션 시작",
+ onClick = {},
+ enabled = true,
+ )
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.027f))
+ MissionLabel(
+ label = "미션하지 않기",
+ style = OrbitTheme.typography.body1SemiBold,
+ clickable = true,
+ )
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.0714f))
+ }
+ }
+ }
+}
+
+@Composable
+fun MissionTag(label: String) {
+ Box(
+ modifier = Modifier
+ .background(
+ color = OrbitTheme.colors.main.copy(alpha = 0.1f),
+ shape = RoundedCornerShape(30.dp),
+ )
+ .padding(vertical = 4.dp, horizontal = 12.dp),
+ ) {
+ Text(
+ text = label,
+ color = OrbitTheme.colors.main,
+ style = OrbitTheme.typography.body2Medium,
+ )
+ }
+}
+
+@Composable
+fun MissionLabel(
+ label: String,
+ style: TextStyle,
+ clickable: Boolean = false,
+) {
+ Text(
+ text = label,
+ color = OrbitTheme.colors.white,
+ style = style,
+ modifier = if (clickable) Modifier.clickable { } else Modifier,
+ )
+}
+
+@Composable
+@Preview
+fun MissionRoutePreview() {
+ MissionScreen()
+}
diff --git a/feature/navigator/build.gradle.kts b/feature/navigator/build.gradle.kts
index 93e9103a..a9daa3b3 100644
--- a/feature/navigator/build.gradle.kts
+++ b/feature/navigator/build.gradle.kts
@@ -13,4 +13,5 @@ dependencies {
implementation(projects.feature.home)
implementation(projects.feature.mypage)
implementation(projects.feature.onboarding)
+ implementation(projects.feature.mission)
}
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
index ed7df7c9..cb62d46c 100644
--- a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
+++ b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
@@ -4,7 +4,9 @@ import android.annotation.SuppressLint
import android.content.pm.ActivityInfo
import android.os.Bundle
import androidx.activity.ComponentActivity
+import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
+import androidx.activity.enableEdgeToEdge
import com.yapp.designsystem.theme.OrbitTheme
import dagger.hilt.android.AndroidEntryPoint
@@ -14,6 +16,12 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+ enableEdgeToEdge(
+ statusBarStyle = SystemBarStyle.light(
+ android.graphics.Color.TRANSPARENT,
+ android.graphics.Color.TRANSPARENT,
+ ),
+ )
setContent {
OrbitTheme {
OrbitNavHost()
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt
index 82d9ac50..60d481ba 100644
--- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt
+++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt
@@ -25,6 +25,7 @@ import kotlinx.collections.immutable.ImmutableList
@Composable
internal fun OrbitBottomNavigationBar(
+ modifier: Modifier = Modifier,
visible: Boolean,
currentTab: TopLevelDestination?,
entries: ImmutableList,
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
index 1dcb616e..c2992a3f 100644
--- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
+++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
@@ -1,6 +1,8 @@
package com.yapp.navigator
-import androidx.compose.foundation.layout.padding
+import android.annotation.SuppressLint
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@@ -11,16 +13,18 @@ import com.yapp.common.navigation.destination.TopLevelDestination
import com.yapp.common.navigation.rememberOrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.home.homeNavGraph
+import com.yapp.mission.missionNavGraph
import com.yapp.mypage.myPageNavGraph
import kotlinx.collections.immutable.toImmutableList
+@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
internal fun OrbitNavHost(
modifier: Modifier = Modifier,
navigator: OrbitNavigator = rememberOrbitNavigator(),
) {
Scaffold(
- modifier = modifier,
+ modifier = modifier.fillMaxSize(),
bottomBar = {
OrbitBottomNavigationBar(
visible = false,
@@ -30,11 +34,13 @@ internal fun OrbitNavHost(
)
},
containerColor = OrbitTheme.colors.gray_900,
- ) { innerPadding ->
+ ) {
NavHost(
navController = navigator.navController,
startDestination = navigator.startDestination,
- modifier = Modifier.padding(innerPadding),
+ modifier = Modifier
+ .fillMaxSize()
+ .navigationBarsPadding(),
) {
onboardingNavGraph(
navigator = navigator,
@@ -46,6 +52,9 @@ internal fun OrbitNavHost(
myPageNavGraph(
navigator = navigator,
)
+ missionNavGraph(
+ navigator = navigator,
+ )
}
}
}
diff --git a/feature/onboarding/src/main/java/com/kms/onboarding/OnBoardingScreen.kt b/feature/onboarding/src/main/java/com/kms/onboarding/OnBoardingScreen.kt
index 6900e51b..854bcbc9 100644
--- a/feature/onboarding/src/main/java/com/kms/onboarding/OnBoardingScreen.kt
+++ b/feature/onboarding/src/main/java/com/kms/onboarding/OnBoardingScreen.kt
@@ -5,8 +5,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.imePadding
-import androidx.compose.foundation.layout.navigationBarsPadding
-import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.kms.onboarding.component.OnBoardingTopAppBar
@@ -29,8 +27,6 @@ fun OnboardingScreen(
modifier = Modifier
.fillMaxSize()
.background(OrbitTheme.colors.gray_900)
- .statusBarsPadding()
- .navigationBarsPadding()
.imePadding(),
) {
if (showTopAppBar) {
diff --git a/settings.gradle.kts b/settings.gradle.kts
index f0a524a9..e36ed69b 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -39,3 +39,4 @@ include(":feature:home")
include(":feature:navigator")
include(":feature:mypage")
include(":feature:onboarding")
+include(":feature:mission")