From 9bcaaec846712a8fff853ce206b0fd9d9e95cf05 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 3 Sep 2024 19:08:04 +0100 Subject: [PATCH] Tidy up top level destination handling Change-Id: I385b6f49ba37801e40bb90254abe96e2350d48e8 --- .../nowinandroid/navigation/TopLevelDestination.kt | 5 +++-- .../com/google/samples/apps/nowinandroid/ui/NiaApp.kt | 11 +++++++---- .../samples/apps/nowinandroid/ui/NiaAppState.kt | 7 ++----- .../ui/interests2pane/Interests2PaneViewModel.kt | 1 - 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt index ac04f683a..815061273 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt @@ -16,6 +16,7 @@ package com.google.samples.apps.nowinandroid.navigation +import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector import com.google.samples.apps.nowinandroid.R import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons @@ -35,8 +36,8 @@ import com.google.samples.apps.nowinandroid.feature.search.R as searchR enum class TopLevelDestination( val selectedIcon: ImageVector, val unselectedIcon: ImageVector, - val iconTextId: Int, - val titleTextId: Int, + @StringRes val iconTextId: Int, + @StringRes val titleTextId: Int, val route: KClass<*>, ) { FOR_YOU( diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt index 694062c08..6cdc32bb0 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt @@ -73,6 +73,7 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradien import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog import com.google.samples.apps.nowinandroid.navigation.NiaNavHost import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination +import kotlin.reflect.KClass import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR @OptIn(ExperimentalMaterial3AdaptiveApi::class) @@ -151,7 +152,7 @@ internal fun NiaApp( appState.topLevelDestinations.forEach { destination -> val hasUnread = unreadDestinations.contains(destination) val selected = currentDestination - .isTopLevelDestinationInHierarchy(destination) + .isRouteInHierarchy(destination.route) item( selected = selected, onClick = { appState.navigateToTopLevelDestination(destination) }, @@ -199,8 +200,10 @@ internal fun NiaApp( ) { // Show the top app bar on top level destinations. val destination = appState.currentTopLevelDestination - val shouldShowTopAppBar = destination != null + var shouldShowTopAppBar = false + if (destination != null) { + shouldShowTopAppBar = true NiaTopAppBar( titleRes = destination.titleTextId, navigationIcon = NiaIcons.Search, @@ -267,7 +270,7 @@ private fun Modifier.notificationDot(): Modifier = } } -private fun NavDestination?.isTopLevelDestinationInHierarchy(destination: TopLevelDestination) = +private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = this?.hierarchy?.any { - it.hasRoute(destination.route) + it.hasRoute(route) } ?: false 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 2394087dd..1409eab3e 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 @@ -92,12 +92,9 @@ class NiaAppState( val currentTopLevelDestination: TopLevelDestination? @Composable get() { - with(currentDestination) { - if (this?.hasRoute() == true) return FOR_YOU - if (this?.hasRoute() == true) return BOOKMARKS - if (this?.hasRoute() == true) return INTERESTS + return TopLevelDestination.entries.firstOrNull { topLevelDestination -> + currentDestination?.hasRoute(route = topLevelDestination.route) ?: false } - return null } val isOffline = networkMonitor.isOnline diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt index 22e3c343b..3d37f3417 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/interests2pane/Interests2PaneViewModel.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.navigation.toRoute import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsRoute -import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_KEY import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject