Skip to content

Commit ae71fc9

Browse files
committed
basic setup for AddNewUserScreen
1 parent 49bba19 commit ae71fc9

File tree

11 files changed

+158
-27
lines changed

11 files changed

+158
-27
lines changed

app/src/main/java/com/hoc/flowmvi/AppState.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import androidx.navigation.NavDestination
77
import androidx.navigation.NavHostController
88
import androidx.navigation.compose.currentBackStackEntryAsState
99
import androidx.navigation.compose.rememberNavController
10+
import com.hoc.flowmvi.Screen.AddNewUser
1011
import com.hoc.flowmvi.Screen.UsersList
11-
import com.hoc.flowmvi.ui.main.navigation.usersListNavigationRoute
12+
import com.hoc.flowmvi.ui.add.navigation.AddNewUserNavigationRoute
13+
import com.hoc.flowmvi.ui.main.navigation.UsersListNavigationRoute
1214

1315
@Composable
1416
fun rememberJetpackComposeMVICoroutinesFlowApp(
@@ -24,9 +26,9 @@ enum class Screen {
2426

2527
val route: String
2628
get() = when (this) {
27-
UsersList -> usersListNavigationRoute
29+
UsersList -> UsersListNavigationRoute
30+
AddNewUser -> AddNewUserNavigationRoute
2831
SearchUsers -> TODO()
29-
AddNewUser -> TODO()
3032
}
3133

3234
companion object {
@@ -48,11 +50,16 @@ class JetpackComposeMVICoroutinesFlowAppState(
4850

4951
val currentScreen: Screen?
5052
@Composable get() = when (currentDestination?.route) {
51-
usersListNavigationRoute -> UsersList
53+
UsersListNavigationRoute -> UsersList
54+
AddNewUserNavigationRoute -> AddNewUser
5255
else -> TODO()
5356
}
5457

5558
fun onNavigateUp() {
5659
navController.navigateUp()
5760
}
61+
62+
fun onBackClick() {
63+
navController.popBackStack()
64+
}
5865
}

app/src/main/java/com/hoc/flowmvi/MainActivity.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@ import android.os.Bundle
44
import androidx.activity.compose.setContent
55
import androidx.appcompat.app.AppCompatActivity
66
import androidx.compose.foundation.layout.RowScope
7-
import androidx.compose.foundation.layout.fillMaxSize
87
import androidx.compose.foundation.layout.padding
98
import androidx.compose.material3.CenterAlignedTopAppBar
109
import androidx.compose.material3.ExperimentalMaterial3Api
11-
import androidx.compose.material3.MaterialTheme
1210
import androidx.compose.material3.Scaffold
1311
import androidx.compose.material3.SnackbarHost
1412
import androidx.compose.material3.SnackbarHostState
15-
import androidx.compose.material3.Surface
1613
import androidx.compose.material3.Text
14+
import androidx.compose.material3.TopAppBarColors
1715
import androidx.compose.runtime.Composable
1816
import androidx.compose.runtime.mutableStateOf
1917
import androidx.compose.runtime.remember
2018
import androidx.compose.ui.Modifier
2119
import androidx.navigation.compose.NavHost
2220
import com.hoc.flowmvi.core_ui.AppBarState
2321
import com.hoc.flowmvi.core_ui.ProvideSnackbarHostState
22+
import com.hoc.flowmvi.ui.add.navigation.addNewUserScreen
23+
import com.hoc.flowmvi.ui.add.navigation.navigateToAddNewUser
2424
import com.hoc.flowmvi.ui.main.navigation.usersListScreen
2525
import com.hoc.flowmvi.ui.theme.AppTheme
2626
import dagger.hilt.android.AndroidEntryPoint
@@ -32,12 +32,7 @@ class MainActivity : AppCompatActivity() {
3232

3333
setContent {
3434
AppTheme {
35-
Surface(
36-
color = MaterialTheme.colorScheme.background,
37-
modifier = Modifier.fillMaxSize(),
38-
) {
39-
JetpackComposeMVICoroutinesFlowApp()
40-
}
35+
JetpackComposeMVICoroutinesFlowApp()
4136
}
4237
}
4338
}
@@ -49,6 +44,7 @@ fun JetpackComposeMVICoroutinesFlowAppBar(
4944
title: String?,
5045
navigationIcon: @Composable () -> Unit,
5146
actions: @Composable RowScope.() -> Unit,
47+
colors: TopAppBarColors,
5248
modifier: Modifier = Modifier
5349
) {
5450
CenterAlignedTopAppBar(
@@ -59,7 +55,8 @@ fun JetpackComposeMVICoroutinesFlowAppBar(
5955
},
6056
modifier = modifier,
6157
navigationIcon = navigationIcon,
62-
actions = actions
58+
actions = actions,
59+
colors = colors
6360
)
6461
}
6562

@@ -82,6 +79,7 @@ private fun JetpackComposeMVICoroutinesFlowApp(
8279
title = it.title,
8380
actions = it.actions,
8481
navigationIcon = it.navigationIcon,
82+
colors = it.colors
8583
)
8684
}
8785
}
@@ -94,6 +92,12 @@ private fun JetpackComposeMVICoroutinesFlowApp(
9492
) {
9593
usersListScreen(
9694
configAppBar = setAppBarState,
95+
navigateToAddUser = { navController.navigateToAddNewUser() }
96+
)
97+
98+
addNewUserScreen(
99+
configAppBar = setAppBarState,
100+
onBackClick = appState::onBackClick
97101
)
98102
}
99103
}

buildSrc/src/main/kotlin/deps.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ object deps {
3030
object androidx {
3131
const val appCompat = "androidx.appcompat:appcompat:1.5.1"
3232
const val coreKtx = "androidx.core:core-ktx:1.9.0"
33-
const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.2"
3433
const val material = "com.google.android.material:material:1.4.0"
3534
const val activityCompose = "androidx.activity:activity-compose:1.6.1"
3635

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package com.hoc.flowmvi.core_ui
22

33
import androidx.compose.foundation.layout.RowScope
4+
import androidx.compose.material3.ExperimentalMaterial3Api
5+
import androidx.compose.material3.TopAppBarColors
46
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.Stable
58

9+
@OptIn(ExperimentalMaterial3Api::class)
10+
@Stable
611
data class AppBarState(
712
val title: String?,
813
val actions: @Composable RowScope.() -> Unit,
914
val navigationIcon: @Composable () -> Unit,
15+
val colors: TopAppBarColors,
1016
)
1117

1218
typealias ConfigAppBar = (AppBarState) -> Unit

feature-add/build.gradle.kts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,36 @@ android {
3030
}
3131
}
3232

33-
buildFeatures { viewBinding = true }
33+
buildFeatures {
34+
compose = true
35+
}
36+
composeOptions {
37+
kotlinCompilerExtensionVersion = deps.compose.androidxComposeCompiler
38+
}
39+
testOptions {
40+
unitTests {
41+
isReturnDefaultValues = true
42+
isIncludeAndroidResources = true
43+
}
44+
}
3445
}
3546

3647
dependencies {
3748
implementation(domain)
3849
implementation(core)
3950
implementation(coreUi)
51+
implementation(mviBase)
52+
implementation(uiTheme)
53+
54+
implementationCompose()
55+
implementation(deps.immutableCollections)
4056

4157
implementation(deps.androidx.appCompat)
4258
implementation(deps.androidx.coreKtx)
4359

4460
implementation(deps.lifecycle.viewModelKtx)
4561
implementation(deps.lifecycle.runtimeKtx)
4662

47-
implementation(deps.androidx.constraintLayout)
4863
implementation(deps.androidx.material)
4964

5065
implementation(deps.coroutines.core)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.hoc.flowmvi.ui.add
2+
3+
import androidx.compose.material.icons.Icons
4+
import androidx.compose.material.icons.filled.ArrowBack
5+
import androidx.compose.material3.ExperimentalMaterial3Api
6+
import androidx.compose.material3.Icon
7+
import androidx.compose.material3.IconButton
8+
import androidx.compose.material3.Text
9+
import androidx.compose.material3.TopAppBarDefaults
10+
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.remember
12+
import androidx.compose.ui.res.stringResource
13+
import androidx.lifecycle.Lifecycle
14+
import com.hoc.flowmvi.core_ui.AppBarState
15+
import com.hoc.flowmvi.core_ui.ConfigAppBar
16+
import com.hoc.flowmvi.core_ui.OnLifecycleEvent
17+
18+
@OptIn(ExperimentalMaterial3Api::class)
19+
@Composable
20+
internal fun AddNewUserRoute(
21+
configAppBar: ConfigAppBar,
22+
onBackClick: () -> Unit,
23+
) {
24+
val title = stringResource(id = R.string.add_new_user)
25+
val colors = TopAppBarDefaults.centerAlignedTopAppBarColors()
26+
val appBarState = remember(colors) {
27+
AppBarState(
28+
title = title,
29+
actions = {},
30+
navigationIcon = {
31+
IconButton(onClick = onBackClick) {
32+
Icon(
33+
imageVector = Icons.Filled.ArrowBack,
34+
contentDescription = "Back"
35+
)
36+
}
37+
},
38+
colors = colors
39+
)
40+
}
41+
OnLifecycleEvent(configAppBar, appBarState) { _, event ->
42+
if (event == Lifecycle.Event.ON_START) {
43+
configAppBar(appBarState)
44+
}
45+
}
46+
47+
Text(
48+
text = "ADD NEW USER",
49+
)
50+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.hoc.flowmvi.ui.add.navigation
2+
3+
import androidx.navigation.NavController
4+
import androidx.navigation.NavGraphBuilder
5+
import androidx.navigation.NavOptions
6+
import androidx.navigation.compose.composable
7+
import com.hoc.flowmvi.core_ui.ConfigAppBar
8+
import com.hoc.flowmvi.ui.add.AddNewUserRoute
9+
10+
const val AddNewUserNavigationRoute = "add_new_user_route"
11+
12+
/**
13+
* Navigate to add new user screen
14+
*/
15+
fun NavController.navigateToAddNewUser(navOptions: NavOptions? = null) =
16+
navigate(AddNewUserNavigationRoute, navOptions)
17+
18+
/**
19+
* Add the add new user screen to the navigation graph.
20+
*/
21+
fun NavGraphBuilder.addNewUserScreen(
22+
configAppBar: ConfigAppBar,
23+
onBackClick: () -> Unit,
24+
) {
25+
composable(route = AddNewUserNavigationRoute) {
26+
AddNewUserRoute(
27+
configAppBar = configAppBar,
28+
onBackClick = onBackClick,
29+
)
30+
}
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="add_new_user">Add new user</string>
4+
</resources>

feature-main/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ dependencies {
6060
implementation(deps.lifecycle.viewModelKtx)
6161
implementation(deps.lifecycle.runtimeKtx)
6262

63-
implementation(deps.androidx.constraintLayout)
6463
implementation(deps.androidx.material)
6564

6665
implementation(deps.coroutines.core)

feature-main/src/main/java/com/hoc/flowmvi/ui/main/UsersListScreen.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ import androidx.compose.foundation.layout.padding
88
import androidx.compose.foundation.lazy.LazyColumn
99
import androidx.compose.foundation.lazy.itemsIndexed
1010
import androidx.compose.material.icons.Icons
11+
import androidx.compose.material.icons.filled.Add
1112
import androidx.compose.material.icons.filled.Delete
1213
import androidx.compose.material3.AlertDialog
1314
import androidx.compose.material3.Divider
15+
import androidx.compose.material3.ExperimentalMaterial3Api
1416
import androidx.compose.material3.Icon
17+
import androidx.compose.material3.IconButton
1518
import androidx.compose.material3.Text
1619
import androidx.compose.material3.TextButton
20+
import androidx.compose.material3.TopAppBarDefaults
1721
import androidx.compose.runtime.Composable
1822
import androidx.compose.runtime.LaunchedEffect
1923
import androidx.compose.runtime.getValue
@@ -45,22 +49,32 @@ import kotlinx.coroutines.flow.consumeAsFlow
4549
import kotlinx.coroutines.flow.onEach
4650
import kotlinx.coroutines.launch
4751

48-
@OptIn(ExperimentalLifecycleComposeApi::class)
52+
@OptIn(ExperimentalLifecycleComposeApi::class, ExperimentalMaterial3Api::class)
4953
@Composable
50-
fun UsersListRoute(
54+
internal fun UsersListRoute(
5155
configAppBar: ConfigAppBar,
56+
navigateToAddUser: () -> Unit,
5257
modifier: Modifier = Modifier,
5358
viewModel: MainVM = hiltViewModel(),
5459
) {
5560
val title = stringResource(id = R.string.app_name)
56-
val appBarState = remember {
61+
val colors = TopAppBarDefaults.centerAlignedTopAppBarColors()
62+
val appBarState = remember(colors) {
5763
AppBarState(
5864
title = title,
59-
actions = {},
65+
actions = {
66+
IconButton(onClick = navigateToAddUser) {
67+
Icon(
68+
imageVector = Icons.Default.Add,
69+
contentDescription = "Add new user",
70+
)
71+
}
72+
},
6073
navigationIcon = {},
74+
colors = colors,
6175
)
6276
}
63-
OnLifecycleEvent(configAppBar) { _, event ->
77+
OnLifecycleEvent(configAppBar, appBarState) { _, event ->
6478
if (event == Lifecycle.Event.ON_START) {
6579
configAppBar(appBarState)
6680
}

0 commit comments

Comments
 (0)