Skip to content

Commit

Permalink
Add navigation and initial screen components for the app
Browse files Browse the repository at this point in the history
  • Loading branch information
ing03201 committed Sep 23, 2024
1 parent ebd2c30 commit 3f128c5
Show file tree
Hide file tree
Showing 10 changed files with 372 additions and 15 deletions.
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"



Expand All @@ -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" }
Expand Down
1 change: 1 addition & 0 deletions presenter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
26 changes: 11 additions & 15 deletions presenter/src/main/java/com/foke/together/presenter/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
)
}
}
Original file line number Diff line number Diff line change
@@ -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")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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 = { }
)
}
}
}
Original file line number Diff line number Diff line change
@@ -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 = {}
)
}
}
}
Original file line number Diff line number Diff line change
@@ -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 = {}
)
}
}
}
Original file line number Diff line number Diff line change
@@ -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 = {}
)
}
}
}
Loading

0 comments on commit 3f128c5

Please sign in to comment.