diff --git a/app/src/main/java/com/geeksville/mesh/ui/contact/AdaptiveContactsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/AdaptiveContactsScreen.kt index 50317dda3..281cb9ced 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/contact/AdaptiveContactsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/contact/AdaptiveContactsScreen.kt @@ -69,13 +69,16 @@ fun AdaptiveContactsScreen( val scope = rememberCoroutineScope() val backNavigationBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange - BackHandler(enabled = navigator.currentDestination?.pane == ListDetailPaneScaffoldRole.Detail) { + val handleBack: () -> Unit = { + val currentEntry = navController.currentBackStackEntry + val isContactsRoute = currentEntry?.destination?.hasRoute() == true + // Check if we navigated here from another screen (e.g., from Nodes or Map) val previousEntry = navController.previousBackStackEntry val isFromDifferentGraph = previousEntry?.destination?.hasRoute() == false - if (isFromDifferentGraph) { - // Navigate back via NavController to return to the previous screen + if (isFromDifferentGraph && !isContactsRoute) { + // Navigate back via NavController to return to the previous screen (e.g. Node Details) navController.navigateUp() } else { // Close the detail pane within the adaptive scaffold @@ -83,6 +86,8 @@ fun AdaptiveContactsScreen( } } + BackHandler(enabled = navigator.currentDestination?.pane == ListDetailPaneScaffoldRole.Detail) { handleBack() } + LaunchedEffect(initialContactKey) { if (initialContactKey != null) { navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, initialContactKey) @@ -135,7 +140,7 @@ fun AdaptiveContactsScreen( message = if (contactKey == initialContactKey) initialMessage else "", navigateToNodeDetails = { navController.navigate(NodesRoutes.NodeDetailGraph(it)) }, navigateToQuickChatOptions = { navController.navigate(ContactsRoutes.QuickChat) }, - onNavigateBack = { scope.launch { navigator.navigateBack(backNavigationBehavior) } }, + onNavigateBack = handleBack, ) } } ?: PlaceholderScreen() diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt index b3bd9b368..eccd9103d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt @@ -69,12 +69,15 @@ fun AdaptiveNodeListScreen( val scope = rememberCoroutineScope() val backNavigationBehavior = BackNavigationBehavior.PopUntilScaffoldValueChange - BackHandler(enabled = navigator.currentDestination?.pane == ListDetailPaneScaffoldRole.Detail) { + val handleBack: () -> Unit = { + val currentEntry = navController.currentBackStackEntry + val isNodesRoute = currentEntry?.destination?.hasRoute() == true + // Check if we navigated here from another screen (e.g., from Messages or Map) val previousEntry = navController.previousBackStackEntry val isFromDifferentGraph = previousEntry?.destination?.hasRoute() == false - if (isFromDifferentGraph) { + if (isFromDifferentGraph && !isNodesRoute) { // Navigate back via NavController to return to the previous screen navController.navigateUp() } else { @@ -83,6 +86,8 @@ fun AdaptiveNodeListScreen( } } + BackHandler(enabled = navigator.currentDestination?.pane == ListDetailPaneScaffoldRole.Detail) { handleBack() } + LaunchedEffect(initialNodeId) { if (initialNodeId != null) { navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, initialNodeId) @@ -132,7 +137,7 @@ fun AdaptiveNodeListScreen( nodeId = nodeId, navigateToMessages = onNavigateToMessages, onNavigate = { route -> navController.navigate(route) }, - onNavigateUp = { scope.launch { navigator.navigateBack(backNavigationBehavior) } }, + onNavigateUp = handleBack, ) } } ?: PlaceholderScreen()