From 4a3a4558e22563c8918e40c3b02b8c53574c7a56 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 14 Dec 2025 05:28:10 +0000 Subject: [PATCH] fix(android): respect insets and enable settings scroll --- .../steipete/clawdis/node/ui/RootScreen.kt | 28 ++++++++++--------- .../steipete/clawdis/node/ui/SettingsSheet.kt | 13 ++++++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt b/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt index d2e3afdab..ae4dcedea 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt +++ b/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt @@ -3,9 +3,12 @@ package com.steipete.clawdis.node.ui import android.annotation.SuppressLint import android.webkit.WebView import android.webkit.WebViewClient +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -26,7 +29,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView -import androidx.compose.ui.zIndex +import androidx.compose.ui.window.Popup +import androidx.compose.ui.window.PopupProperties import com.steipete.clawdis.node.MainViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -37,23 +41,22 @@ fun RootScreen(viewModel: MainViewModel) { val safeButtonInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) Box(modifier = Modifier.fillMaxSize()) { - CanvasView(viewModel = viewModel, modifier = Modifier.fillMaxSize().zIndex(0f)) + CanvasView(viewModel = viewModel, modifier = Modifier.fillMaxSize()) + } - Box( + // Keep the overlay buttons above the WebView canvas (AndroidView), otherwise they may not receive touches. + Popup(alignment = Alignment.TopCenter, properties = PopupProperties(focusable = false)) { + Row( modifier = Modifier - .fillMaxSize() - .zIndex(1f) + .fillMaxWidth() .windowInsetsPadding(safeButtonInsets) .padding(12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, ) { - Box(modifier = Modifier.align(Alignment.TopStart)) { - Button(onClick = { sheet = Sheet.Chat }) { Text("Chat") } - } - - Box(modifier = Modifier.align(Alignment.TopEnd)) { - Button(onClick = { sheet = Sheet.Settings }) { Text("Settings") } - } + Button(onClick = { sheet = Sheet.Chat }) { Text("Chat") } + Button(onClick = { sheet = Sheet.Settings }) { Text("Settings") } } } @@ -65,7 +68,6 @@ fun RootScreen(viewModel: MainViewModel) { when (sheet) { Sheet.Chat -> ChatSheet(viewModel = viewModel) Sheet.Settings -> SettingsSheet(viewModel = viewModel) - null -> {} } } } diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt b/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt index 7fdb91046..6bfa0b428 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt +++ b/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt @@ -9,10 +9,16 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState @@ -62,7 +68,12 @@ fun SettingsSheet(viewModel: MainViewModel) { LazyColumn( state = listState, - modifier = Modifier.fillMaxWidth().imePadding(), + modifier = + Modifier + .fillMaxWidth() + .fillMaxHeight() + .imePadding() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)), contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(14.dp), ) {