From bd070ba3a43df3f78c125f6227dd3b475de6b4e5 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Mon, 31 Aug 2026 09:10:48 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20intercepter=20le=20back=20syst=C3=A8me?= =?UTF-8?q?=20pour=20revenir=20=C3=A0=20l'accueil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le geste back Android part du bord même de l'écran : l'OS intercepte le geste avant le SwipeBack custom (zone de départ > 24 dp) et, sans callback back enregistré, l'activité est envoyée en arrière-plan vers le launcher au lieu de revenir à l'écran précédent. Enregistre un BackHandler par écran (Historique et Résultats retournent à l'accueil, la partie ouvre le dialogue d'abandon) et active le predictive back dans le manifest. --- androidApp/src/main/AndroidManifest.xml | 1 + gradle/libs.versions.toml | 1 + sharedUI/build.gradle.kts | 1 + .../src/commonMain/kotlin/com/livrets/App.kt | 13 +++++++ .../kotlin/com/livrets/ui/GameScreen.kt | 3 ++ .../kotlin/com/livrets/BackNavigationTest.kt | 38 +++++++++++++++++++ 6 files changed, 57 insertions(+) create mode 100644 sharedUI/src/commonTest/kotlin/com/livrets/BackNavigationTest.kt diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 3eea960..95986e5 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ null + is Screen.Game -> null + is Screen.Results -> Screen.Home + Screen.History -> Screen.Home +} + @Composable fun App( filesDirPath: String, @@ -48,6 +56,11 @@ fun App( HomeScreen(onPlay = {}, onHistory = {}, onLeaderboard = {}) } + screen.backTarget()?.let { target -> + @OptIn(androidx.compose.ui.ExperimentalComposeUiApi::class) + BackHandler { screen = target } + } + when (val current = screen) { Screen.Home -> HomeScreen( onPlay = { config -> screen = Screen.Game(config) }, diff --git a/sharedUI/src/commonMain/kotlin/com/livrets/ui/GameScreen.kt b/sharedUI/src/commonMain/kotlin/com/livrets/ui/GameScreen.kt index 425ecb6..21d395d 100644 --- a/sharedUI/src/commonMain/kotlin/com/livrets/ui/GameScreen.kt +++ b/sharedUI/src/commonMain/kotlin/com/livrets/ui/GameScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.backhandler.BackHandler import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -52,6 +53,8 @@ fun GameScreen( LaunchedEffect(engine) { engine.start() } var showQuitDialog by remember { mutableStateOf(false) } + @OptIn(androidx.compose.ui.ExperimentalComposeUiApi::class) + BackHandler { showQuitDialog = true } if (showQuitDialog) { AlertDialog( onDismissRequest = { showQuitDialog = false }, diff --git a/sharedUI/src/commonTest/kotlin/com/livrets/BackNavigationTest.kt b/sharedUI/src/commonTest/kotlin/com/livrets/BackNavigationTest.kt new file mode 100644 index 0000000..d544472 --- /dev/null +++ b/sharedUI/src/commonTest/kotlin/com/livrets/BackNavigationTest.kt @@ -0,0 +1,38 @@ +package com.livrets + +import com.livrets.game.GameConfig +import com.livrets.game.GameResult +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class BackNavigationTest { + + private val config = GameConfig(questionCount = 10, secondsPerQuestion = 5, maxTable = 10) + + private val result = GameResult( + date = kotlin.time.Instant.fromEpochMilliseconds(0L), + config = config, + records = emptyList(), + ) + + @Test + fun `back depuis l historique ramene a l accueil`() { + assertEquals(Screen.Home, Screen.History.backTarget()) + } + + @Test + fun `back depuis les resultats ramene a l accueil`() { + assertEquals(Screen.Home, Screen.Results(result).backTarget()) + } + + @Test + fun `pas de navigation back depuis l accueil`() { + assertNull(Screen.Home.backTarget()) + } + + @Test + fun `pas de navigation back depuis une partie`() { + assertNull(Screen.Game(config).backTarget()) + } +}