Migrate topic feature to Nav3

dt/nav3-c
Don Turner 2 months ago
parent 6ebf665c09
commit 1e30bc49f0

@ -30,7 +30,7 @@ import com.google.samples.apps.nowinandroid.feature.foryou.navigation.forYouSect
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.interests.navigation.navigateToInterests
import com.google.samples.apps.nowinandroid.feature.search.navigation.searchScreen
import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic
import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicRoute
import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.INTERESTS
import com.google.samples.apps.nowinandroid.ui.NiaAppState
@ -64,13 +64,11 @@ fun NiaNavHost(
modifier = modifier,
) {
forYouSection(
onTopicClick = navController::navigateToTopic,
onTopicClick = {
nav3Navigator.goTo(route = TopicRoute(it))
},
) {
topicScreen(
showBackButton = true,
onBackClick = navController::popBackStack,
onTopicClick = navController::navigateToTopic,
)
composable<TopicRoute>{}
}
composable<BookmarksRoute> {}
searchScreen(
@ -89,6 +87,13 @@ fun NiaNavHost(
},
onShowSnackbar = onShowSnackbar
)
topicScreen(
showBackButton = true,
onBackClick = { nav3Navigator.goBack() },
onTopicClick = {
nav3Navigator.goTo(route = TopicRoute(it))
},
)
},
)
}

@ -30,8 +30,8 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.NavOptions
import androidx.navigation.compose.rememberNavController
import androidx.navigation.internalToRoute
import androidx.navigation.navOptions
import androidx.navigation.toRoute
import androidx.tracing.trace
import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourceRepository
import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor
@ -41,6 +41,7 @@ import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.Boo
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.navigateToForYou
import com.google.samples.apps.nowinandroid.feature.interests.navigation.navigateToInterests
import com.google.samples.apps.nowinandroid.feature.search.navigation.navigateToSearch
import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicRoute
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.BOOKMARKS
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination.FOR_YOU
@ -213,7 +214,8 @@ private fun NavigationTrackingSideEffect(navController: NavHostController) {
class Nav3NavigatorSimple(val navController: NavHostController){
private val migratedRoutes = listOf(
BookmarksRoute::class
BookmarksRoute::class,
TopicRoute::class
).associateBy { it.qualifiedName }
// TODO: We are using Dispatchers.Main so that we can access SavedStateHandle in toRoute,
@ -231,16 +233,17 @@ class Nav3NavigatorSimple(val navController: NavHostController){
if (backStack.isNotEmpty()){
clear()
val entriesToAdd = nav2BackStack.mapNotNull { entry ->
println("Evaluating: ${entry.destination::class.qualifiedName}")
val className = entry.destination.route?.substringBefore('/')
println("Evaluating: $className")
// Ignore nav graph root entries
if (entry.destination::class.qualifiedName == "androidx.navigation.compose.ComposeNavGraphNavigator.ComposeNavGraph"){
null
} else {
val migratedRouteClass = migratedRoutes[entry.destination.route]
if (migratedRouteClass != null){
entry.savedStateHandle.internalToRoute(route = migratedRouteClass, typeMap = emptyMap())
} else {
entry
when (className) {
BookmarksRoute::class.qualifiedName -> entry.toRoute<BookmarksRoute>()
TopicRoute::class.qualifiedName -> entry.toRoute<TopicRoute>()
else -> entry
}
}
}

@ -26,6 +26,7 @@ android {
dependencies {
implementation(projects.core.data)
implementation(projects.core.navigation)
testImplementation(projects.core.testing)
testImplementation(libs.robolectric)

@ -17,30 +17,21 @@
package com.google.samples.apps.nowinandroid.feature.topic.navigation
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.compose.composable
import androidx.navigation.toRoute
import androidx.navigation3.runtime.EntryProviderBuilder
import androidx.navigation3.runtime.entry
import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen
import com.google.samples.apps.nowinandroid.feature.topic.TopicViewModel
import kotlinx.serialization.Serializable
@Serializable data class TopicRoute(val id: String)
fun NavController.navigateToTopic(topicId: String, navOptions: NavOptionsBuilder.() -> Unit = {}) {
navigate(route = TopicRoute(topicId)) {
navOptions()
}
}
fun NavGraphBuilder.topicScreen(
fun EntryProviderBuilder<Any>.topicScreen(
showBackButton: Boolean,
onBackClick: () -> Unit,
onTopicClick: (String) -> Unit,
) {
composable<TopicRoute> { entry ->
val id = entry.toRoute<TopicRoute>().id
entry<TopicRoute> { entry ->
val id = entry.id
TopicScreen(
showBackButton = showBackButton,
onBackClick = onBackClick,

Loading…
Cancel
Save