11package org.openedx.core.ui
22
33import android.content.res.Configuration
4- import android.graphics.Rect
5- import android.view.ViewTreeObserver
64import androidx.compose.foundation.clickable
75import androidx.compose.foundation.interaction.MutableInteractionSource
6+ import androidx.compose.foundation.layout.WindowInsets
7+ import androidx.compose.foundation.layout.ime
88import androidx.compose.foundation.layout.padding
99import androidx.compose.foundation.lazy.LazyListState
1010import androidx.compose.foundation.lazy.grid.LazyGridState
1111import androidx.compose.foundation.pager.PagerState
1212import androidx.compose.runtime.Composable
13- import androidx.compose.runtime.DisposableEffect
13+ import androidx.compose.runtime.LaunchedEffect
1414import androidx.compose.runtime.MutableState
1515import androidx.compose.runtime.ReadOnlyComposable
1616import androidx.compose.runtime.Stable
@@ -34,7 +34,6 @@ import androidx.compose.ui.platform.LocalConfiguration
3434import androidx.compose.ui.platform.LocalContext
3535import androidx.compose.ui.platform.LocalDensity
3636import androidx.compose.ui.platform.LocalInspectionMode
37- import androidx.compose.ui.platform.LocalView
3837import androidx.compose.ui.res.painterResource
3938import androidx.compose.ui.unit.Dp
4039import androidx.compose.ui.unit.dp
@@ -156,25 +155,16 @@ fun <T : Any> rememberSaveableMap(init: () -> MutableMap<String, T?>): MutableMa
156155}
157156
158157@Composable
159- fun isImeVisibleState (): State <Boolean > {
160- val keyboardState = remember { mutableStateOf(false ) }
161- val view = LocalView .current
162- DisposableEffect (view) {
163- val onGlobalListener = ViewTreeObserver .OnGlobalLayoutListener {
164- val rect = Rect ()
165- view.getWindowVisibleDisplayFrame(rect)
166- val screenHeight = view.rootView.height
167- val keypadHeight = screenHeight - rect.bottom
168- keyboardState.value = keypadHeight > screenHeight * KEYBOARD_VISIBILITY_THRESHOLD
169- }
170- view.viewTreeObserver.addOnGlobalLayoutListener(onGlobalListener)
171-
172- onDispose {
173- view.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalListener)
174- }
158+ fun isImeVisibleState (threshold : Int = 0): State <Boolean > {
159+ val imeInsets = WindowInsets .ime
160+ val imeBottom = imeInsets.getBottom(LocalDensity .current)
161+ val isOpen = remember(imeBottom) { mutableStateOf(false ) }
162+
163+ LaunchedEffect (imeBottom) {
164+ isOpen.value = imeBottom > threshold
175165 }
176166
177- return keyboardState
167+ return isOpen
178168}
179169
180170fun PagerState.calculateCurrentOffsetForPage (page : Int ): Float {
0 commit comments