Skip to content

fix: remove window insets listener #968

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 8 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,27 @@ class KeyboardControllerViewManager(
private val manager = KeyboardControllerViewManagerImpl(mReactContext)
private val mDelegate = KeyboardControllerViewManagerDelegate(this)

override fun getDelegate(): ViewManagerDelegate<ReactViewGroup> = mDelegate

override fun getName(): String = KeyboardControllerViewManagerImpl.NAME
override fun createViewInstance(context: ThemedReactContext): ReactViewGroup {
return manager.createViewInstance(context)
}

override fun createViewInstance(context: ThemedReactContext): ReactViewGroup = manager.createViewInstance(context)
override fun invalidate() {
super.invalidate()
manager.invalidate()
}

override fun onAfterUpdateTransaction(view: ReactViewGroup) {
super.onAfterUpdateTransaction(view)
manager.setEdgeToEdge(view as EdgeToEdgeReactViewGroup)
}

override fun onDropViewInstance(view: ReactViewGroup) {
super.onDropViewInstance(view)
manager.onDropViewInstance(view as EdgeToEdgeReactViewGroup)
}
// endregion

// region Props setters
@ReactProp(name = "statusBarTranslucent")
override fun setStatusBarTranslucent(
view: ReactViewGroup,
Expand All @@ -52,7 +62,14 @@ class KeyboardControllerViewManager(
view: ReactViewGroup,
value: Boolean,
) = manager.setEnabled(view as EdgeToEdgeReactViewGroup, value)
// endregion

// region Getters
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
manager.getExportedCustomDirectEventTypeConstants()

override fun getDelegate(): ViewManagerDelegate<ReactViewGroup> = mDelegate

override fun getName(): String = KeyboardControllerViewManagerImpl.NAME
// endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,8 @@ import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.UIManagerHelper
import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.EventDispatcher
import com.reactnativekeyboardcontroller.listeners.WindowDimensionListener
import com.reactnativekeyboardcontroller.log.Logger

fun ThemedReactContext.setupWindowDimensionsListener() {
WindowDimensionListener(this)
}

fun ThemedReactContext?.dispatchEvent(
viewId: Int,
event: Event<*>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.reactnativekeyboardcontroller.listeners

import android.view.ViewGroup
import android.view.ViewTreeObserver
import com.facebook.react.bridge.Arguments
import com.facebook.react.uimanager.ThemedReactContext
import com.reactnativekeyboardcontroller.extensions.content
Expand All @@ -16,8 +17,9 @@ class WindowDimensionListener(
private val context: ThemedReactContext?,
) {
private var lastDispatchedDimensions = Dimensions(0.0, 0.0)
private var layoutListener: ViewTreeObserver.OnGlobalLayoutListener? = null

init {
public fun attachListener() {
// attach to content view only once per app instance
if (context != null && listenerID != context.hashCode()) {
listenerID = context.hashCode()
Expand All @@ -26,12 +28,19 @@ class WindowDimensionListener(

updateWindowDimensions(content)

content?.viewTreeObserver?.addOnGlobalLayoutListener {
updateWindowDimensions(content)
}
layoutListener =
ViewTreeObserver.OnGlobalLayoutListener {
updateWindowDimensions(content)
}

content?.viewTreeObserver?.addOnGlobalLayoutListener(layoutListener)
}
}

public fun detachListener() {
context?.content?.viewTreeObserver?.removeOnGlobalLayoutListener(layoutListener)
}

private fun updateWindowDimensions(content: ViewGroup?) {
if (content == null) {
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,27 @@ import com.reactnativekeyboardcontroller.events.FocusedInputLayoutChangedEvent
import com.reactnativekeyboardcontroller.events.FocusedInputSelectionChangedEvent
import com.reactnativekeyboardcontroller.events.FocusedInputTextChangedEvent
import com.reactnativekeyboardcontroller.events.KeyboardTransitionEvent
import com.reactnativekeyboardcontroller.listeners.WindowDimensionListener
import com.reactnativekeyboardcontroller.views.EdgeToEdgeReactViewGroup

@Suppress("detekt:UnusedPrivateProperty")
class KeyboardControllerViewManagerImpl(
mReactContext: ReactApplicationContext,
) {
fun createViewInstance(reactContext: ThemedReactContext): EdgeToEdgeReactViewGroup =
EdgeToEdgeReactViewGroup(reactContext)

private var listener : WindowDimensionListener? = null

fun createViewInstance(reactContext: ThemedReactContext): EdgeToEdgeReactViewGroup {
if (listener == null) {
listener = WindowDimensionListener(reactContext)
listener?.attachListener()
}
return EdgeToEdgeReactViewGroup(reactContext)
}

fun invalidate() {
listener?.detachListener()
}

fun setEnabled(
view: EdgeToEdgeReactViewGroup,
Expand Down Expand Up @@ -70,6 +83,11 @@ class KeyboardControllerViewManagerImpl(
return map
}

fun onDropViewInstance(view: EdgeToEdgeReactViewGroup) {
view.setActive(false)
view.removeWindowInsetsListener()
}

companion object {
const val NAME = "KeyboardControllerView"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import com.reactnativekeyboardcontroller.extensions.content
import com.reactnativekeyboardcontroller.extensions.removeSelf
import com.reactnativekeyboardcontroller.extensions.requestApplyInsetsWhenAttached
import com.reactnativekeyboardcontroller.extensions.rootView
import com.reactnativekeyboardcontroller.extensions.setupWindowDimensionsListener
import com.reactnativekeyboardcontroller.listeners.KeyboardAnimationCallback
import com.reactnativekeyboardcontroller.listeners.KeyboardAnimationCallbackConfig
import com.reactnativekeyboardcontroller.log.Logger
Expand Down Expand Up @@ -51,7 +50,6 @@ class EdgeToEdgeReactViewGroup(
private val modalAttachedWatcher = ModalAttachedWatcher(this, reactContext, config, ::getKeyboardCallback)

init {
reactContext.setupWindowDimensionsListener()
tag = VIEW_TAG
}

Expand Down Expand Up @@ -124,6 +122,13 @@ class EdgeToEdgeReactViewGroup(
}
}

fun removeWindowInsetsListener() {
val rootView = reactContext.rootView
if (rootView != null) {
ViewCompat.setOnApplyWindowInsetsListener(rootView, null)
}
}

fun setEdgeToEdge() {
val nextValue = active || isPreservingEdgeToEdge

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
import com.facebook.react.views.view.ReactViewGroup
import com.facebook.react.views.view.ReactViewManager
import com.reactnativekeyboardcontroller.listeners.WindowDimensionListener
import com.reactnativekeyboardcontroller.managers.KeyboardControllerViewManagerImpl
import com.reactnativekeyboardcontroller.views.EdgeToEdgeReactViewGroup

Expand All @@ -13,16 +14,28 @@ class KeyboardControllerViewManager(
) : ReactViewManager() {
private val manager = KeyboardControllerViewManagerImpl(mReactContext)

override fun getName(): String = KeyboardControllerViewManagerImpl.NAME
// region Lifecycle
override fun createViewInstance(context: ThemedReactContext): ReactViewGroup {
return manager.createViewInstance(context)
}

override fun createViewInstance(reactContext: ThemedReactContext): EdgeToEdgeReactViewGroup =
manager.createViewInstance(reactContext)
override fun invalidate() {
super.invalidate()
manager.invalidate()
}

override fun onAfterUpdateTransaction(view: ReactViewGroup) {
super.onAfterUpdateTransaction(view)
manager.setEdgeToEdge(view as EdgeToEdgeReactViewGroup)
}

override fun onDropViewInstance(view: ReactViewGroup) {
super.onDropViewInstance(view)
manager.onDropViewInstance(view as EdgeToEdgeReactViewGroup)
}
// endregion

// region Props setters
@ReactProp(name = "enabled")
fun setEnabled(
view: EdgeToEdgeReactViewGroup,
Expand Down Expand Up @@ -54,7 +67,12 @@ class KeyboardControllerViewManager(
) {
manager.setPreserveEdgeToEdge(view, isPreservingEdgeToEdge)
}
// endregion

// region Getters
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
manager.getExportedCustomDirectEventTypeConstants()

override fun getName(): String = KeyboardControllerViewManagerImpl.NAME
// endregion
}
Loading