Skip to content

Commit 94e7ad6

Browse files
fix: refactored and fixed memory leak in isImeVisibleState function
1 parent b126701 commit 94e7ad6

File tree

1 file changed

+11
-21
lines changed

1 file changed

+11
-21
lines changed

core/src/main/java/org/openedx/core/ui/ComposeExtensions.kt

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package org.openedx.core.ui
22

33
import android.content.res.Configuration
4-
import android.graphics.Rect
5-
import android.view.ViewTreeObserver
64
import androidx.compose.foundation.clickable
75
import androidx.compose.foundation.interaction.MutableInteractionSource
6+
import androidx.compose.foundation.layout.WindowInsets
7+
import androidx.compose.foundation.layout.ime
88
import androidx.compose.foundation.layout.padding
99
import androidx.compose.foundation.lazy.LazyListState
1010
import androidx.compose.foundation.lazy.grid.LazyGridState
1111
import androidx.compose.foundation.pager.PagerState
1212
import androidx.compose.runtime.Composable
13-
import androidx.compose.runtime.DisposableEffect
13+
import androidx.compose.runtime.LaunchedEffect
1414
import androidx.compose.runtime.MutableState
1515
import androidx.compose.runtime.ReadOnlyComposable
1616
import androidx.compose.runtime.Stable
@@ -34,7 +34,6 @@ import androidx.compose.ui.platform.LocalConfiguration
3434
import androidx.compose.ui.platform.LocalContext
3535
import androidx.compose.ui.platform.LocalDensity
3636
import androidx.compose.ui.platform.LocalInspectionMode
37-
import androidx.compose.ui.platform.LocalView
3837
import androidx.compose.ui.res.painterResource
3938
import androidx.compose.ui.unit.Dp
4039
import 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

180170
fun PagerState.calculateCurrentOffsetForPage(page: Int): Float {

0 commit comments

Comments
 (0)