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 75a294c01..09345235d 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 @@ -33,8 +33,11 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserNewsResourc 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.ui.TrackDisposableJank +import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.BookmarksRoute import com.google.samples.apps.nowinandroid.feature.bookmarks.navigation.navigateToBookmarks +import com.google.samples.apps.nowinandroid.feature.foryou.navigation.ForYouRoute import com.google.samples.apps.nowinandroid.feature.foryou.navigation.navigateToForYou +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.navigateToSearch import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination @@ -142,17 +145,22 @@ class NiaAppState( fun navigateToTopLevelDestination(topLevelDestination: TopLevelDestination) { trace("Navigation: ${topLevelDestination.name}") { val topLevelNavOptions = navOptions { + val startDestination = navController.graph.findStartDestination() + // Avoid popUpTo and navigate to same screen. + val shouldNotSavedAndRestored = isStartDestinationSameWithNextDestination( + startDestination, topLevelDestination + ) ?: false // Pop up to the start destination of the graph to // avoid building up a large stack of destinations // on the back stack as users select items popUpTo(navController.graph.findStartDestination().id) { - saveState = true + saveState = !shouldNotSavedAndRestored } // Avoid multiple copies of the same destination when // reselecting the same item - launchSingleTop = true + launchSingleTop = !shouldNotSavedAndRestored // Restore state when reselecting a previously selected item - restoreState = true + restoreState = !shouldNotSavedAndRestored } when (topLevelDestination) { @@ -163,6 +171,14 @@ class NiaAppState( } } + /** + * Check if next destination is same with start destination of current graph. + */ + private fun isStartDestinationSameWithNextDestination( + startDestination: NavDestination, + nextDestination: TopLevelDestination, + ): Boolean? = startDestination.hasRoute(nextDestination.route) + fun navigateToSearch() = navController.navigateToSearch() }