Skip to content

Commit 0874aec

Browse files
committed
fix(modals): only dismiss IME (and wait) when IME is open
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 7306229 commit 0874aec

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

app/src/main/java/com/getcode/navigation/screens/Modals.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.getcode.navigation.core.CodeNavigator
2626
import com.getcode.navigation.core.LocalCodeNavigator
2727
import com.getcode.theme.CodeTheme
2828
import com.getcode.theme.sheetHeight
29+
import com.getcode.util.keyboardAsState
2930
import com.getcode.util.recomposeHighlighter
3031
import com.getcode.view.components.SheetTitle
3132
import kotlinx.coroutines.delay
@@ -98,13 +99,18 @@ internal interface ModalContent {
9899
val keyboardController = LocalSoftwareKeyboardController.current
99100
val composeScope = rememberCoroutineScope()
100101

102+
val keyboardVisible by keyboardAsState()
103+
101104
val hideSheet = {
102105
composeScope.launch {
103-
keyboardController?.hide()
104-
delay(500)
106+
if (keyboardVisible) {
107+
keyboardController?.hide()
108+
delay(500)
109+
}
105110
navigator.hide()
106111
}
107112
}
113+
108114
SheetTitle(
109115
modifier = Modifier,
110116
title = {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.getcode.util
2+
3+
import android.view.ViewTreeObserver
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.DisposableEffect
6+
import androidx.compose.runtime.State
7+
import androidx.compose.runtime.mutableStateOf
8+
import androidx.compose.runtime.remember
9+
import androidx.compose.ui.platform.LocalView
10+
import androidx.core.view.ViewCompat
11+
import androidx.core.view.WindowInsetsCompat
12+
13+
@Composable
14+
fun keyboardAsState(): State<Boolean> {
15+
val keyboardState = remember { mutableStateOf(false) }
16+
val view = LocalView.current
17+
val viewTreeObserver = view.viewTreeObserver
18+
DisposableEffect(viewTreeObserver) {
19+
val listener = ViewTreeObserver.OnGlobalLayoutListener {
20+
keyboardState.value = ViewCompat.getRootWindowInsets(view)
21+
?.isVisible(WindowInsetsCompat.Type.ime()) ?: true
22+
}
23+
viewTreeObserver.addOnGlobalLayoutListener(listener)
24+
onDispose { viewTreeObserver.removeOnGlobalLayoutListener(listener) }
25+
}
26+
return keyboardState
27+
}

0 commit comments

Comments
 (0)