Migrate ForYou feature to Nav3

dt/nav3-c
Don Turner 2 months ago
parent 572aaed590
commit ec2b09caca

@ -20,12 +20,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.ui.NavDisplay import androidx.navigation3.ui.NavDisplay
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksRoute import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksRoute
import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.bookmarksScreen import com.google.samples.apps.nowinandroid.feature.bookmarks.impl.navigation.bookmarksScreen
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouBaseRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouBaseRoute
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouRoute
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.forYouSection import com.google.samples.apps.nowinandroid.feature.foryou.navigation.forYouSection
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.search.navigation.SearchRoute import com.google.samples.apps.nowinandroid.feature.search.navigation.SearchRoute
@ -63,13 +65,11 @@ fun NiaNavHost(
startDestination = ForYouBaseRoute, startDestination = ForYouBaseRoute,
modifier = modifier, modifier = modifier,
) { ) {
forYouSection( navigation<ForYouBaseRoute>(startDestination = ForYouRoute) {
onTopicClick = { composable<ForYouRoute> {}
nav3Navigator.goTo(route = TopicRoute(it))
},
) {
composable<TopicRoute> {} composable<TopicRoute> {}
} }
composable<ForYouRoute> {}
composable<BookmarksRoute> {} composable<BookmarksRoute> {}
composable<SearchRoute> {} composable<SearchRoute> {}
composable<InterestsRoute>{} composable<InterestsRoute>{}
@ -77,6 +77,11 @@ fun NiaNavHost(
} }
}, },
) { ) {
forYouSection(
onTopicClick = {
nav3Navigator.goTo(route = TopicRoute(it))
},
)
bookmarksScreen( bookmarksScreen(
onTopicClick = { it: String -> onTopicClick = { it: String ->
nav3Navigator.goTo(route = InterestsRoute(it)) nav3Navigator.goTo(route = InterestsRoute(it))

@ -39,7 +39,7 @@ import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor
import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor import com.google.samples.apps.nowinandroid.core.data.util.TimeZoneMonitor
import com.google.samples.apps.nowinandroid.core.ui.TrackDisposableJank import com.google.samples.apps.nowinandroid.core.ui.TrackDisposableJank
import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksRoute import com.google.samples.apps.nowinandroid.feature.bookmarks.api.navigation.BookmarksRoute
import com.google.samples.apps.nowinandroid.feature.foryou.navigation.navigateToForYou import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouRoute
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.search.navigation.SearchRoute import com.google.samples.apps.nowinandroid.feature.search.navigation.SearchRoute
import com.google.samples.apps.nowinandroid.feature.search.navigation.navigateToSearch import com.google.samples.apps.nowinandroid.feature.search.navigation.navigateToSearch
@ -185,7 +185,7 @@ class NiaAppState(
} }
when (topLevelDestination) { when (topLevelDestination) {
FOR_YOU -> navController.navigateToForYou(topLevelNavOptions) FOR_YOU -> nav3Navigator.goTo(route = ForYouRoute, topLevelNavOptions)
BOOKMARKS -> nav3Navigator.goTo(route = BookmarksRoute, topLevelNavOptions) BOOKMARKS -> nav3Navigator.goTo(route = BookmarksRoute, topLevelNavOptions)
INTERESTS -> { INTERESTS -> {
nav3Navigator.goTo(route = InterestsRoute(null), topLevelNavOptions) nav3Navigator.goTo(route = InterestsRoute(null), topLevelNavOptions)
@ -264,6 +264,8 @@ class Nav3NavigatorSimple(val navController: NavHostController){
entry.toRoute<SearchRoute>() entry.toRoute<SearchRoute>()
} else if (destination.hasRoute<InterestsRoute>()) { } else if (destination.hasRoute<InterestsRoute>()) {
entry.toRoute<InterestsRoute>() entry.toRoute<InterestsRoute>()
} else if (destination.hasRoute<ForYouRoute>()) {
entry.toRoute<ForYouRoute>()
} else { } else {
// Non migrated top level route // Non migrated top level route
println("Non migrated destination: $destination") println("Non migrated destination: $destination")

@ -29,6 +29,7 @@ dependencies {
implementation(libs.accompanist.permissions) implementation(libs.accompanist.permissions)
implementation(projects.core.data) implementation(projects.core.data)
implementation(projects.core.domain) implementation(projects.core.domain)
implementation(projects.core.navigation)
implementation(projects.core.notifications) implementation(projects.core.notifications)
testImplementation(libs.hilt.android.testing) testImplementation(libs.hilt.android.testing)

@ -16,12 +16,8 @@
package com.google.samples.apps.nowinandroid.feature.foryou.navigation package com.google.samples.apps.nowinandroid.feature.foryou.navigation
import androidx.navigation.NavController import androidx.navigation3.runtime.EntryProviderBuilder
import androidx.navigation.NavGraphBuilder import androidx.navigation3.runtime.entry
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.google.samples.apps.nowinandroid.core.notifications.DEEP_LINK_URI_PATTERN import com.google.samples.apps.nowinandroid.core.notifications.DEEP_LINK_URI_PATTERN
import com.google.samples.apps.nowinandroid.feature.foryou.ForYouScreen import com.google.samples.apps.nowinandroid.feature.foryou.ForYouScreen
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@ -30,36 +26,30 @@ import kotlinx.serialization.Serializable
@Serializable data object ForYouBaseRoute // route to base navigation graph @Serializable data object ForYouBaseRoute // route to base navigation graph
fun NavController.navigateToForYou(navOptions: NavOptions) = navigate(route = ForYouRoute, navOptions)
/** /**
* The ForYou section of the app. It can also display information about topics. * The ForYou section of the app. It can also display information about topics.
* This should be supplied from a separate module. * This should be supplied from a separate module.
* *
* @param onTopicClick - Called when a topic is clicked, contains the ID of the topic * @param onTopicClick - Called when a topic is clicked, contains the ID of the topic
* @param topicDestination - Destination for topic content
*/ */
fun NavGraphBuilder.forYouSection( fun EntryProviderBuilder<Any>.forYouSection(
onTopicClick: (String) -> Unit, onTopicClick: (String) -> Unit
topicDestination: NavGraphBuilder.() -> Unit,
) { ) {
navigation<ForYouBaseRoute>(startDestination = ForYouRoute) { entry<ForYouRoute>(
composable<ForYouRoute>( /*deepLinks = listOf(
deepLinks = listOf(
navDeepLink { navDeepLink {
/** *//**
* This destination has a deep link that enables a specific news resource to be * This destination has a deep link that enables a specific news resource to be
* opened from a notification (@see SystemTrayNotifier for more). The news resource * opened from a notification (@see SystemTrayNotifier for more). The news resource
* ID is sent in the URI rather than being modelled in the route type because it's * ID is sent in the URI rather than being modelled in the route type because it's
* transient data (stored in SavedStateHandle) that is cleared after the user has * transient data (stored in SavedStateHandle) that is cleared after the user has
* opened the news resource. * opened the news resource.
*/ *//*
uriPattern = DEEP_LINK_URI_PATTERN uriPattern = DEEP_LINK_URI_PATTERN
}, },
), ),*/
) { ) {
ForYouScreen(onTopicClick) ForYouScreen(onTopicClick)
} }
topicDestination()
}
} }

@ -14,6 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
@file:OptIn(ExperimentalUuidApi::class)
package com.google.samples.apps.nowinandroid.feature.topic.navigation package com.google.samples.apps.nowinandroid.feature.topic.navigation
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
@ -22,8 +24,10 @@ import androidx.navigation3.runtime.entry
import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen
import com.google.samples.apps.nowinandroid.feature.topic.TopicViewModel import com.google.samples.apps.nowinandroid.feature.topic.TopicViewModel
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
@Serializable data class TopicRoute(val id: String) @Serializable data class TopicRoute(val id: String, val uuid: String = Uuid.random().toString())
fun EntryProviderBuilder<Any>.topicScreen( fun EntryProviderBuilder<Any>.topicScreen(
showBackButton: Boolean, showBackButton: Boolean,

Loading…
Cancel
Save