From 3f128c5f69fe6a490006926d0aa4a462edaaf0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=88=98?= Date: Mon, 23 Sep 2024 19:50:14 +0900 Subject: [PATCH] Add navigation and initial screen components for the app --- gradle/libs.versions.toml | 2 + presenter/build.gradle.kts | 1 + .../foke/together/presenter/MainActivity.kt | 26 ++--- .../together/presenter/navigation/NavGraph.kt | 104 ++++++++++++++++++ .../together/presenter/navigation/NavRoute.kt | 22 ++++ .../together/presenter/screen/CameraScreen.kt | 46 ++++++++ .../together/presenter/screen/FrameScreen.kt | 47 ++++++++ .../together/presenter/screen/HomeScreen.kt | 54 +++++++++ .../presenter/screen/SettingScreen.kt | 41 +++++++ .../together/presenter/screen/ShareScreen.kt | 44 ++++++++ 10 files changed, 372 insertions(+), 15 deletions(-) create mode 100644 presenter/src/main/java/com/foke/together/presenter/navigation/NavGraph.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/navigation/NavRoute.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/screen/CameraScreen.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/screen/FrameScreen.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/screen/HomeScreen.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/screen/SettingScreen.kt create mode 100644 presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3f22a8..551edfe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,6 +36,7 @@ androidx-hilt-navigation-compose = "1.2.0" junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1" +navigationCompose = "2.7.6" @@ -55,6 +56,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } # test ----------- junit = { group = "junit", name = "junit", version.ref = "junit" } diff --git a/presenter/build.gradle.kts b/presenter/build.gradle.kts index 44e935d..593ad70 100644 --- a/presenter/build.gradle.kts +++ b/presenter/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { implementation(libs.androidx.hilt.compiler) implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.androidx.navigation.compose) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/presenter/src/main/java/com/foke/together/presenter/MainActivity.kt b/presenter/src/main/java/com/foke/together/presenter/MainActivity.kt index 7e4027f..7bce2df 100644 --- a/presenter/src/main/java/com/foke/together/presenter/MainActivity.kt +++ b/presenter/src/main/java/com/foke/together/presenter/MainActivity.kt @@ -11,6 +11,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.compose.rememberNavController +import com.foke.together.presenter.navigation.NavGraph import com.foke.together.presenter.ui.theme.FourCutTogetherTheme import dagger.hilt.android.AndroidEntryPoint @@ -20,30 +22,24 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { - FourCutTogetherTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Greeting( - name = "FourCut Studio", - modifier = Modifier.padding(innerPadding) - ) - } - } + MainScreen() } } } @Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = name, - modifier = modifier - ) +private fun MainScreen() { + FourCutTogetherTheme { + val navController = rememberNavController() + NavGraph(navController) + } } @Preview(showBackground = true) @Composable -fun GreetingPreview() { +fun MainPreview() { FourCutTogetherTheme { - Greeting("Android") + val navController = rememberNavController() + NavGraph(navController) } } \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/navigation/NavGraph.kt b/presenter/src/main/java/com/foke/together/presenter/navigation/NavGraph.kt new file mode 100644 index 0000000..fa43498 --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/navigation/NavGraph.kt @@ -0,0 +1,104 @@ +package com.foke.together.presenter.navigation +import androidx.compose.runtime.Composable +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import com.foke.together.presenter.screen.CameraScreen +import com.foke.together.presenter.screen.FrameScreen +import com.foke.together.presenter.screen.HomeScreen +import com.foke.together.presenter.screen.SettingScreen +import com.foke.together.presenter.screen.ShareScreen + +@Composable +fun NavGraph(navController: NavHostController) { + + NavHost( + navController = navController, + startDestination = NavRoute.Home.path + ) { + addHomeScreen(navController, this) + addSettingScreen(navController, this) + addCameraScreen(navController, this) + addFrameScreen(navController, this) + addShareScreen(navController, this) + } +} + + +private fun addHomeScreen( + navController: NavHostController, + navGraphBuilder: NavGraphBuilder +) { + navGraphBuilder.composable(route = NavRoute.Home.path) { + HomeScreen( + navigateToSetting = { + navController.navigate(NavRoute.Setting.path) + }, + navigateToCamera = { + navController.navigate(NavRoute.Camera.path) + }, + popBackStack = { navController.popBackStack() } + ) + } +} + +private fun addCameraScreen( + navController: NavHostController, + navGraphBuilder: NavGraphBuilder +) { + navGraphBuilder.composable(route = NavRoute.Camera.path) { + CameraScreen( + navigateToFrame = { + navController.navigate(NavRoute.Frame.path) + }, + popBackStack = { + navController.popBackStack(NavRoute.Home.path, inclusive = false) + } + ) + } +} + +private fun addSettingScreen( + navController: NavHostController, + navGraphBuilder: NavGraphBuilder +) { + navGraphBuilder.composable(route = NavRoute.Setting.path) { + SettingScreen( + popBackStack = { + navController.popBackStack(NavRoute.Home.path, inclusive = false) + } + ) + } +} + +private fun addFrameScreen( + navController: NavHostController, + navGraphBuilder: NavGraphBuilder +) { + navGraphBuilder.composable(route = NavRoute.Frame.path) { + FrameScreen( + navigateShare = { + navController.navigate(NavRoute.Share.path) + }, + popBackStack = { + navController.popBackStack(NavRoute.Home.path, inclusive = false) + } + ) + } +} + +private fun addShareScreen( + navController: NavHostController, + navGraphBuilder: NavGraphBuilder +) { + navGraphBuilder.composable(route = NavRoute.Frame.path) { + ShareScreen( + popBackStack = { + navController.popBackStack(NavRoute.Home.path, inclusive = false) + } + ) + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/navigation/NavRoute.kt b/presenter/src/main/java/com/foke/together/presenter/navigation/NavRoute.kt new file mode 100644 index 0000000..ab30598 --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/navigation/NavRoute.kt @@ -0,0 +1,22 @@ +package com.foke.together.presenter.navigation + +sealed class NavRoute(val path: String) { + + object Camera: NavRoute("camera") + + object Home: NavRoute("home") + + object Frame: NavRoute("frame") + object Share: NavRoute("share") + object Setting: NavRoute("setting") + + // build navigation path (for screen navigation) + fun withArgs(vararg args: String): String { + return buildString { + append(path) + args.forEach{ arg -> + append("/$arg") + } + } + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/CameraScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/CameraScreen.kt new file mode 100644 index 0000000..30f4efa --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/screen/CameraScreen.kt @@ -0,0 +1,46 @@ +package com.foke.together.presenter.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.foke.together.presenter.ui.theme.FourCutTogetherTheme + +@Composable +fun CameraScreen( + navigateToFrame: () -> Unit, + popBackStack: () -> Unit +) { + Column ( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Text("Camera Screen", fontSize = 40.sp) + Button(onClick = navigateToFrame){ + Text("Frame") + } + } +} + +@Preview(showBackground = true) +@Composable +private fun DefaultPreview() { + FourCutTogetherTheme() { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + CameraScreen( + navigateToFrame = { }, + popBackStack = { } + ) + } + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/FrameScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/FrameScreen.kt new file mode 100644 index 0000000..bf54ee0 --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/screen/FrameScreen.kt @@ -0,0 +1,47 @@ +package com.foke.together.presenter.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.foke.together.presenter.ui.theme.FourCutTogetherTheme + +@Composable +fun FrameScreen( + navigateShare: () -> Unit, + popBackStack: () -> Unit +) { + Column ( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Text("Frame Screen", fontSize = 40.sp) + + Button(onClick = navigateShare){ + Text("Share") + } + } +} + +@Preview(showBackground = true) +@Composable +private fun DefaultPreview() { + FourCutTogetherTheme() { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + FrameScreen( + navigateShare = {}, + popBackStack = {} + ) + } + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/HomeScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/HomeScreen.kt new file mode 100644 index 0000000..ab1e866 --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/screen/HomeScreen.kt @@ -0,0 +1,54 @@ +package com.foke.together.presenter.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.foke.together.presenter.ui.theme.FourCutTogetherTheme + +@Composable +fun HomeScreen( + navigateToCamera: (String) -> Unit, + navigateToSetting: (String) -> Unit, + popBackStack: () -> Unit +) { + + Column ( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Text("Home Screen", fontSize = 40.sp) + + Button(onClick = { navigateToCamera("camera") }){ + Text("Camera") + } + + Button(onClick = { navigateToSetting("Setting") }){ + Text("Setting") + } + } +} + +@Preview(showBackground = true) +@Composable +private fun DefaultPreview() { + FourCutTogetherTheme() { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + HomeScreen( + navigateToCamera = { }, + navigateToSetting = {}, + popBackStack = {} + ) + } + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/SettingScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/SettingScreen.kt new file mode 100644 index 0000000..e8f9acc --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/screen/SettingScreen.kt @@ -0,0 +1,41 @@ +package com.foke.together.presenter.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.foke.together.presenter.ui.theme.FourCutTogetherTheme + +@Composable +fun SettingScreen( + popBackStack: () -> Unit +) { + Column ( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Text("Setting Screen", fontSize = 40.sp) + } +} + +@Preview(showBackground = true) +@Composable +private fun DefaultPreview() { + FourCutTogetherTheme() { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + SettingScreen( + popBackStack = {} + ) + } + } +} \ No newline at end of file diff --git a/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt b/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt new file mode 100644 index 0000000..32249e4 --- /dev/null +++ b/presenter/src/main/java/com/foke/together/presenter/screen/ShareScreen.kt @@ -0,0 +1,44 @@ +package com.foke.together.presenter.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.foke.together.presenter.ui.theme.FourCutTogetherTheme + +@Composable +fun ShareScreen( + popBackStack: () -> Unit +) { + Column ( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Text("Share Screen", fontSize = 40.sp) + Button(onClick = { popBackStack }){ + Text("Home") + } + } +} + +@Preview(showBackground = true) +@Composable +private fun DefaultPreview() { + FourCutTogetherTheme() { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + ShareScreen( + popBackStack = {} + ) + } + } +} \ No newline at end of file