From 1e30bc49f0e645c0c2a052715bab7b3eed656cc9 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Wed, 9 Jul 2025 19:25:31 +0100 Subject: [PATCH] Migrate topic feature to Nav3 --- .../nowinandroid/navigation/NiaNavHost.kt | 19 ++++++++++++------- .../apps/nowinandroid/ui/NiaAppState.kt | 19 +++++++++++-------- feature/topic/build.gradle.kts | 1 + .../topic/navigation/TopicNavigation.kt | 19 +++++-------------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt index 88b2498ac..138be2e1d 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt @@ -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{} } composable {} searchScreen( @@ -89,6 +87,13 @@ fun NiaNavHost( }, onShowSnackbar = onShowSnackbar ) + topicScreen( + showBackButton = true, + onBackClick = { nav3Navigator.goBack() }, + onTopicClick = { + nav3Navigator.goTo(route = TopicRoute(it)) + }, + ) }, ) } diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index aecf93925..1777cef1a 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -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() + TopicRoute::class.qualifiedName -> entry.toRoute() + else -> entry } } } diff --git a/feature/topic/build.gradle.kts b/feature/topic/build.gradle.kts index bd8b59ec8..00c01cbf7 100644 --- a/feature/topic/build.gradle.kts +++ b/feature/topic/build.gradle.kts @@ -26,6 +26,7 @@ android { dependencies { implementation(projects.core.data) + implementation(projects.core.navigation) testImplementation(projects.core.testing) testImplementation(libs.robolectric) diff --git a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt index 69059c81d..313b5d7cb 100644 --- a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt +++ b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt @@ -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.topicScreen( showBackButton: Boolean, onBackClick: () -> Unit, onTopicClick: (String) -> Unit, ) { - composable { entry -> - val id = entry.toRoute().id + entry { entry -> + val id = entry.id TopicScreen( showBackButton = showBackButton, onBackClick = onBackClick,