From d2883db803cb5a0df446a3391f2d3b8695ae70ba Mon Sep 17 00:00:00 2001 From: PTah Date: Thu, 11 Jun 2026 09:42:39 +1000 Subject: [PATCH] fix: preserve tab on back and avoid nav bar overlap (0.4.5) Keep the selected bottom tab when returning from host/event detail screens. Add navigation bar padding on scrollable detail screens. Co-authored-by: Cursor --- app/build.gradle.kts | 4 ++-- .../java/ru/kalinamall/seaca/MainActivity.kt | 16 +++++++++++----- .../kalinamall/seaca/ui/screens/DetailScreens.kt | 7 +++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7bd19c0..60d0ce0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "ru.kalinamall.seaca" minSdk = 26 targetSdk = 35 - versionCode = 7 - versionName = "0.4.3" + versionCode = 9 + versionName = "0.4.5" } buildTypes { diff --git a/app/src/main/java/ru/kalinamall/seaca/MainActivity.kt b/app/src/main/java/ru/kalinamall/seaca/MainActivity.kt index e8bf179..a08c9ca 100644 --- a/app/src/main/java/ru/kalinamall/seaca/MainActivity.kt +++ b/app/src/main/java/ru/kalinamall/seaca/MainActivity.kt @@ -28,6 +28,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf as composeMutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -162,6 +164,8 @@ private fun SeacaApp( val role = repo.session.getRole() role == "operator" || role == "admin" } + var mainTabIndex by rememberSaveable { mutableIntStateOf(MainTab.Dashboard.ordinal) } + val mainTab = MainTab.entries[mainTabIndex.coerceIn(MainTab.entries.indices)] SeacaTheme { if (!loggedIn) { @@ -183,6 +187,8 @@ private fun SeacaApp( composable("main") { MainShell( repo = repo, + selectedTab = mainTab, + onTabSelected = { mainTabIndex = it.ordinal }, onOpenEvent = { nav.navigate("event/$it") }, onOpenProblem = { nav.navigate("problem/$it") }, onOpenHost = { nav.navigate("host/$it") }, @@ -231,20 +237,20 @@ private enum class MainTab(val label: String) { @Composable private fun MainShell( repo: SacRepository, + selectedTab: MainTab, + onTabSelected: (MainTab) -> Unit, onOpenEvent: (Long) -> Unit, onOpenProblem: (Long) -> Unit, onOpenHost: (Long) -> Unit, onOpenDevice: () -> Unit, ) { - var tab by remember { mutableStateOf(MainTab.Dashboard) } - Scaffold( bottomBar = { NavigationBar { MainTab.entries.forEach { item -> NavigationBarItem( - selected = tab == item, - onClick = { tab = item }, + selected = selectedTab == item, + onClick = { onTabSelected(item) }, icon = { Icon( when (item) { @@ -270,7 +276,7 @@ private fun MainShell( }, ) { padding -> Box(Modifier.padding(padding)) { - when (tab) { + when (selectedTab) { MainTab.Dashboard -> DashboardScreen(repo) MainTab.Events -> EventsScreen(repo, onOpenEvent) MainTab.Problems -> ProblemsScreen(repo, onOpenProblem) diff --git a/app/src/main/java/ru/kalinamall/seaca/ui/screens/DetailScreens.kt b/app/src/main/java/ru/kalinamall/seaca/ui/screens/DetailScreens.kt index c59ce1a..d81ea73 100644 --- a/app/src/main/java/ru/kalinamall/seaca/ui/screens/DetailScreens.kt +++ b/app/src/main/java/ru/kalinamall/seaca/ui/screens/DetailScreens.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -215,7 +216,8 @@ fun DeviceScreen(repo: SacRepository, onLogout: () -> Unit) { Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(16.dp), + .padding(16.dp) + .navigationBarsPadding(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text("Моё устройство", style = MaterialTheme.typography.titleLarge) @@ -275,7 +277,8 @@ private fun DetailFrame( Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(16.dp), + .padding(16.dp) + .navigationBarsPadding(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { Button(onClick = onBack) { Text("Назад") }