Skip to content

Commit d8ff02f

Browse files
committed
pass onJSResponderCancelListener to the orchestrator, move shouldIntercept to onCancell
1 parent eea0192 commit d8ff02f

3 files changed

Lines changed: 27 additions & 15 deletions

File tree

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class GestureHandlerOrchestrator(
1919
private val handlerRegistry: GestureHandlerRegistry,
2020
private val viewConfigHelper: ViewConfigurationHelper,
2121
private val rootView: ViewGroup,
22+
private val onJSResponderCancelListener: OnJSResponderCancelListener? = null,
2223
) {
2324
/**
2425
* Minimum alpha (value from 0 to 1) that should be set to a view so that it can be treated as a
@@ -42,9 +43,6 @@ class GestureHandlerOrchestrator(
4243
private var finishedHandlersCleanupScheduled = false
4344
private var activationIndex = 0
4445

45-
var onCancelJSResponderRequested: ((GestureHandler) -> Unit)? = null
46-
var onCancelJSResponderReleased: ((GestureHandler) -> Unit)? = null
47-
4846
/**
4947
* Should be called from the view wrapper
5048
*/
@@ -150,7 +148,7 @@ class GestureHandlerOrchestrator(
150148
if (isFinished(newState) && handler.isActive && handler.cancelsJSResponder) {
151149
// Check if there are any other active handlers that still request the JS responder to be cancelled.
152150
if (gestureHandlers.none { it !== handler && it.isActive && it.cancelsJSResponder }) {
153-
onCancelJSResponderReleased?.invoke(handler)
151+
onJSResponderCancelListener?.onCancelJSResponderReleased(handler)
154152
}
155153
}
156154

@@ -253,7 +251,7 @@ class GestureHandlerOrchestrator(
253251
}
254252

255253
if (handler.cancelsJSResponder) {
256-
onCancelJSResponderRequested?.invoke(handler)
254+
onJSResponderCancelListener?.onCancelJSResponderRequested(handler)
257255
}
258256

259257
handler.dispatchStateChange(GestureHandler.STATE_ACTIVE, GestureHandler.STATE_BEGAN)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.swmansion.gesturehandler.core
2+
3+
interface OnJSResponderCancelListener {
4+
fun onCancelJSResponderRequested(handler: GestureHandler)
5+
fun onCancelJSResponderReleased(handler: GestureHandler)
6+
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.facebook.react.uimanager.RootView
1313
import com.facebook.react.uimanager.ThemedReactContext
1414
import com.swmansion.gesturehandler.core.GestureHandler
1515
import com.swmansion.gesturehandler.core.GestureHandlerOrchestrator
16+
import com.swmansion.gesturehandler.core.OnJSResponderCancelListener
1617

1718
class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView: ViewGroup, private val moduleId: Int) {
1819
private val orchestrator: GestureHandlerOrchestrator?
@@ -34,26 +35,29 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
3435
ReactConstants.TAG,
3536
"[GESTURE HANDLER] Initialize gesture handler for root view $rootView",
3637
)
37-
orchestrator = GestureHandlerOrchestrator(
38-
wrappedView,
39-
registry,
40-
RNViewConfigurationHelper(),
41-
rootView,
42-
).apply {
43-
minimumAlphaForTraversal = MIN_ALPHA_FOR_TOUCH
44-
onCancelJSResponderRequested = { _ ->
45-
shouldIntercept = true
38+
val onJSResponderCancelListener = object : OnJSResponderCancelListener {
39+
override fun onCancelJSResponderRequested(handler: GestureHandler) {
4640
val time = SystemClock.uptimeMillis()
4741
val event = MotionEvent.obtain(time, time, MotionEvent.ACTION_CANCEL, 0f, 0f, 0)
4842
if (rootView is RootView) {
4943
rootView.onChildStartedNativeGesture(rootView, event)
5044
}
5145
event.recycle()
5246
}
53-
onCancelJSResponderReleased = { _ ->
47+
48+
override fun onCancelJSResponderReleased(handler: GestureHandler) {
5449
shouldIntercept = false
5550
}
5651
}
52+
orchestrator = GestureHandlerOrchestrator(
53+
wrappedView,
54+
registry,
55+
RNViewConfigurationHelper(),
56+
rootView,
57+
onJSResponderCancelListener,
58+
).apply {
59+
minimumAlphaForTraversal = MIN_ALPHA_FOR_TOUCH
60+
}
5761
jsGestureHandler = RootViewGestureHandler(handlerTag = -wrappedViewTag)
5862
registry.registerHandler(jsGestureHandler)
5963
registry.attachHandlerToView(jsGestureHandler.tag, wrappedViewTag, GestureHandler.ACTION_TYPE_JS_FUNCTION_OLD_API)
@@ -104,6 +108,10 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
104108
override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) = handleEvent(event)
105109

106110
override fun onHandleHover(event: MotionEvent, sourceEvent: MotionEvent) = handleEvent(event)
111+
112+
override fun onCancel() {
113+
shouldIntercept = true
114+
}
107115
}
108116

109117
fun requestDisallowInterceptTouchEvent() {

0 commit comments

Comments
 (0)