From 05ec3f3f16092bbd9cbcb5406e4acd2663e1db86 Mon Sep 17 00:00:00 2001 From: Jacob Hagstedt Date: Wed, 21 Oct 2026 20:24:14 +0200 Subject: [PATCH] Android: keyboard no longer covers editor fields (S-19, S-15, S-6) The recurring, category and account editors drew their scrolling body inside KvittScaffold with only the scaffold padding, so with adjustResize and edge-to-edge the keyboard overlaid the content and a focused field (S-19 day of month, notes) stayed hidden. Each body now applies padding(padding).consumeWindowInsets(padding).imePadding(), as S-7 does with imePadding(): the viewport shrinks above the keyboard and Compose's scroll container keeps the focused text field in view. Consuming the scaffold padding first stops the navigation inset (or the S-19 keypad bottom bar) from being counted twice. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B --- .../hagstedt/kvitt/feature/account/AccountEditorScreen.kt | 4 +++- .../feature/settings/categories/CategoryEditorScreen.kt | 4 ++++ .../feature/settings/recurring/RecurringEditorScreen.kt | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/android/feature/account/src/main/kotlin/se/hagstedt/kvitt/feature/account/AccountEditorScreen.kt b/android/feature/account/src/main/kotlin/se/hagstedt/kvitt/feature/account/AccountEditorScreen.kt index 11c3ac7..0c78718 100644 --- a/android/feature/account/src/main/kotlin/se/hagstedt/kvitt/feature/account/AccountEditorScreen.kt +++ b/android/feature/account/src/main/kotlin/se/hagstedt/kvitt/feature/account/AccountEditorScreen.kt @@ -8,8 +8,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -165,7 +167,7 @@ private fun EditorForm(ui: AccountEditorUi, me: User, partner: User, actions: Ac if (ui.loaded && ui.editing == null && ui.online) focus.requestFocus() } Column( - Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(horizontal = spacing.gutter, vertical = spacing.s1), + Modifier.fillMaxSize().padding(padding).consumeWindowInsets(padding).imePadding().verticalScroll(rememberScrollState()).padding(horizontal = spacing.gutter, vertical = spacing.s1), verticalArrangement = Arrangement.spacedBy(KvittDimens.dialogGap), ) { if (!ui.online) { diff --git a/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/categories/CategoryEditorScreen.kt b/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/categories/CategoryEditorScreen.kt index 1e35d4a..f90e38c 100644 --- a/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/categories/CategoryEditorScreen.kt +++ b/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/categories/CategoryEditorScreen.kt @@ -5,8 +5,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -122,6 +124,8 @@ fun CategoryEditorContent(state: CategoryEditorState?, actions: CategoryEditorAc Modifier .fillMaxSize() .padding(padding) + .consumeWindowInsets(padding) + .imePadding() .verticalScroll(rememberScrollState()) .padding(horizontal = KvittTheme.spacing.gutter, vertical = KvittTheme.spacing.s2), verticalArrangement = Arrangement.spacedBy(KvittTheme.spacing.detailGap), diff --git a/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/recurring/RecurringEditorScreen.kt b/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/recurring/RecurringEditorScreen.kt index 680d679..cf20571 100644 --- a/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/recurring/RecurringEditorScreen.kt +++ b/android/feature/settings/src/main/kotlin/se/hagstedt/kvitt/feature/settings/recurring/RecurringEditorScreen.kt @@ -8,9 +8,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState @@ -186,7 +188,9 @@ fun RecurringEditorContent(state: RecurringEditorState?, actions: RecurringEdito ) { padding -> if (state == null) return@KvittScaffold ProvideHousehold(state.options.me, state.options.partner) { - EditorBody(state, actions, Modifier.padding(padding)) + // The keyboard shrinks the scrolling body (adjustResize, as S-7) so a focused field stays above it; consuming the + // scaffold padding first keeps the bottom bar or navigation inset from counting twice. + EditorBody(state, actions, Modifier.padding(padding).consumeWindowInsets(padding).imePadding()) when (state.sheet) { EditorSheet.Category -> ModalBottomSheet(actions.onCloseSheet) { CategoryGrid(state.options.categories, state.form.categoryId, { actions.onCategory(it.id) }, Modifier.padding(KvittTheme.spacing.gutter))