Skip to content

Commit 089fb0d

Browse files
Consume navigation bar insets before applying imePadding (#647)
1 parent c84eb6b commit 089fb0d

File tree

3 files changed

+9
-34
lines changed

3 files changed

+9
-34
lines changed

gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/abouteditor/AboutEditor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.Column
77
import androidx.compose.foundation.layout.fillMaxWidth
88
import androidx.compose.foundation.layout.height
9+
import androidx.compose.foundation.layout.imePadding
910
import androidx.compose.foundation.layout.padding
1011
import androidx.compose.foundation.layout.wrapContentSize
1112
import androidx.compose.foundation.rememberScrollState
@@ -43,7 +44,6 @@ import com.gravatar.quickeditor.ui.components.CtaSection
4344
import com.gravatar.quickeditor.ui.components.QEButton
4445
import com.gravatar.quickeditor.ui.editor.AboutInputField
4546
import com.gravatar.quickeditor.ui.editor.bottomsheet.DEFAULT_PAGE_HEIGHT
46-
import com.gravatar.quickeditor.ui.editor.bottomsheet.positionAwareImePadding
4747
import com.gravatar.quickeditor.ui.extensions.QESnackbarHost
4848
import com.gravatar.quickeditor.ui.extensions.SnackbarType
4949
import com.gravatar.quickeditor.ui.extensions.showQESnackbar
@@ -117,6 +117,7 @@ internal fun AboutEditor(
117117
Surface {
118118
Box(
119119
modifier = Modifier
120+
.imePadding()
120121
.wrapContentSize(),
121122
) {
122123
AboutEditor(
@@ -149,7 +150,6 @@ internal fun AboutEditor(uiState: AboutEditorUiState, onEvent: (AboutEditorEvent
149150
Surface {
150151
Column(
151152
modifier = Modifier
152-
.positionAwareImePadding()
153153
.padding(bottom = 24.dp)
154154
.then(if (uiState.compactWindow) Modifier.verticalScroll(rememberScrollState()) else Modifier),
155155
) {

gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/alttext/AltTextPage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.Row
1212
import androidx.compose.foundation.layout.fillMaxSize
1313
import androidx.compose.foundation.layout.fillMaxWidth
1414
import androidx.compose.foundation.layout.height
15+
import androidx.compose.foundation.layout.imePadding
1516
import androidx.compose.foundation.layout.padding
1617
import androidx.compose.foundation.layout.size
1718
import androidx.compose.foundation.layout.wrapContentSize
@@ -52,7 +53,6 @@ import com.gravatar.quickeditor.ui.components.QEPage
5253
import com.gravatar.quickeditor.ui.components.QESectionTitle
5354
import com.gravatar.quickeditor.ui.components.QETopBar
5455
import com.gravatar.quickeditor.ui.components.QETopBarTextButton
55-
import com.gravatar.quickeditor.ui.editor.bottomsheet.positionAwareImePadding
5656
import com.gravatar.quickeditor.ui.extensions.QESnackbarHost
5757
import com.gravatar.quickeditor.ui.extensions.SnackbarType
5858
import com.gravatar.quickeditor.ui.extensions.showQESnackbar
@@ -130,6 +130,7 @@ internal fun AltTextPage(
130130
Box(
131131
modifier = modifier
132132
.padding(16.dp)
133+
.imePadding()
133134
.wrapContentSize(),
134135
) {
135136
state.let { altTextState ->
@@ -160,7 +161,6 @@ internal fun AltTextPage(
160161
Surface(modifier = modifier.fillMaxWidth()) {
161162
Box(
162163
modifier = Modifier
163-
.positionAwareImePadding()
164164
.verticalScroll(rememberScrollState())
165165
.animateContentSize()
166166
.border(

gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.WindowInsetsSides
1212
import androidx.compose.foundation.layout.asPaddingValues
1313
import androidx.compose.foundation.layout.consumeWindowInsets
1414
import androidx.compose.foundation.layout.fillMaxWidth
15-
import androidx.compose.foundation.layout.imePadding
1615
import androidx.compose.foundation.layout.navigationBars
1716
import androidx.compose.foundation.layout.only
1817
import androidx.compose.foundation.layout.padding
@@ -28,21 +27,15 @@ import androidx.compose.runtime.CompositionLocalProvider
2827
import androidx.compose.runtime.DisposableEffect
2928
import androidx.compose.runtime.LaunchedEffect
3029
import androidx.compose.runtime.getValue
31-
import androidx.compose.runtime.mutableIntStateOf
3230
import androidx.compose.runtime.mutableStateOf
3331
import androidx.compose.runtime.remember
3432
import androidx.compose.runtime.rememberCoroutineScope
3533
import androidx.compose.runtime.setValue
3634
import androidx.compose.ui.Alignment
3735
import androidx.compose.ui.Modifier
38-
import androidx.compose.ui.composed
3936
import androidx.compose.ui.draw.clip
4037
import androidx.compose.ui.focus.onFocusChanged
41-
import androidx.compose.ui.layout.findRootCoordinates
42-
import androidx.compose.ui.layout.onGloballyPositioned
43-
import androidx.compose.ui.layout.positionInWindow
4438
import androidx.compose.ui.platform.LocalConfiguration
45-
import androidx.compose.ui.platform.LocalContext
4639
import androidx.compose.ui.unit.dp
4740
import androidx.core.view.WindowInsetsControllerCompat
4841
import androidx.window.core.layout.WindowHeightSizeClass
@@ -57,7 +50,6 @@ import com.composables.core.SheetDetent.Companion.Hidden
5750
import com.composables.core.rememberModalBottomSheetState
5851
import com.composeunstyled.LocalModalWindow
5952
import com.gravatar.quickeditor.QuickEditorContainer
60-
import com.gravatar.quickeditor.ui.avatarpicker.pxToDp
6153
import com.gravatar.quickeditor.ui.components.QEDragHandle
6254
import com.gravatar.quickeditor.ui.editor.AuthenticationMethod
6355
import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout
@@ -301,17 +293,17 @@ private fun GravatarModalBottomSheet(
301293
},
302294
),
303295
) {
296+
val paddingValues = WindowInsets.navigationBars
297+
.only(WindowInsetsSides.Vertical)
298+
.asPaddingValues()
304299
Sheet(
305300
modifier = Modifier
306301
.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp))
307302
.background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
308303
.widthIn(max = 640.dp)
309304
.fillMaxWidth()
310-
.padding(
311-
WindowInsets.navigationBars
312-
.only(WindowInsetsSides.Vertical)
313-
.asPaddingValues(),
314-
),
305+
.padding(paddingValues)
306+
.consumeWindowInsets(paddingValues),
315307
) {
316308
val window = LocalModalWindow.current
317309
val isDarkTheme = isSystemInDarkTheme()
@@ -402,23 +394,6 @@ private fun QuickEditorScopeOption.initialDetent(windowHeightSizeClass: WindowHe
402394
}
403395
}
404396

405-
/**
406-
* The default .imePadding adds a lot of extra padding to the bottom of the screen
407-
* This is a workaround, see https://stackoverflow.com/questions/76014880/enormous-ime-padding-in-jetpack-compose
408-
*/
409-
internal fun Modifier.positionAwareImePadding(): Modifier = composed {
410-
var consumePadding by remember { mutableIntStateOf(0) }
411-
412-
this
413-
.onGloballyPositioned { coordinates ->
414-
val root = coordinates.findRootCoordinates()
415-
val bottom = coordinates.positionInWindow().y + coordinates.size.height
416-
consumePadding = (root.size.height - bottom).toInt().coerceAtLeast(0)
417-
}
418-
.consumeWindowInsets(PaddingValues(bottom = consumePadding.pxToDp(LocalContext.current)))
419-
.imePadding()
420-
}
421-
422397
internal data class ModalDetents(
423398
val initialDetent: SheetDetent,
424399
val detents: List<SheetDetent>,

0 commit comments

Comments
 (0)