Skip to content

Commit 3c7ea23

Browse files
committed
Rename "route" variables to use "key" instead
1 parent a462325 commit 3c7ea23

6 files changed

Lines changed: 66 additions & 56 deletions

File tree

JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ import androidx.compose.ui.unit.dp
4040
import androidx.navigation3.runtime.NavKey
4141
import com.example.jetnews.R
4242
import com.example.jetnews.ui.home.HomeKey
43+
import com.example.jetnews.ui.navigation.NAVIGATION_ITEMS
4344
import com.example.jetnews.ui.navigation.NavigationItem
44-
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
4545
import com.example.jetnews.ui.theme.JetnewsTheme
4646

4747
@Composable
4848
fun AppDrawer(
4949
drawerState: DrawerState,
50-
currentTopLevelRoute: NavKey,
50+
currentTopLevelKey: NavKey,
5151
navigate: (NavKey) -> Unit,
5252
navigationItems: List<NavigationItem>,
5353
closeDrawer: () -> Unit,
@@ -65,7 +65,7 @@ fun AppDrawer(
6565
NavigationDrawerItem(
6666
label = { Text(stringResource(id = navigationItem.labelResourceId)) },
6767
icon = { Icon(painterResource(navigationItem.iconResourceId), null) },
68-
selected = currentTopLevelRoute == navigationItem.navKey,
68+
selected = currentTopLevelKey == navigationItem.navKey,
6969
onClick = {
7070
navigate(navigationItem.navKey)
7171
closeDrawer()
@@ -101,9 +101,9 @@ fun PreviewAppDrawer() {
101101
JetnewsTheme {
102102
AppDrawer(
103103
drawerState = rememberDrawerState(initialValue = DrawerValue.Open),
104-
currentTopLevelRoute = HomeKey,
104+
currentTopLevelKey = HomeKey,
105105
navigate = {},
106-
navigationItems = TOP_LEVEL_ROUTES,
106+
navigationItems = NAVIGATION_ITEMS,
107107
closeDrawer = { },
108108
)
109109
}

JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsApp.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ import com.example.jetnews.data.AppContainer
3131
import com.example.jetnews.ui.components.AppNavRail
3232
import com.example.jetnews.ui.home.HomeKey
3333
import com.example.jetnews.ui.interests.InterestsKey
34+
import com.example.jetnews.ui.navigation.NAVIGATION_ITEMS
3435
import com.example.jetnews.ui.navigation.Navigator
3536
import com.example.jetnews.ui.navigation.PopUpTo
36-
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
3737
import com.example.jetnews.ui.navigation.rememberNavigationState
3838
import com.example.jetnews.ui.theme.JetnewsTheme
3939
import kotlinx.coroutines.launch
@@ -42,8 +42,8 @@ import kotlinx.coroutines.launch
4242
fun JetnewsApp(appContainer: AppContainer, isBackEnabled: Boolean, initialBackStack: List<NavKey>) {
4343

4444
val navigationState = rememberNavigationState(
45-
mainTopLevelRoute = HomeKey,
46-
topLevelRoutes = setOf(HomeKey, InterestsKey),
45+
primaryTopLevelKey = HomeKey,
46+
topLevelKeys = setOf(HomeKey, InterestsKey),
4747
initialBackStack = initialBackStack,
4848
)
4949

@@ -63,9 +63,9 @@ fun JetnewsApp(appContainer: AppContainer, isBackEnabled: Boolean, initialBackSt
6363
drawerContent = {
6464
AppDrawer(
6565
drawerState = sizeAwareDrawerState,
66-
currentTopLevelRoute = navigationState.topLevelRoute,
66+
currentTopLevelKey = navigationState.topLevelKey,
6767
navigate = { navKey -> navigator.navigate(navKey, PopUpTo(navKey)) },
68-
navigationItems = TOP_LEVEL_ROUTES,
68+
navigationItems = NAVIGATION_ITEMS,
6969
closeDrawer = { coroutineScope.launch { sizeAwareDrawerState.close() } },
7070
)
7171
},
@@ -76,8 +76,8 @@ fun JetnewsApp(appContainer: AppContainer, isBackEnabled: Boolean, initialBackSt
7676
Row {
7777
if (isExpandedScreen) {
7878
AppNavRail(
79-
currentTopLevelRoute = navigationState.topLevelRoute,
80-
navigationItems = TOP_LEVEL_ROUTES,
79+
currentTopLevelKey = navigationState.topLevelKey,
80+
navigationItems = NAVIGATION_ITEMS,
8181
navigate = { navKey -> navigator.navigate(navKey) },
8282
)
8383
}

JetNews/app/src/main/java/com/example/jetnews/ui/components/AppNavRail.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ import androidx.compose.ui.unit.dp
3434
import androidx.navigation3.runtime.NavKey
3535
import com.example.jetnews.R
3636
import com.example.jetnews.ui.home.HomeKey
37+
import com.example.jetnews.ui.navigation.NAVIGATION_ITEMS
3738
import com.example.jetnews.ui.navigation.NavigationItem
38-
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
3939
import com.example.jetnews.ui.theme.JetnewsTheme
4040

4141
@Composable
4242
fun AppNavRail(
43-
currentTopLevelRoute: NavKey,
43+
currentTopLevelKey: NavKey,
4444
navigate: (NavKey) -> Unit,
4545
navigationItems: List<NavigationItem>,
4646
modifier: Modifier = Modifier,
@@ -58,18 +58,18 @@ fun AppNavRail(
5858
) {
5959
Spacer(Modifier.weight(1f))
6060

61-
navigationItems.forEach { topLevelRoute ->
62-
key(topLevelRoute.navKey) {
61+
navigationItems.forEach { navigationItem ->
62+
key(navigationItem.navKey) {
6363
NavigationRailItem(
64-
selected = currentTopLevelRoute == topLevelRoute.navKey,
65-
onClick = { navigate(topLevelRoute.navKey) },
64+
selected = currentTopLevelKey == navigationItem.navKey,
65+
onClick = { navigate(navigationItem.navKey) },
6666
icon = {
6767
Icon(
68-
painterResource(id = topLevelRoute.iconResourceId),
69-
stringResource(topLevelRoute.iconContentDescriptionResourceId),
68+
painterResource(id = navigationItem.iconResourceId),
69+
stringResource(navigationItem.iconContentDescriptionResourceId),
7070
)
7171
},
72-
label = { Text(stringResource(topLevelRoute.labelResourceId)) },
72+
label = { Text(stringResource(navigationItem.labelResourceId)) },
7373
alwaysShowLabel = false,
7474
)
7575
}
@@ -84,8 +84,8 @@ fun AppNavRail(
8484
fun PreviewAppNavRail() {
8585
JetnewsTheme {
8686
AppNavRail(
87-
currentTopLevelRoute = HomeKey,
88-
navigationItems = TOP_LEVEL_ROUTES,
87+
currentTopLevelKey = HomeKey,
88+
navigationItems = NAVIGATION_ITEMS,
8989
navigate = {},
9090
)
9191
}

JetNews/app/src/main/java/com/example/jetnews/ui/navigation/NavigationItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ data class NavigationItem(
3030
@StringRes val labelResourceId: Int,
3131
)
3232

33-
val TOP_LEVEL_ROUTES = listOf(
33+
val NAVIGATION_ITEMS = listOf(
3434
NavigationItem(
3535
HomeKey,
3636
R.drawable.ic_home,

JetNews/app/src/main/java/com/example/jetnews/ui/navigation/NavigationState.kt

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,43 +45,59 @@ fun rememberInitialBackStack(backStack: List<NavKey>): MutableState<List<NavKey>
4545
}
4646

4747
@Composable
48-
fun rememberNavigationState(mainTopLevelRoute: NavKey, topLevelRoutes: Set<NavKey>, initialBackStack: List<NavKey>): NavigationState {
48+
fun rememberNavigationState(primaryTopLevelKey: NavKey, topLevelKeys: Set<NavKey>, initialBackStack: List<NavKey>): NavigationState {
4949

50-
val initialTopLevelRoute = initialBackStack.first()
50+
val initialTopLevelKey = initialBackStack.first()
5151

52-
val topLevelRoute = rememberSerializable(
52+
val topLevelKey = rememberSerializable(
5353
serializer = MutableStateSerializer(NavKeySerializer()),
5454
) {
55-
mutableStateOf(initialTopLevelRoute)
55+
mutableStateOf(initialTopLevelKey)
5656
}.apply {
5757
// If a new intent comes in while the activity is already running, the value for
58-
// topLevelRoute needs to be updated to reflect it
59-
value = initialTopLevelRoute
58+
// topLevelKey needs to be updated to reflect it
59+
value = initialTopLevelKey
6060
}
6161

62-
val backStacks = remember(topLevelRoutes, initialBackStack) {
62+
val backStacks = remember(topLevelKeys, initialBackStack) {
6363
mutableMapOf<NavKey, NavBackStack<NavKey>>()
6464
}
6565

66-
topLevelRoutes.forEach { route ->
67-
val backStack = if (route == initialTopLevelRoute) initialBackStack else listOf(route)
68-
backStacks[route] = key(backStack) {
66+
topLevelKeys.forEach { key ->
67+
val backStack = if (key == initialTopLevelKey) initialBackStack else listOf(key)
68+
backStacks[key] = key(backStack) {
6969
rememberNavBackStack(*backStack.toTypedArray())
7070
}
7171
}
7272

73-
return remember(mainTopLevelRoute, topLevelRoute, topLevelRoutes, backStacks) {
74-
NavigationState(mainTopLevelRoute, topLevelRoute, topLevelRoutes, backStacks)
73+
return remember(primaryTopLevelKey, topLevelKey, topLevelKeys, backStacks) {
74+
NavigationState(primaryTopLevelKey, topLevelKey, topLevelKeys, backStacks)
7575
}
7676
}
7777

78+
/**
79+
* State holder for the app's navigation.
80+
*
81+
* @param primaryTopLevelKey The top-level key of the stack that the app should go back to when navigating up from the base of another
82+
* top-level key's stack.
83+
* @param topLevelKey A [MutableState] holding the currently selected top-level key.
84+
* @param topLevelKeys A set of all available top-level keys in the app.
85+
* @param backStacks A map containing the [NavBackStack] for each top-level key.
86+
*/
7887
class NavigationState(
79-
val mainTopLevelRoute: NavKey,
80-
topLevelRoute: MutableState<NavKey>,
81-
val topLevelRoutes: Set<NavKey>,
88+
val primaryTopLevelKey: NavKey,
89+
topLevelKey: MutableState<NavKey>,
90+
val topLevelKeys: Set<NavKey>,
8291
val backStacks: Map<NavKey, NavBackStack<NavKey>>,
8392
) {
84-
var topLevelRoute: NavKey by topLevelRoute
93+
var topLevelKey: NavKey by topLevelKey
94+
95+
private val currentTopLevelKeys: List<NavKey>
96+
get() = if (topLevelKey == primaryTopLevelKey) {
97+
listOf(primaryTopLevelKey)
98+
} else {
99+
listOf(primaryTopLevelKey, topLevelKey)
100+
}
85101

86102
@Composable
87103
fun toDecoratedEntries(
@@ -96,13 +112,7 @@ class NavigationState(
96112
)
97113
}
98114

99-
return getTopLevelRoutesInUse()
115+
return currentTopLevelKeys
100116
.flatMap { decoratedEntries[it] ?: emptyList() }
101117
}
102-
103-
private fun getTopLevelRoutesInUse(): List<NavKey> = if (topLevelRoute == mainTopLevelRoute) {
104-
listOf(mainTopLevelRoute)
105-
} else {
106-
listOf(mainTopLevelRoute, topLevelRoute)
107-
}
108118
}

JetNews/app/src/main/java/com/example/jetnews/ui/navigation/Navigator.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ data class PopUpTo(val navKey: NavKey, val inclusive: Boolean = false)
2323

2424
class Navigator(val state: NavigationState) {
2525
val currentStack: NavBackStack<NavKey>
26-
get() = state.backStacks[state.topLevelRoute] ?: error("Stack for ${state.topLevelRoute} not found")
26+
get() = state.backStacks[state.topLevelKey] ?: error("Stack for ${state.topLevelKey} not found")
2727

28-
val currentRoute: NavKey
28+
val currentKey: NavKey
2929
get() = currentStack.last()
3030

3131
fun navigate(navKey: NavKey, popUpTo: PopUpTo? = null) {
32-
if (navKey in state.topLevelRoutes) {
33-
state.topLevelRoute = navKey
32+
if (navKey in state.topLevelKeys) {
33+
state.topLevelKey = navKey
3434
}
3535

36-
if (currentRoute == navKey && popUpTo == null) return
36+
if (currentKey == navKey && popUpTo == null) return
3737

3838
if (popUpTo != null) {
3939
val index = currentStack.indexOfLast { it == popUpTo.navKey }
@@ -46,15 +46,15 @@ class Navigator(val state: NavigationState) {
4646
}
4747
}
4848

49-
if (navKey !in state.topLevelRoutes && currentRoute != navKey) {
49+
if (navKey !in state.topLevelKeys && currentKey != navKey) {
5050
currentStack.add(navKey)
5151
}
5252
}
5353

5454
fun goUp() {
55-
// If we're at the base of the current route's stack, go back to the main route stack.
56-
if (currentRoute == state.topLevelRoute) {
57-
state.topLevelRoute = state.mainTopLevelRoute
55+
// If we're at the base of the current top level key's stack, go back to the primary top-level key's stack.
56+
if (currentKey == state.topLevelKey) {
57+
state.topLevelKey = state.primaryTopLevelKey
5858
} else {
5959
currentStack.removeLastOrNull()
6060
}

0 commit comments

Comments
 (0)