From d7ccc2b85888f90403270465644a35b843c96e8c Mon Sep 17 00:00:00 2001 From: crsmthw Date: Sun, 17 May 2026 11:31:34 +0300 Subject: [PATCH] v3.0.3 - fixed double back navigation bug --- app/build.gradle.kts | 4 +- app/release/baselineProfiles/0/app-release.dm | Bin 8336 -> 8340 bytes app/release/baselineProfiles/1/app-release.dm | Bin 8412 -> 8404 bytes app/release/output-metadata.json | 4 +- .../crsmthw/phase10tracker/ui/Navigation.kt | 60 ++++++++++++------ 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b19013a..f08a5ee 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.crsmthw.phase10tracker" minSdk = 35 targetSdk = 37 - versionCode = 6 - versionName = "3.0.2" + versionCode = 7 + versionName = "3.0.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index b5f899343337c56f6891702c837b40909c702d73..176f2fa980fb7230521fc657d4c7c7f6730e5266 100644 GIT binary patch literal 8340 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 Z|7$$F(*BF>-}31{$M+AOyZP_!{{iZ7C4&F} literal 8336 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 diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 0ff5cd6..67329c3 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 6, - "versionName": "3.0.2", + "versionCode": 7, + "versionName": "3.0.3", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/com/crsmthw/phase10tracker/ui/Navigation.kt b/app/src/main/java/com/crsmthw/phase10tracker/ui/Navigation.kt index 60801a0..28403ac 100644 --- a/app/src/main/java/com/crsmthw/phase10tracker/ui/Navigation.kt +++ b/app/src/main/java/com/crsmthw/phase10tracker/ui/Navigation.kt @@ -2,8 +2,11 @@ package com.crsmthw.phase10tracker.ui import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.Lifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavController import androidx.navigation.NavHostController +import androidx.navigation.NavOptionsBuilder import androidx.navigation.NavType import androidx.navigation.compose.* import androidx.navigation.navArgument @@ -27,6 +30,25 @@ object Routes { fun gameResults(id: Long) = "results/$id" } +// ── Safe navigation helpers ─────────────────────────────────────────────────── +// Guards every nav action behind a RESUMED check so rapid double-taps during +// transition animations can't pop extra destinations and cause a blank screen. + +private fun NavController.navigateSafe( + route: String, + builder: NavOptionsBuilder.() -> Unit = {} +) { + if (currentBackStackEntry?.lifecycle?.currentState == Lifecycle.State.RESUMED) { + navigate(route, builder) + } +} + +private fun NavController.popSafe() { + if (currentBackStackEntry?.lifecycle?.currentState == Lifecycle.State.RESUMED) { + popBackStack() + } +} + @Composable fun Phase10NavHost( navController: NavHostController, @@ -57,12 +79,12 @@ fun Phase10NavHost( amoledBlack = amoledBlack, onThemeModeChange = themeVm::setThemeMode, onAmoledBlackChange = themeVm::setAmoledBlack, - onContinueGame = { gameId -> navController.navigate(Routes.activeGame(gameId)) }, - onStartNew = { navController.navigate(Routes.GAME_SETUP) }, - onLeaderboard = { navController.navigate(Routes.LEADERBOARD) }, - onManagePlayers = { navController.navigate(Routes.PLAYER_ROSTER) }, - onCustomRules = { navController.navigate(Routes.CUSTOM_RULES) }, - onAbout = { navController.navigate(Routes.ABOUT) } + onContinueGame = { gameId -> navController.navigateSafe(Routes.activeGame(gameId)) }, + onStartNew = { navController.navigateSafe(Routes.GAME_SETUP) }, + onLeaderboard = { navController.navigateSafe(Routes.LEADERBOARD) }, + onManagePlayers = { navController.navigateSafe(Routes.PLAYER_ROSTER) }, + onCustomRules = { navController.navigateSafe(Routes.CUSTOM_RULES) }, + onAbout = { navController.navigateSafe(Routes.ABOUT) } ) } @@ -70,7 +92,7 @@ fun Phase10NavHost( val vm: PlayerRosterViewModel = viewModel(factory = factory) PlayerRosterScreen( vm = vm, - onBack = { navController.popBackStack() } + onBack = { navController.popSafe() } ) } @@ -79,11 +101,11 @@ fun Phase10NavHost( GameSetupScreen( vm = vm, onGameStarted = { gameId -> - navController.navigate(Routes.activeGame(gameId)) { + navController.navigateSafe(Routes.activeGame(gameId)) { popUpTo(Routes.HOME) } }, - onBack = { navController.popBackStack() } + onBack = { navController.popSafe() } ) } @@ -96,18 +118,18 @@ fun Phase10NavHost( val vm: ActiveGameViewModel = viewModel(factory = gameFactory) ActiveGameScreen( vm = vm, - onEnterRound = { navController.navigate(Routes.roundEntry(gameId)) }, + onEnterRound = { navController.navigateSafe(Routes.roundEntry(gameId)) }, onGameEnd = { - navController.navigate(Routes.gameResults(gameId)) { + navController.navigateSafe(Routes.gameResults(gameId)) { popUpTo(Routes.HOME) } }, onGameCancelled = { - navController.navigate(Routes.HOME) { + navController.navigateSafe(Routes.HOME) { popUpTo(Routes.HOME) { inclusive = true } } }, - onBack = { navController.popBackStack() } + onBack = { navController.popSafe() } ) } @@ -120,8 +142,8 @@ fun Phase10NavHost( val vm: RoundEntryViewModel = viewModel(factory = gameFactory) RoundEntryScreen( vm = vm, - onRoundSubmitted = { navController.popBackStack() }, - onBack = { navController.popBackStack() } + onRoundSubmitted = { navController.popSafe() }, + onBack = { navController.popSafe() } ) } @@ -135,7 +157,7 @@ fun Phase10NavHost( GameResultsScreen( vm = vm, onHome = { - navController.navigate(Routes.HOME) { + navController.navigateSafe(Routes.HOME) { popUpTo(Routes.HOME) { inclusive = true } } } @@ -146,7 +168,7 @@ fun Phase10NavHost( val vm: LeaderboardViewModel = viewModel(factory = factory) LeaderboardScreen( vm = vm, - onBack = { navController.popBackStack() } + onBack = { navController.popSafe() } ) } @@ -154,12 +176,12 @@ fun Phase10NavHost( val vm: CustomPhasesViewModel = viewModel(factory = factory) CustomPhasesScreen( vm = vm, - onBack = { navController.popBackStack() } + onBack = { navController.popSafe() } ) } composable(Routes.ABOUT) { - AboutScreen(onBack = { navController.popBackStack() }) + AboutScreen(onBack = { navController.popSafe() }) } } }