diff --git a/app/build.gradle.kts b/app/build.gradle.kts index afd37736f..aa8ff5e02 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,6 +25,10 @@ plugins { id("com.google.android.gms.oss-licenses-plugin") alias(libs.plugins.baselineprofile) alias(libs.plugins.roborazzi) + // Serialization is used for type-safe navigation. + // TODO: Use the plugin ID from the version catalog when + // https://github.com/gradle/gradle/issues/15383# is resolved + id("org.jetbrains.kotlin.plugin.serialization") } android { @@ -103,6 +107,7 @@ dependencies { implementation(libs.androidx.window.core) implementation(libs.kotlinx.coroutines.guava) implementation(libs.coil.kt) + implementation(libs.kotlinx.serialization.json) ksp(libs.hilt.compiler) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt index 4cc4345ef..2d5197299 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/InterestsListDetailScreen.kt @@ -38,11 +38,13 @@ import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.INTERESTS_ROUTE import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_ARG import com.google.samples.apps.nowinandroid.feature.topic.TopicDetailPlaceholder -import com.google.samples.apps.nowinandroid.feature.topic.navigation.TOPIC_ROUTE import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen +import kotlinx.serialization.Serializable -private const val DETAIL_PANE_NAVHOST_ROUTE = "detail_pane_route" + +@Serializable object TopicPlaceholderDestination +@Serializable object DetailPaneNavHostDestination fun NavGraphBuilder.interestsListDetailScreen() { composable( @@ -86,7 +88,7 @@ internal fun InterestsListDetailScreen( fun onTopicClickShowDetailPane(topicId: String) { onTopicClick(topicId) nestedNavController.navigateToTopic(topicId) { - popUpTo(DETAIL_PANE_NAVHOST_ROUTE) + popUpTo() } listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail) } @@ -103,15 +105,15 @@ internal fun InterestsListDetailScreen( detailPane = { NavHost( navController = nestedNavController, - startDestination = TOPIC_ROUTE, - route = DETAIL_PANE_NAVHOST_ROUTE, - ) { + startDestination = TopicPlaceholderDestination::class, + route = DetailPaneNavHostDestination::class + ){ topicScreen( showBackButton = !listDetailNavigator.isListPaneVisible(), onBackClick = listDetailNavigator::navigateBack, onTopicClick = ::onTopicClickShowDetailPane, ) - composable(route = TOPIC_ROUTE) { + composable { TopicDetailPlaceholder() } } diff --git a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index 5ac766675..13fbab784 100644 --- a/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -71,7 +71,7 @@ import com.google.samples.apps.nowinandroid.core.ui.userNewsResourceCardItems import com.google.samples.apps.nowinandroid.feature.topic.R.string @Composable -internal fun TopicRoute( +internal fun TopicScreen( showBackButton: Boolean, onBackClick: () -> Unit, onTopicClick: (String) -> Unit, 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 af08bb58f..e1b2581f0 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 @@ -21,7 +21,7 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptionsBuilder import androidx.navigation.compose.composable -import com.google.samples.apps.nowinandroid.feature.topic.TopicRoute +import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen import kotlinx.serialization.Serializable // TODO: Remove @@ -29,11 +29,10 @@ import kotlinx.serialization.Serializable internal const val TOPIC_ID_ARG = "topicId" const val TOPIC_ROUTE = "topic_route" -@Serializable -data class TopicDestination(val id: String) +@Serializable data class TopicDestination(val id: String) fun NavController.navigateToTopic(topicId: String, navOptions: NavOptionsBuilder.() -> Unit = {}) { - navigate(TopicDestination(topicId)) { + navigate(route = TopicDestination(topicId)) { navOptions() } } @@ -44,7 +43,7 @@ fun NavGraphBuilder.topicScreen( onTopicClick: (String) -> Unit, ) { composable { - TopicRoute( + TopicScreen( showBackButton = showBackButton, onBackClick = onBackClick, onTopicClick = onTopicClick,