Skip to content

Commit c47eb9b

Browse files
committed
Address feedback
- Rename "Route" composables to be the stateful version of the "Screen" composables (e.g. PostRoute -> PostScreen) - Refactor Navigator to decouple it from the individual features - Refactor AppDrawer and AppNavRail to take a list of NavigationItem - Colocate deep link patterns with their nav keys
1 parent f41e5aa commit c47eb9b

15 files changed

Lines changed: 408 additions & 420 deletions

File tree

JetNews/app/src/main/java/com/example/jetnews/deeplink/JetnewsDeeplinks.kt

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,14 @@
1717
package com.example.jetnews.deeplink
1818

1919
import android.net.Uri
20-
import androidx.core.net.toUri
2120
import androidx.navigation3.runtime.NavKey
2221
import com.example.jetnews.deeplink.util.DeepLinkMatcher
23-
import com.example.jetnews.deeplink.util.DeepLinkPattern
2422
import com.example.jetnews.deeplink.util.DeepLinkRequest
2523
import com.example.jetnews.deeplink.util.KeyDecoder
26-
import com.example.jetnews.ui.home.HomeKey
27-
import com.example.jetnews.ui.interests.InterestsKey
24+
import com.example.jetnews.ui.home.HomeDeepLinkPattern
25+
import com.example.jetnews.ui.interests.InterestsDeepLinkPattern
2826
import com.example.jetnews.ui.navigation.DeepLinkKey
29-
import com.example.jetnews.ui.post.PostKey
30-
31-
val HomeDeepLinkPattern = DeepLinkPattern(
32-
HomeKey.serializer(),
33-
uriPattern = "https://developer.android.com/jetnews".toUri(),
34-
)
35-
36-
val PostDeepLinkPattern = DeepLinkPattern(
37-
PostKey.serializer(),
38-
uriPattern = "https://developer.android.com/jetnews/posts/{postId}".toUri(),
39-
)
40-
41-
val InterestsDeepLinkPattern = DeepLinkPattern(
42-
InterestsKey.serializer(),
43-
uriPattern = "https://developer.android.com/jetnews/interests".toUri(),
44-
)
27+
import com.example.jetnews.ui.post.PostDeepLinkPattern
4528

4629
val JetnewsDeepLinkPatterns = listOf(HomeDeepLinkPattern, PostDeepLinkPattern, InterestsDeepLinkPattern)
4730

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

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import androidx.compose.material3.NavigationDrawerItemDefaults
3131
import androidx.compose.material3.Text
3232
import androidx.compose.material3.rememberDrawerState
3333
import androidx.compose.runtime.Composable
34+
import androidx.compose.runtime.key
3435
import androidx.compose.ui.Modifier
3536
import androidx.compose.ui.res.painterResource
3637
import androidx.compose.ui.res.stringResource
@@ -39,15 +40,16 @@ import androidx.compose.ui.unit.dp
3940
import androidx.navigation3.runtime.NavKey
4041
import com.example.jetnews.R
4142
import com.example.jetnews.ui.home.HomeKey
42-
import com.example.jetnews.ui.interests.InterestsKey
43+
import com.example.jetnews.ui.navigation.NavigationItem
44+
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
4345
import com.example.jetnews.ui.theme.JetnewsTheme
4446

4547
@Composable
4648
fun AppDrawer(
4749
drawerState: DrawerState,
48-
currentRoute: NavKey,
49-
navigateToHome: () -> Unit,
50-
navigateToInterests: () -> Unit,
50+
currentTopLevelRoute: NavKey,
51+
navigate: (NavKey) -> Unit,
52+
navigationItems: List<NavigationItem>,
5153
closeDrawer: () -> Unit,
5254
modifier: Modifier = Modifier,
5355
) {
@@ -58,26 +60,20 @@ fun AppDrawer(
5860
JetNewsLogo(
5961
modifier = Modifier.padding(horizontal = 28.dp, vertical = 24.dp),
6062
)
61-
NavigationDrawerItem(
62-
label = { Text(stringResource(id = R.string.home_title)) },
63-
icon = { Icon(painterResource(R.drawable.ic_home), null) },
64-
selected = currentRoute is HomeKey,
65-
onClick = {
66-
navigateToHome()
67-
closeDrawer()
68-
},
69-
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding),
70-
)
71-
NavigationDrawerItem(
72-
label = { Text(stringResource(id = R.string.interests_title)) },
73-
icon = { Icon(painterResource(R.drawable.ic_list_alt), null) },
74-
selected = currentRoute is InterestsKey,
75-
onClick = {
76-
navigateToInterests()
77-
closeDrawer()
78-
},
79-
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding),
80-
)
63+
navigationItems.forEach { navigationItem ->
64+
key(navigationItem.navKey) {
65+
NavigationDrawerItem(
66+
label = { Text(stringResource(id = navigationItem.labelResourceId)) },
67+
icon = { Icon(painterResource(navigationItem.iconResourceId), null) },
68+
selected = currentTopLevelRoute == navigationItem.navKey,
69+
onClick = {
70+
navigate(navigationItem.navKey)
71+
closeDrawer()
72+
},
73+
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding),
74+
)
75+
}
76+
}
8177
}
8278
}
8379

@@ -105,9 +101,9 @@ fun PreviewAppDrawer() {
105101
JetnewsTheme {
106102
AppDrawer(
107103
drawerState = rememberDrawerState(initialValue = DrawerValue.Open),
108-
currentRoute = HomeKey,
109-
navigateToHome = {},
110-
navigateToInterests = {},
104+
currentTopLevelRoute = HomeKey,
105+
navigate = {},
106+
navigationItems = TOP_LEVEL_ROUTES,
111107
closeDrawer = { },
112108
)
113109
}

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import com.example.jetnews.ui.components.AppNavRail
3232
import com.example.jetnews.ui.home.HomeKey
3333
import com.example.jetnews.ui.interests.InterestsKey
3434
import com.example.jetnews.ui.navigation.Navigator
35+
import com.example.jetnews.ui.navigation.PopUpTo
36+
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
3537
import com.example.jetnews.ui.navigation.rememberNavigationState
3638
import com.example.jetnews.ui.theme.JetnewsTheme
3739
import kotlinx.coroutines.launch
@@ -61,9 +63,9 @@ fun JetnewsApp(appContainer: AppContainer, isBackEnabled: Boolean, initialBackSt
6163
drawerContent = {
6264
AppDrawer(
6365
drawerState = sizeAwareDrawerState,
64-
currentRoute = navigationState.topLevelRoute,
65-
navigateToHome = navigator::toHome,
66-
navigateToInterests = navigator::toInterests,
66+
currentTopLevelRoute = navigationState.topLevelRoute,
67+
navigate = { navKey -> navigator.navigate(navKey, PopUpTo(navKey)) },
68+
navigationItems = TOP_LEVEL_ROUTES,
6769
closeDrawer = { coroutineScope.launch { sizeAwareDrawerState.close() } },
6870
)
6971
},
@@ -74,16 +76,16 @@ fun JetnewsApp(appContainer: AppContainer, isBackEnabled: Boolean, initialBackSt
7476
Row {
7577
if (isExpandedScreen) {
7678
AppNavRail(
77-
currentRoute = navigationState.topLevelRoute,
78-
navigateToHome = navigator::toHome,
79-
navigateToInterests = navigator::toInterests,
79+
currentTopLevelRoute = navigationState.topLevelRoute,
80+
navigationItems = TOP_LEVEL_ROUTES,
81+
navigate = { navKey -> navigator.navigate(navKey) },
8082
)
8183
}
8284
JetnewsNavDisplay(
8385
navigationState = navigationState,
8486
navigator = navigator,
8587
appContainer = appContainer,
86-
onBack = navigator::goBack,
88+
onBack = navigator::goUp,
8789
isExpandedScreen = isExpandedScreen,
8890
isBackEnabled = isBackEnabled,
8991
openDrawer = { coroutineScope.launch { sizeAwareDrawerState.open() } },

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@ import androidx.navigationevent.NavigationEvent
3535
import androidx.navigationevent.compose.NavigationBackHandler
3636
import androidx.navigationevent.compose.rememberNavigationEventState
3737
import com.example.jetnews.data.AppContainer
38+
import com.example.jetnews.ui.home.HomeKey
3839
import com.example.jetnews.ui.home.homeEntry
3940
import com.example.jetnews.ui.interests.interestsEntry
4041
import com.example.jetnews.ui.navigation.NavigationState
4142
import com.example.jetnews.ui.navigation.Navigator
43+
import com.example.jetnews.ui.navigation.PopUpTo
4244
import com.example.jetnews.ui.navigation.rememberListDetailSceneStrategy
45+
import com.example.jetnews.ui.post.PostKey
4346
import com.example.jetnews.ui.post.postEntry
4447

4548
const val PIVOT_FRACTION_OFFSET = .2f
@@ -65,12 +68,12 @@ fun JetnewsNavDisplay(
6568
postsRepository = appContainer.postsRepository,
6669
isExpandedScreen = { currentIsExpandedScreen },
6770
openDrawer = openDrawer,
68-
navigateToPost = { navigator.toPost(it) },
71+
navigateToPost = { navigator.navigate(PostKey(it), popUpTo = PopUpTo(HomeKey)) },
6972
)
7073
postEntry(
7174
postsRepository = appContainer.postsRepository,
7275
isExpandedScreen = { currentIsExpandedScreen },
73-
onBack = navigator::goBack,
76+
onBack = navigator::goUp,
7477
)
7578
interestsEntry(
7679
interestsRepository = appContainer.interestsRepository,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ class MainActivity : ComponentActivity() {
4444
var initialBackStack by rememberInitialBackStack(initialDeepLinkBackStack ?: listOf(HomeKey))
4545

4646
NewIntentEffect { newIntent ->
47-
newIntent.data?.handleDeepLink()?.let {
47+
newIntent.data?.handleDeepLink()?.let { deepLinkBackStack ->
4848
isOpenedByDeepLink = true
49-
initialBackStack = it
49+
initialBackStack = deepLinkBackStack
5050
}
5151
}
5252

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

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.material3.NavigationRail
2525
import androidx.compose.material3.NavigationRailItem
2626
import androidx.compose.material3.Text
2727
import androidx.compose.runtime.Composable
28+
import androidx.compose.runtime.key
2829
import androidx.compose.ui.Modifier
2930
import androidx.compose.ui.res.painterResource
3031
import androidx.compose.ui.res.stringResource
@@ -33,11 +34,17 @@ import androidx.compose.ui.unit.dp
3334
import androidx.navigation3.runtime.NavKey
3435
import com.example.jetnews.R
3536
import com.example.jetnews.ui.home.HomeKey
36-
import com.example.jetnews.ui.interests.InterestsKey
37+
import com.example.jetnews.ui.navigation.NavigationItem
38+
import com.example.jetnews.ui.navigation.TOP_LEVEL_ROUTES
3739
import com.example.jetnews.ui.theme.JetnewsTheme
3840

3941
@Composable
40-
fun AppNavRail(currentRoute: NavKey, navigateToHome: () -> Unit, navigateToInterests: () -> Unit, modifier: Modifier = Modifier) {
42+
fun AppNavRail(
43+
currentTopLevelRoute: NavKey,
44+
navigate: (NavKey) -> Unit,
45+
navigationItems: List<NavigationItem>,
46+
modifier: Modifier = Modifier,
47+
) {
4148
NavigationRail(
4249
header = {
4350
Icon(
@@ -50,20 +57,23 @@ fun AppNavRail(currentRoute: NavKey, navigateToHome: () -> Unit, navigateToInter
5057
modifier = modifier,
5158
) {
5259
Spacer(Modifier.weight(1f))
53-
NavigationRailItem(
54-
selected = currentRoute is HomeKey,
55-
onClick = navigateToHome,
56-
icon = { Icon(painterResource(id = R.drawable.ic_home), stringResource(R.string.home_title)) },
57-
label = { Text(stringResource(R.string.home_title)) },
58-
alwaysShowLabel = false,
59-
)
60-
NavigationRailItem(
61-
selected = currentRoute is InterestsKey,
62-
onClick = navigateToInterests,
63-
icon = { Icon(painterResource(id = R.drawable.ic_list_alt), stringResource(R.string.interests_title)) },
64-
label = { Text(stringResource(R.string.interests_title)) },
65-
alwaysShowLabel = false,
66-
)
60+
61+
navigationItems.forEach { topLevelRoute ->
62+
key(topLevelRoute.navKey) {
63+
NavigationRailItem(
64+
selected = currentTopLevelRoute == topLevelRoute.navKey,
65+
onClick = { navigate(topLevelRoute.navKey) },
66+
icon = {
67+
Icon(
68+
painterResource(id = topLevelRoute.iconResourceId),
69+
stringResource(topLevelRoute.iconContentDescriptionResourceId),
70+
)
71+
},
72+
label = { Text(stringResource(topLevelRoute.labelResourceId)) },
73+
alwaysShowLabel = false,
74+
)
75+
}
76+
}
6777
Spacer(Modifier.weight(1f))
6878
}
6979
}
@@ -74,9 +84,9 @@ fun AppNavRail(currentRoute: NavKey, navigateToHome: () -> Unit, navigateToInter
7484
fun PreviewAppNavRail() {
7585
JetnewsTheme {
7686
AppNavRail(
77-
currentRoute = HomeKey,
78-
navigateToHome = {},
79-
navigateToInterests = {},
87+
currentTopLevelRoute = HomeKey,
88+
navigationItems = TOP_LEVEL_ROUTES,
89+
navigate = {},
8090
)
8191
}
8292
}

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

Lines changed: 0 additions & 117 deletions
This file was deleted.

0 commit comments

Comments
 (0)