diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt index b5f9c580ed..f93e0aa91f 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt @@ -14,7 +14,7 @@ class FlingGestureHandler : GestureHandler() { private val maxDurationMs = DEFAULT_MAX_DURATION_MS private val minVelocity = DEFAULT_MIN_VELOCITY - private var handler: Handler? = null + private val handler = Handler(Looper.getMainLooper()) private var maxNumberOfPointersSimultaneously = 0 private val failDelayed = Runnable { fail() } private var velocityTracker: VelocityTracker? = null @@ -29,12 +29,8 @@ class FlingGestureHandler : GestureHandler() { velocityTracker = VelocityTracker.obtain() begin() maxNumberOfPointersSimultaneously = 1 - if (handler == null) { - handler = Handler(Looper.getMainLooper()) // lazy delegate? - } else { - handler!!.removeCallbacksAndMessages(null) - } - handler!!.postDelayed(failDelayed, maxDurationMs) + handler.removeCallbacksAndMessages(null) + handler.postDelayed(failDelayed, maxDurationMs) } private fun tryEndFling(event: MotionEvent): Boolean { @@ -69,7 +65,7 @@ class FlingGestureHandler : GestureHandler() { isAligned && isFast ) { - handler!!.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) activate() true } else { @@ -109,13 +105,13 @@ class FlingGestureHandler : GestureHandler() { } override fun onCancel() { - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) } override fun onReset() { velocityTracker?.recycle() velocityTracker = null - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) } private fun addVelocityMovement(tracker: VelocityTracker?, event: MotionEvent) { diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt index 43db8eff05..a7d211af7a 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt @@ -12,7 +12,7 @@ import com.swmansion.gesturehandler.react.events.eventbuilders.HoverGestureHandl class HoverGestureHandler : GestureHandler() { override val isContinuous = true - private var handler: Handler? = null + private val handler = Handler(Looper.getMainLooper()) private var finishRunnable = Runnable { finish() } var stylusData: StylusData = StylusData() private set @@ -85,8 +85,7 @@ class HoverGestureHandler : GestureHandler() { override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) { if (event.action == MotionEvent.ACTION_DOWN) { - handler?.removeCallbacksAndMessages(null) - handler = null + handler.removeCallbacksAndMessages(null) } else if (event.action == MotionEvent.ACTION_UP) { if (!isWithinBounds) { finish() @@ -97,11 +96,9 @@ class HoverGestureHandler : GestureHandler() { override fun onHandleHover(event: MotionEvent, sourceEvent: MotionEvent) { when { event.action == MotionEvent.ACTION_HOVER_EXIT -> { - if (handler == null) { - handler = Handler(Looper.getMainLooper()) - } - - handler!!.postDelayed(finishRunnable, 4) + // Touching down synthesizes HOVER_EXIT right before ACTION_DOWN, so finish + // with a slight delay - the DOWN cancels it and hover survives the press. + handler.postDelayed(finishRunnable, 4) } !isWithinBounds -> { diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt index 96d49c1a00..cc53c76d1c 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt @@ -20,7 +20,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler() { private var startY = 0f private var startTime: Long = 0 private var previousTime: Long = 0 - private var handler: Handler? = null + private val handler = Handler(Looper.getMainLooper()) private var currentPointers = 0 init { @@ -112,9 +112,9 @@ class LongPressGestureHandler(context: Context) : GestureHandler() { sourceEvent.actionMasked == MotionEvent.ACTION_BUTTON_PRESS ) ) { - handler = Handler(Looper.getMainLooper()) + handler.removeCallbacksAndMessages(null) if (minDurationMs > 0) { - handler!!.postDelayed({ activate() }, minDurationMs) + handler.postDelayed({ activate() }, minDurationMs) } else if (minDurationMs == 0L) { activate() } @@ -124,10 +124,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler() { ) { currentPointers-- - handler?.let { - it.removeCallbacksAndMessages(null) - handler = null - } + handler.removeCallbacksAndMessages(null) if (state == STATE_ACTIVE) { end() @@ -164,10 +161,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler() { } override fun onStateChange(newState: Int, previousState: Int) { - handler?.let { - it.removeCallbacksAndMessages(null) - handler = null - } + handler.removeCallbacksAndMessages(null) } override fun dispatchStateChange(newState: Int, prevState: Int) { diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt index 77aaabb05c..cbab701f0e 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt @@ -60,7 +60,7 @@ class PanGestureHandler(context: Context?) : GestureHandler() { private var averageTouches = false private var activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS private val activateDelayed = Runnable { activate() } - private var handler: Handler? = null + private val handler = Handler(Looper.getMainLooper()) var stylusData: StylusData = StylusData() private set @@ -140,7 +140,7 @@ class PanGestureHandler(context: Context?) : GestureHandler() { val dy = lastY - startY + offsetY if (activateAfterLongPress > 0 && dx * dx + dy * dy > defaultMinDist * defaultMinDist) { - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) return true } if (failOffsetXStart != MAX_VALUE_IGNORE && dx < failOffsetXStart) { @@ -200,10 +200,7 @@ class PanGestureHandler(context: Context?) : GestureHandler() { begin() if (activateAfterLongPress > 0) { - if (handler == null) { - handler = Handler(Looper.getMainLooper()) - } - handler!!.postDelayed(activateDelayed, activateAfterLongPress) + handler.postDelayed(activateDelayed, activateAfterLongPress) } } else if (velocityTracker != null) { addVelocityMovement(velocityTracker, sourceEvent) @@ -252,11 +249,11 @@ class PanGestureHandler(context: Context?) : GestureHandler() { } override fun onCancel() { - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) } override fun onReset() { - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) velocityTracker?.let { it.recycle() velocityTracker = null diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt index 7a74a08048..9b94767577 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt @@ -26,7 +26,7 @@ class TapGestureHandler : GestureHandler() { private var offsetY = 0f private var lastX = 0f private var lastY = 0f - private var handler: Handler? = null + private val handler = Handler(Looper.getMainLooper()) private var tapsSoFar = 0 private val failDelayed = Runnable { fail() } @@ -47,24 +47,16 @@ class TapGestureHandler : GestureHandler() { } private fun startTap() { - if (handler == null) { - handler = Handler(Looper.getMainLooper()) // TODO: lazy init (handle else branch correctly) - } else { - handler!!.removeCallbacksAndMessages(null) - } - handler!!.postDelayed(failDelayed, maxDurationMs) + handler.removeCallbacksAndMessages(null) + handler.postDelayed(failDelayed, maxDurationMs) } private fun endTap() { - if (handler == null) { - handler = Handler(Looper.getMainLooper()) - } else { - handler!!.removeCallbacksAndMessages(null) - } + handler.removeCallbacksAndMessages(null) if (++tapsSoFar == numberOfTaps && currentMaxNumberOfPointers >= minNumberOfPointers) { activate() } else { - handler!!.postDelayed(failDelayed, maxDelayMs) + handler.postDelayed(failDelayed, maxDelayMs) } } @@ -139,13 +131,13 @@ class TapGestureHandler : GestureHandler() { } override fun onCancel() { - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) } override fun onReset() { tapsSoFar = 0 currentMaxNumberOfPointers = 0 - handler?.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) } class Factory : GestureHandler.Factory() {