From fc8f1907388e5d3ab1ba7f9360e0b9a3f6c21e72 Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Tue, 12 Aug 2025 10:59:28 +0200 Subject: [PATCH 1/3] Fix back navigation after login/logout --- .../gravatar/app/navigation/RootNavigation.kt | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt b/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt index 9346ab47..63fbf48e 100644 --- a/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt +++ b/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt @@ -1,7 +1,11 @@ package com.gravatar.app.navigation +import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -18,20 +22,16 @@ import org.koin.compose.koinInject @Composable fun RootNavigation() { val navController = rememberNavController() - val backStackEntry = navController.currentBackStackEntryAsState() + val backStackEntry by navController.currentBackStackEntryAsState() val isUserLoggedIn: IsUserLoggedIn = koinInject() LaunchedEffect(Unit) { isUserLoggedIn() .collect { userSession -> - val lastRoute = backStackEntry.value?.destination?.route?.let { - RootDestination.fromRoute(it) - } ?: RootDestination.Splash - - val currentRoute = navController.currentDestination?.route?.let { - RootDestination.fromRoute(it) - } + val lastRoute = + backStackEntry?.destination?.rootDestination ?: RootDestination.Splash + Log.d("RootNavigation", "Last route: $lastRoute") when (userSession) { LOGGED_IN -> navController.navigateToRootDestination( destination = RootDestination.Home, @@ -65,11 +65,7 @@ private fun NavHostController.navigateToRootDestination( popTo: RootDestination, shouldSaveState: Boolean = true ) { - val currentRoute = currentDestination?.route?.let { - RootDestination.fromRoute(it) - } - - if (currentRoute != destination) { + if (popTo != destination) { navigate(destination) { popUpTo(popTo) { inclusive = true @@ -81,6 +77,14 @@ private fun NavHostController.navigateToRootDestination( } } +private val NavDestination.rootDestination: RootDestination? + get() = when { + hasRoute(RootDestination.Splash::class) -> RootDestination.Splash + hasRoute(RootDestination.Login::class) -> RootDestination.Login + hasRoute(RootDestination.Home::class) -> RootDestination.Home + else -> null + } + internal sealed class RootDestination { @Serializable data object Splash : RootDestination() @@ -90,15 +94,4 @@ internal sealed class RootDestination { @Serializable data object Home : RootDestination() - - companion object { - fun fromRoute(route: String?): RootDestination? { - return when (route) { - Splash::class.qualifiedName -> Splash - Login::class.qualifiedName -> Login - Home::class.qualifiedName -> Home - else -> null - } - } - } } From 0c400912f60f48d735ee36f67e947d22dd822a44 Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Tue, 12 Aug 2025 11:26:44 +0200 Subject: [PATCH 2/3] Bottom bar selected item tint fix --- .../com/gravatar/app/homeUi/navigation/HomeNavigation.kt | 2 -- .../gravatar/app/homeUi/presentation/home/HomeScreen.kt | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/navigation/HomeNavigation.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/navigation/HomeNavigation.kt index 3d9d9efe..b617fbee 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/navigation/HomeNavigation.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/navigation/HomeNavigation.kt @@ -54,8 +54,6 @@ internal sealed class HomeDestination( val labelRes: Int, val position: Int, ) { - val route: String = - this::class.qualifiedName ?: error("Route name is not defined for $this") @Serializable data object Gravatar : HomeDestination( diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeScreen.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeScreen.kt index 5c813344..8b2ae346 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeScreen.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeScreen.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController @@ -64,7 +65,7 @@ internal fun HomeScreen( ) { val navController = rememberNavController() val snackbarHostState = remember { SnackbarHostState() } - val backStackEntry = navController.currentBackStackEntryAsState() + val backStackEntry by navController.currentBackStackEntryAsState() Scaffold( contentWindowInsets = WindowInsets(0, 0, 0, 0), @@ -83,9 +84,9 @@ internal fun HomeScreen( ) }, label = { Text(stringResource(destination.labelRes)) }, - selected = destination.route == backStackEntry.value?.destination?.route, + selected = backStackEntry?.destination?.hasRoute(destination::class) == true, onClick = { - if (backStackEntry.value?.destination?.route != destination.route) { + if (backStackEntry?.destination?.hasRoute(destination::class) == false) { navController.navigate(destination) { popUpTo(navController.graph.startDestinationId) { saveState = true From c8d5697ed515b65679834e8ad21fca5de27be2d8 Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Tue, 12 Aug 2025 21:08:33 +0200 Subject: [PATCH 3/3] Remove log statement --- app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt b/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt index 63fbf48e..7b0cc24d 100644 --- a/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt +++ b/app/src/main/java/com/gravatar/app/navigation/RootNavigation.kt @@ -1,6 +1,5 @@ package com.gravatar.app.navigation -import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -31,7 +30,6 @@ fun RootNavigation() { val lastRoute = backStackEntry?.destination?.rootDestination ?: RootDestination.Splash - Log.d("RootNavigation", "Last route: $lastRoute") when (userSession) { LOGGED_IN -> navController.navigateToRootDestination( destination = RootDestination.Home,