From a05b2ea92934fee5e4b230bf45e713f063256fb5 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 9 Mar 2026 13:17:53 +0300 Subject: [PATCH] android: fix system insets for status and nav bars --- android/CHANGELOG.md | 6 ++++++ .../java/ru/daemonlord/messenger/MainActivity.kt | 2 ++ .../ru/daemonlord/messenger/ui/auth/LoginScreen.kt | 4 ++++ .../ru/daemonlord/messenger/ui/chat/ChatScreen.kt | 12 ++++++++++-- .../daemonlord/messenger/ui/chats/ChatListScreen.kt | 7 ++++++- .../messenger/ui/navigation/AppNavGraph.kt | 7 ++++++- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 6e6d7cb..93e201e 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -156,3 +156,9 @@ - Extended message DAO tests with attachment relation verification. - Added Android smoke and baseline document (`docs/android-smoke.md`) with test matrix and performance targets. - Updated Android checklist quality section with initial performance baseline completion. + +### Step 25 - UI safe insets fix +- Enabled edge-to-edge mode in `MainActivity` via `enableEdgeToEdge()`. +- Added safe area insets handling (`WindowInsets.safeDrawing`) for login, chat list, session-check and chat screens. +- Added bottom composer protection in chat screen with `navigationBarsPadding()` and `imePadding()`. +- Fixed UI overlap with status bar and navigation bar on modern Android devices. diff --git a/android/app/src/main/java/ru/daemonlord/messenger/MainActivity.kt b/android/app/src/main/java/ru/daemonlord/messenger/MainActivity.kt index e6ec322..538fccc 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/MainActivity.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/MainActivity.kt @@ -2,6 +2,7 @@ package ru.daemonlord.messenger import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.enableEdgeToEdge import androidx.activity.compose.setContent import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -15,6 +16,7 @@ import ru.daemonlord.messenger.ui.navigation.MessengerNavHost class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() setContent { MaterialTheme { Surface(modifier = Modifier.fillMaxSize()) { diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/auth/LoginScreen.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/auth/LoginScreen.kt index 6c98e5a..83b2157 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/auth/LoginScreen.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/auth/LoginScreen.kt @@ -4,7 +4,10 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme @@ -27,6 +30,7 @@ fun LoginScreen( Column( modifier = Modifier .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing) .padding(horizontal = 24.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt index 5ec3a96..a3ee84d 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt @@ -19,8 +19,10 @@ 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.imePadding +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Button @@ -41,6 +43,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.compose.AsyncImage @@ -103,7 +107,9 @@ fun ChatScreen( ) { var viewerImageUrl by remember { mutableStateOf(null) } Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing), ) { Row( modifier = Modifier @@ -227,6 +233,8 @@ fun ChatScreen( Row( modifier = Modifier .fillMaxWidth() + .navigationBarsPadding() + .imePadding() .padding(horizontal = 12.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp), diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chats/ChatListScreen.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chats/ChatListScreen.kt index fb06b01..59ab26f 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chats/ChatListScreen.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chats/ChatListScreen.kt @@ -7,7 +7,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.AssistChip @@ -66,7 +69,9 @@ fun ChatListScreen( onOpenChat: (Long) -> Unit, ) { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing), ) { TabRow( selectedTabIndex = if (state.selectedTab == ChatTab.ALL) 0 else 1, diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt index 0e8f671..3b00bd6 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt @@ -2,7 +2,10 @@ package ru.daemonlord.messenger.ui.navigation import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -105,7 +108,9 @@ fun MessengerNavHost( @Composable private fun SessionCheckingScreen() { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) {