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 22, 2024
1 parent 08bc449 commit fa24fc2
Show file tree
Hide file tree
Showing 11 changed files with 382 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 @@ -28,6 +28,7 @@ material = "1.12.0"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
navigationCompose = "2.7.6"



Expand All @@ -48,6 +49,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" }



Expand Down
1 change: 1 addition & 0 deletions presenter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ dependencies {
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
Expand Down
24 changes: 10 additions & 14 deletions presenter/src/main/java/com/foke/together/presenter/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,33 @@ 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

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
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() {
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,32 @@
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")
}
}
}

// build and setup route format (in navigation graph)
fun withArgsFormat(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 = {}
)
}
}
}
Loading

0 comments on commit fa24fc2

Please sign in to comment.