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 819498986c..b9e4b2c6e2 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 @@ -20,6 +20,7 @@ import com.swmansion.gesturehandler.BuildConfig import com.swmansion.gesturehandler.RNSVGHitTester import com.swmansion.gesturehandler.react.RNGestureHandlerTouchEvent import com.swmansion.gesturehandler.react.eventbuilders.GestureHandlerEventDataBuilder +import com.swmansion.gesturehandler.react.isHoverAction import java.lang.IllegalStateException import java.util.* @@ -385,10 +386,7 @@ open class GestureHandler { setPointerType(sourceEvent) } - if (sourceEvent.action == MotionEvent.ACTION_HOVER_ENTER || - sourceEvent.action == MotionEvent.ACTION_HOVER_MOVE || - sourceEvent.action == MotionEvent.ACTION_HOVER_EXIT - ) { + if (sourceEvent.isHoverAction()) { onHandleHover(adaptedTransformedEvent, adaptedSourceEvent) } else { onHandle(adaptedTransformedEvent, adaptedSourceEvent) diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt index f8105a9c52..ced298e523 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt @@ -9,6 +9,7 @@ import android.widget.EditText import com.facebook.react.uimanager.RootView import com.swmansion.gesturehandler.react.RNGestureHandlerRootHelper import com.swmansion.gesturehandler.react.RNGestureHandlerRootView +import com.swmansion.gesturehandler.react.isHoverAction import java.util.* class GestureHandlerOrchestrator( @@ -517,18 +518,12 @@ class GestureHandlerOrchestrator( // There's only one exception - RootViewGestureHandler. TalkBack uses hover events, // so we need to pass them into RootViewGestureHandler, otherwise press and hold // gesture stops working correctly (see https://github.com/software-mansion/react-native-gesture-handler/issues/3407) - private fun shouldHandlerSkipHoverEvents(handler: GestureHandler, action: Int): Boolean { + private fun shouldHandlerSkipHoverEvents(handler: GestureHandler, event: MotionEvent): Boolean { val shouldSkipHoverEvents = handler !is HoverGestureHandler && handler !is RNGestureHandlerRootHelper.RootViewGestureHandler - return shouldSkipHoverEvents && - action in - listOf( - MotionEvent.ACTION_HOVER_EXIT, - MotionEvent.ACTION_HOVER_ENTER, - MotionEvent.ACTION_HOVER_MOVE, - ) + return shouldSkipHoverEvents && event.isHoverAction() } private fun recordViewHandlersForPointer( @@ -546,7 +541,7 @@ class GestureHandlerOrchestrator( continue } - if (shouldHandlerSkipHoverEvents(handler, event.action)) { + if (shouldHandlerSkipHoverEvents(handler, event)) { continue } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt index add5705a34..51180b29de 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt @@ -1,6 +1,7 @@ package com.swmansion.gesturehandler.react import android.content.Context +import android.view.MotionEvent import android.view.accessibility.AccessibilityManager import com.facebook.react.bridge.ReactContext import com.facebook.react.modules.core.DeviceEventManagerModule @@ -14,3 +15,7 @@ val ReactContext.UIManager: UIManagerModule fun Context.isScreenReaderOn() = (getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager).isTouchExplorationEnabled + +fun MotionEvent.isHoverAction(): Boolean = action == MotionEvent.ACTION_HOVER_MOVE || + action == MotionEvent.ACTION_HOVER_ENTER || + action == MotionEvent.ACTION_HOVER_EXIT diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt index ec1fb32227..2801b8a0f5 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt @@ -41,7 +41,7 @@ class RNGestureHandlerRootView(context: Context?) : ReactViewGroup(context) { } override fun dispatchGenericMotionEvent(ev: MotionEvent) = - if (rootViewEnabled && rootHelper!!.dispatchTouchEvent(ev)) { + if (rootViewEnabled && ev.isHoverAction() && rootHelper!!.dispatchTouchEvent(ev)) { true } else { super.dispatchGenericMotionEvent(ev)