From 52a01c4a944b1b9eb7dcba654d7c642c200c996c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 22 Sep 2026 09:11:06 +0200 Subject: [PATCH 1/3] Android manualActivation --- .../com/swmansion/gesturehandler/core/GestureHandler.kt | 3 +++ .../gesturehandler/react/RNGestureHandlerModule.kt | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) 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..57e75d6f5b 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 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..d52247eec7 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,10 +146,12 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : registry.getHandler(handlerTag)?.let { handler -> if (newState == GestureHandler.STATE_ACTIVE) { - if (handler.state != GestureHandler.STATE_BEGAN) { - // We don't allow activation of gestures which haven't received any touches + if (!handler.hasTrackedPointers || + (handler.state != GestureHandler.STATE_UNDETERMINED && handler.state != GestureHandler.STATE_BEGAN) + ) { return } + handler.begin() handler.recordHandlerIfNotPresent() } From dfda93b62ee0b4c21985ad7413f1495e5e16a5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 22 Sep 2026 15:09:50 +0200 Subject: [PATCH 2/3] Don't check pointers on begin --- .../gesturehandler/react/RNGestureHandlerModule.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 d52247eec7..e55466a6f6 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,12 +146,15 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : registry.getHandler(handlerTag)?.let { handler -> if (newState == GestureHandler.STATE_ACTIVE) { - if (!handler.hasTrackedPointers || - (handler.state != GestureHandler.STATE_UNDETERMINED && handler.state != GestureHandler.STATE_BEGAN) - ) { + // 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) { return } - handler.begin() handler.recordHandlerIfNotPresent() } From 380166ca3a1efc88fcf3fac5c2fdf612b1744598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Wed, 23 Sep 2026 09:56:20 +0200 Subject: [PATCH 3/3] Remove recordHandlerIfNotPresent --- .../java/com/swmansion/gesturehandler/core/GestureHandler.kt | 4 ---- .../swmansion/gesturehandler/react/RNGestureHandlerModule.kt | 1 - 2 files changed, 5 deletions(-) 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 57e75d6f5b..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 @@ -804,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 e55466a6f6..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 @@ -155,7 +155,6 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : if (handler.state != GestureHandler.STATE_BEGAN) { return } - handler.recordHandlerIfNotPresent() } when (newState) {