From 7cd424e2063b5c04bbae0143b9de848cbf3f38b1 Mon Sep 17 00:00:00 2001 From: Hassan Date: Sun, 19 Jul 2026 04:54:37 +0300 Subject: [PATCH] fix: keep navigation layout stable across rotation --- .../commonMain/kotlin/com/nuvio/app/App.kt | 13 +++++++- .../kotlin/com/nuvio/app/AppLayoutTest.kt | 32 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 composeApp/src/commonTest/kotlin/com/nuvio/app/AppLayoutTest.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt index 94a991150..8afde0f65 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt @@ -68,6 +68,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -1842,7 +1843,11 @@ private fun MainAppContent( ) BoxWithConstraints(modifier = Modifier.fillMaxSize()) { - val isTabletLayout = useTabletFloatingTabBar || maxWidth >= 768.dp + val isTabletLayout = isTabletAppLayout( + width = maxWidth, + height = maxHeight, + forceTabletLayout = useTabletFloatingTabBar, + ) val useNativeBottomTabs = if (useNativeNavigation) { useNativeTabBar } else { @@ -3574,6 +3579,12 @@ private fun MainAppContent( } } +internal fun isTabletAppLayout( + width: Dp, + height: Dp, + forceTabletLayout: Boolean = false, +): Boolean = forceTabletLayout || minOf(width, height) >= 768.dp + @Composable private fun rememberGuardedPopBackStack( navController: NuvioNavigator, diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/AppLayoutTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/AppLayoutTest.kt new file mode 100644 index 000000000..e53c2f246 --- /dev/null +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/AppLayoutTest.kt @@ -0,0 +1,32 @@ +package com.nuvio.app + +import androidx.compose.ui.unit.dp +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class AppLayoutTest { + + @Test + fun `phone navigation classification stays stable across rotation`() { + assertFalse(isTabletAppLayout(width = 666.dp, height = 1000.dp)) + assertFalse(isTabletAppLayout(width = 1000.dp, height = 666.dp)) + } + + @Test + fun `tablet navigation classification stays stable across rotation`() { + assertTrue(isTabletAppLayout(width = 800.dp, height = 1280.dp)) + assertTrue(isTabletAppLayout(width = 1280.dp, height = 800.dp)) + } + + @Test + fun `platform override still forces tablet navigation`() { + assertTrue( + isTabletAppLayout( + width = 390.dp, + height = 844.dp, + forceTabletLayout = true, + ), + ) + } +}