diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt index 1b6c7a9d1e..980ff0d3e4 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt @@ -237,6 +237,9 @@ open class GestureHandler { return localPointerId } + val hasTrackedPointers: Boolean + get() = trackedPointersIDsCount > 0 + fun startTrackingPointer(pointerId: Int) { if (isTrackingPointer(pointerId)) { return @@ -801,10 +804,6 @@ open class GestureHandler { protected open fun onCancel() {} protected open fun onFail() {} - fun recordHandlerIfNotPresent() { - hostDetectorView?.recordHandlerIfNotPresent(this) - } - private fun isButtonInConfig(clickedButton: Int): Boolean { if (mouseButton == 0) { return clickedButton == MotionEvent.BUTTON_PRIMARY diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt index 61dbfef0f6..30cce31994 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt @@ -146,11 +146,15 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : registry.getHandler(handlerTag)?.let { handler -> if (newState == GestureHandler.STATE_ACTIVE) { + // The first touch event reaches JS before the handler begins, so a handler + // that already tracks a pointer may still be UNDETERMINED here. + if (handler.hasTrackedPointers && handler.state == GestureHandler.STATE_UNDETERMINED) { + handler.begin() + } + if (handler.state != GestureHandler.STATE_BEGAN) { - // We don't allow activation of gestures which haven't received any touches return } - handler.recordHandlerIfNotPresent() } when (newState) {