react-native-gesture-handler 1.10.3 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/android/build.gradle +49 -1
- package/android/common/src/main/java/com/swmansion/common/GestureHandlerStateManager.kt +5 -0
- package/android/gradle.properties +19 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +18 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/Extensions.kt +11 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +96 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +713 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.kt +8 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +562 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.kt +8 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +21 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +49 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +97 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +11 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +129 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.kt +9 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +289 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +88 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/{PointerEventsConfig.java → PointerEventsConfig.kt} +3 -5
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.kt +125 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +79 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +167 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.kt +10 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +348 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +57 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +59 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +61 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +686 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +17 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +95 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +132 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.kt +5 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +68 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +34 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +66 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +69 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +51 -0
- package/ios/Handlers/RNFlingHandler.m +78 -5
- package/ios/Handlers/RNForceTouchHandler.m +29 -4
- package/ios/Handlers/RNLongPressHandler.m +105 -3
- package/ios/Handlers/RNManualHandler.h +4 -0
- package/ios/Handlers/RNManualHandler.m +73 -0
- package/ios/Handlers/RNNativeViewHandler.m +30 -2
- package/ios/Handlers/RNPanHandler.m +64 -4
- package/ios/Handlers/RNPinchHandler.m +61 -2
- package/ios/Handlers/RNRotationHandler.m +60 -1
- package/ios/Handlers/RNTapHandler.m +55 -8
- package/ios/RNGestureHandler.h +18 -4
- package/ios/RNGestureHandler.m +123 -13
- package/ios/RNGestureHandlerEvents.h +9 -0
- package/ios/RNGestureHandlerEvents.m +34 -0
- package/ios/RNGestureHandlerManager.h +7 -0
- package/ios/RNGestureHandlerManager.m +62 -34
- package/ios/RNGestureHandlerModule.m +39 -3
- package/ios/RNGestureHandlerPointerTracker.h +25 -0
- package/ios/RNGestureHandlerPointerTracker.m +237 -0
- package/ios/RNGestureHandlerRegistry.h +1 -0
- package/ios/RNGestureHandlerRegistry.m +10 -0
- package/ios/RNGestureHandlerStateManager.h +5 -0
- package/ios/RNManualActivationRecognizer.h +10 -0
- package/ios/RNManualActivationRecognizer.m +80 -0
- package/ios/RNRootViewGestureRecognizer.m +1 -1
- package/ios/RNTouchEventType.h +9 -0
- package/lib/commonjs/EventType.js +16 -0
- package/lib/commonjs/EventType.js.map +1 -0
- package/lib/commonjs/GestureHandlerRootView.android.js +1 -13
- package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
- package/lib/commonjs/GestureHandlerRootView.js +11 -3
- package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js +3 -1
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +2 -2
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/DrawerLayout.js +41 -37
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js +31 -12
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +10 -6
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +2 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/commonjs/gestureHandlerRootHOC.js +1 -1
- package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
- package/lib/commonjs/handlers/FlingGestureHandler.js +23 -0
- package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js +44 -0
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js +23 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/NativeViewGestureHandler.js +6 -4
- package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js +121 -0
- package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/PinchGestureHandler.js +21 -0
- package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/RotationGestureHandler.js +21 -0
- package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/TapGestureHandler.js +23 -0
- package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -0
- package/lib/commonjs/handlers/createHandler.js +52 -83
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js +80 -0
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js +440 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -0
- package/lib/commonjs/handlers/gestures/eventReceiver.js +135 -0
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -0
- package/lib/commonjs/handlers/gestures/flingGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js +65 -0
- package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gesture.js +193 -0
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureComposition.js +94 -0
- package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureObjects.js +85 -0
- package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.js +58 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/manualGesture.js +31 -0
- package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/nativeGesture.js +34 -0
- package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/panGesture.js +144 -0
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/pinchGesture.js +45 -0
- package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +24 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -0
- package/lib/commonjs/handlers/gestures/rotationGesture.js +45 -0
- package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -0
- package/lib/commonjs/handlers/gestures/tapGesture.js +59 -0
- package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -0
- package/lib/commonjs/handlers/handlersRegistry.js +31 -0
- package/lib/commonjs/handlers/handlersRegistry.js.map +1 -0
- package/lib/commonjs/index.js +146 -8
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/init.js +13 -0
- package/lib/commonjs/init.js.map +1 -0
- package/lib/commonjs/mocks.js +31 -2
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/utils.js +15 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/commonjs/web/Errors.js +1 -1
- package/lib/commonjs/web/Errors.js.map +1 -1
- package/lib/commonjs/web/GestureHandler.js +4 -6
- package/lib/commonjs/web/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/NodeManager.js +8 -2
- package/lib/commonjs/web/NodeManager.js.map +1 -1
- package/lib/module/EventType.js +8 -0
- package/lib/module/EventType.js.map +1 -0
- package/lib/module/GestureHandlerRootView.android.js +2 -14
- package/lib/module/GestureHandlerRootView.android.js.map +1 -1
- package/lib/module/GestureHandlerRootView.js +5 -1
- package/lib/module/GestureHandlerRootView.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js +3 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +2 -2
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/DrawerLayout.js +43 -40
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js +29 -11
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/Swipeable.js +9 -6
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +2 -1
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/module/gestureHandlerRootHOC.js +1 -1
- package/lib/module/gestureHandlerRootHOC.js.map +1 -1
- package/lib/module/handlers/FlingGestureHandler.js +10 -0
- package/lib/module/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/module/handlers/ForceTouchGestureHandler.js +29 -0
- package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -0
- package/lib/module/handlers/LongPressGestureHandler.js +10 -0
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/module/handlers/NativeViewGestureHandler.js +4 -3
- package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/handlers/PanGestureHandler.js +106 -0
- package/lib/module/handlers/PanGestureHandler.js.map +1 -0
- package/lib/module/handlers/PinchGestureHandler.js +9 -0
- package/lib/module/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/module/handlers/RotationGestureHandler.js +9 -0
- package/lib/module/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/module/handlers/TapGestureHandler.js +10 -0
- package/lib/module/handlers/TapGestureHandler.js.map +1 -0
- package/lib/module/handlers/createHandler.js +41 -76
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js +66 -0
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -0
- package/lib/module/handlers/gestures/GestureDetector.js +402 -0
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -0
- package/lib/module/handlers/gestures/eventReceiver.js +120 -0
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -0
- package/lib/module/handlers/gestures/flingGesture.js +24 -0
- package/lib/module/handlers/gestures/flingGesture.js.map +1 -0
- package/lib/module/handlers/gestures/forceTouchGesture.js +56 -0
- package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -0
- package/lib/module/handlers/gestures/gesture.js +175 -0
- package/lib/module/handlers/gestures/gesture.js.map +1 -0
- package/lib/module/handlers/gestures/gestureComposition.js +79 -0
- package/lib/module/handlers/gestures/gestureComposition.js.map +1 -0
- package/lib/module/handlers/gestures/gestureObjects.js +67 -0
- package/lib/module/handlers/gestures/gestureObjects.js.map +1 -0
- package/lib/module/handlers/gestures/gestureStateManager.js +48 -0
- package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -0
- package/lib/module/handlers/gestures/longPressGesture.js +24 -0
- package/lib/module/handlers/gestures/longPressGesture.js.map +1 -0
- package/lib/module/handlers/gestures/manualGesture.js +22 -0
- package/lib/module/handlers/gestures/manualGesture.js.map +1 -0
- package/lib/module/handlers/gestures/nativeGesture.js +24 -0
- package/lib/module/handlers/gestures/nativeGesture.js.map +1 -0
- package/lib/module/handlers/gestures/panGesture.js +135 -0
- package/lib/module/handlers/gestures/panGesture.js.map +1 -0
- package/lib/module/handlers/gestures/pinchGesture.js +36 -0
- package/lib/module/handlers/gestures/pinchGesture.js.map +1 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -0
- package/lib/module/handlers/gestures/rotationGesture.js +36 -0
- package/lib/module/handlers/gestures/rotationGesture.js.map +1 -0
- package/lib/module/handlers/gestures/tapGesture.js +49 -0
- package/lib/module/handlers/gestures/tapGesture.js.map +1 -0
- package/lib/module/handlers/handlersRegistry.js +16 -0
- package/lib/module/handlers/handlersRegistry.js.map +1 -0
- package/lib/module/index.js +22 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/init.js +5 -0
- package/lib/module/init.js.map +1 -0
- package/lib/module/mocks.js +31 -2
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/utils.js +8 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/module/web/Errors.js +1 -1
- package/lib/module/web/Errors.js.map +1 -1
- package/lib/module/web/GestureHandler.js +4 -6
- package/lib/module/web/GestureHandler.js.map +1 -1
- package/lib/module/web/NodeManager.js +8 -2
- package/lib/module/web/NodeManager.js.map +1 -1
- package/lib/typescript/EventType.d.ts +8 -0
- package/lib/typescript/GestureHandlerRootView.android.d.ts +2 -4
- package/lib/typescript/GestureHandlerRootView.d.ts +5 -2
- package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
- package/lib/typescript/components/DrawerLayout.d.ts +50 -1
- package/lib/typescript/components/GestureButtons.d.ts +36 -0
- package/lib/typescript/components/GestureComponents.d.ts +8 -35
- package/lib/typescript/components/Swipeable.d.ts +73 -6
- package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -2
- package/lib/typescript/components/touchables/TouchableHighlight.d.ts +1 -0
- package/lib/typescript/components/touchables/TouchableOpacity.d.ts +1 -0
- package/lib/typescript/handlers/FlingGestureHandler.d.ts +33 -0
- package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +43 -0
- package/lib/typescript/handlers/LongPressGestureHandler.d.ts +55 -0
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +19 -4
- package/lib/typescript/handlers/PanGestureHandler.d.ts +137 -0
- package/lib/typescript/handlers/PinchGestureHandler.d.ts +28 -0
- package/lib/typescript/handlers/RotationGestureHandler.d.ts +28 -0
- package/lib/typescript/handlers/TapGestureHandler.d.ts +56 -0
- package/lib/typescript/handlers/createHandler.d.ts +1 -1
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +62 -0
- package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +8 -1
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +16 -0
- package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
- package/lib/typescript/handlers/gestures/flingGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +16 -0
- package/lib/typescript/handlers/gestures/gesture.d.ts +97 -0
- package/lib/typescript/handlers/gestures/gestureComposition.d.ts +21 -0
- package/lib/typescript/handlers/gestures/gestureObjects.d.ts +39 -0
- package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +9 -0
- package/lib/typescript/handlers/gestures/longPressGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/manualGesture.d.ts +7 -0
- package/lib/typescript/handlers/gestures/nativeGesture.d.ts +9 -0
- package/lib/typescript/handlers/gestures/panGesture.d.ts +26 -0
- package/lib/typescript/handlers/gestures/pinchGesture.d.ts +12 -0
- package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +14 -0
- package/lib/typescript/handlers/gestures/rotationGesture.d.ts +12 -0
- package/lib/typescript/handlers/gestures/tapGesture.d.ts +14 -0
- package/lib/typescript/handlers/handlersRegistry.d.ts +6 -0
- package/lib/typescript/index.d.ts +29 -2
- package/lib/typescript/init.d.ts +1 -0
- package/lib/typescript/mocks.d.ts +21 -2
- package/lib/typescript/utils.d.ts +1 -0
- package/lib/typescript/web/FlingGestureHandler.d.ts +0 -1
- package/lib/typescript/web/GestureHandler.d.ts +0 -1
- package/lib/typescript/web/PanGestureHandler.d.ts +0 -1
- package/lib/typescript/web/PinchGestureHandler.d.ts +0 -1
- package/lib/typescript/web/PressGestureHandler.d.ts +0 -1
- package/lib/typescript/web/RotationGestureHandler.d.ts +0 -1
- package/lib/typescript/web/TapGestureHandler.d.ts +0 -1
- package/package.json +8 -5
- package/src/EventType.ts +10 -0
- package/src/GestureHandlerRootView.android.tsx +9 -25
- package/src/GestureHandlerRootView.tsx +11 -2
- package/src/RNGestureHandlerModule.ts +5 -1
- package/src/RNGestureHandlerModule.web.ts +1 -0
- package/src/components/DrawerLayout.tsx +114 -41
- package/src/components/GestureButtons.tsx +45 -5
- package/src/components/GestureComponents.tsx +47 -41
- package/src/components/Swipeable.tsx +108 -21
- package/src/components/touchables/GenericTouchable.tsx +2 -1
- package/src/components/touchables/TouchableOpacity.tsx +1 -1
- package/src/handlers/FlingGestureHandler.ts +57 -0
- package/src/handlers/ForceTouchGestureHandler.ts +83 -0
- package/src/handlers/LongPressGestureHandler.ts +84 -0
- package/src/handlers/NativeViewGestureHandler.ts +31 -7
- package/src/handlers/PanGestureHandler.ts +321 -0
- package/src/handlers/PinchGestureHandler.ts +46 -0
- package/src/handlers/RotationGestureHandler.ts +46 -0
- package/src/handlers/TapGestureHandler.ts +90 -0
- package/src/handlers/createHandler.ts +54 -79
- package/src/handlers/gestureHandlerCommon.ts +185 -0
- package/src/handlers/gestureHandlerTypesCompat.ts +19 -5
- package/src/handlers/gestures/GestureDetector.tsx +519 -0
- package/src/handlers/gestures/eventReceiver.ts +151 -0
- package/src/handlers/gestures/flingGesture.ts +27 -0
- package/src/handlers/gestures/forceTouchGesture.ts +74 -0
- package/src/handlers/gestures/gesture.ts +292 -0
- package/src/handlers/gestures/gestureComposition.ts +109 -0
- package/src/handlers/gestures/gestureObjects.ts +79 -0
- package/src/handlers/gestures/gestureStateManager.ts +60 -0
- package/src/handlers/gestures/longPressGesture.ts +27 -0
- package/src/handlers/gestures/manualGesture.ts +31 -0
- package/src/handlers/gestures/nativeGesture.ts +27 -0
- package/src/handlers/gestures/panGesture.ts +147 -0
- package/src/handlers/gestures/pinchGesture.ts +51 -0
- package/src/handlers/gestures/reanimatedWrapper.ts +45 -0
- package/src/handlers/gestures/rotationGesture.ts +51 -0
- package/src/handlers/gestures/tapGesture.ts +52 -0
- package/src/handlers/handlersRegistry.ts +22 -0
- package/src/index.ts +57 -17
- package/src/init.ts +5 -0
- package/src/mocks.ts +42 -2
- package/src/utils.ts +7 -0
- package/src/web/GestureHandler.ts +1 -2
- package/src/web/NodeManager.ts +5 -0
- package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.java +0 -23
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.java +0 -110
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.java +0 -531
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.java +0 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +0 -543
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.java +0 -10
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.java +0 -29
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.java +0 -53
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.java +0 -81
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.java +0 -110
- package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.java +0 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +0 -312
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.java +0 -109
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.java +0 -169
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.java +0 -96
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.java +0 -172
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.java +0 -10
- package/android/src/main/java/com/facebook/react/views/modal/RNGHModalUtils.java +0 -21
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.java +0 -296
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +0 -72
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +0 -77
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.java +0 -8
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.java +0 -86
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +0 -731
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +0 -31
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +0 -101
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.java +0 -151
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +0 -7
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +0 -76
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +0 -49
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +0 -82
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.java +0 -61
- package/lib/commonjs/handlers/gestureHandlers.js +0 -236
- package/lib/commonjs/handlers/gestureHandlers.js.map +0 -1
- package/lib/module/handlers/gestureHandlers.js +0 -216
- package/lib/module/handlers/gestureHandlers.js.map +0 -1
- package/lib/typescript/handlers/gestureHandlers.d.ts +0 -158
- package/src/handlers/gestureHandlers.ts +0 -511
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler
|
|
2
|
+
|
|
3
|
+
import android.view.MotionEvent
|
|
4
|
+
import android.view.MotionEvent.PointerCoords
|
|
5
|
+
import android.view.MotionEvent.PointerProperties
|
|
6
|
+
import android.view.View
|
|
7
|
+
import com.facebook.react.bridge.Arguments
|
|
8
|
+
import com.facebook.react.bridge.UiThreadUtil
|
|
9
|
+
import com.facebook.react.bridge.WritableArray
|
|
10
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
11
|
+
import com.swmansion.gesturehandler.react.RNGestureHandlerTouchEvent
|
|
12
|
+
import java.lang.IllegalStateException
|
|
13
|
+
import java.util.*
|
|
14
|
+
|
|
15
|
+
open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestureHandlerT>> {
|
|
16
|
+
private val trackedPointerIDs = IntArray(MAX_POINTERS_COUNT)
|
|
17
|
+
private var trackedPointersIDsCount = 0
|
|
18
|
+
var tag = 0
|
|
19
|
+
var view: View? = null
|
|
20
|
+
private set
|
|
21
|
+
var state = STATE_UNDETERMINED
|
|
22
|
+
private set
|
|
23
|
+
var x = 0f
|
|
24
|
+
private set
|
|
25
|
+
var y = 0f
|
|
26
|
+
private set
|
|
27
|
+
var isWithinBounds = false
|
|
28
|
+
private set
|
|
29
|
+
var isEnabled = true
|
|
30
|
+
private set
|
|
31
|
+
var usesDeviceEvents = false
|
|
32
|
+
|
|
33
|
+
var changedTouchesPayload: WritableArray? = null
|
|
34
|
+
private set
|
|
35
|
+
var allTouchesPayload: WritableArray? = null
|
|
36
|
+
private set
|
|
37
|
+
var touchEventType = RNGestureHandlerTouchEvent.EVENT_UNDETERMINED
|
|
38
|
+
private set
|
|
39
|
+
var trackedPointersCount = 0
|
|
40
|
+
private set
|
|
41
|
+
private val trackedPointers: Array<PointerData?> = Array(MAX_POINTERS_COUNT) { null }
|
|
42
|
+
var needsPointerData = false
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
private var hitSlop: FloatArray? = null
|
|
46
|
+
var eventCoalescingKey: Short = 0
|
|
47
|
+
private set
|
|
48
|
+
var lastAbsolutePositionX = 0f
|
|
49
|
+
private set
|
|
50
|
+
var lastAbsolutePositionY = 0f
|
|
51
|
+
private set
|
|
52
|
+
|
|
53
|
+
private var manualActivation = false
|
|
54
|
+
|
|
55
|
+
private var lastEventOffsetX = 0f
|
|
56
|
+
private var lastEventOffsetY = 0f
|
|
57
|
+
private var shouldCancelWhenOutside = false
|
|
58
|
+
var numberOfPointers = 0
|
|
59
|
+
private set
|
|
60
|
+
private var orchestrator: GestureHandlerOrchestrator? = null
|
|
61
|
+
private var onTouchEventListener: OnTouchEventListener? = null
|
|
62
|
+
private var interactionController: GestureHandlerInteractionController? = null
|
|
63
|
+
|
|
64
|
+
@Suppress("UNCHECKED_CAST")
|
|
65
|
+
protected fun self(): ConcreteGestureHandlerT = this as ConcreteGestureHandlerT
|
|
66
|
+
|
|
67
|
+
protected inline fun applySelf(block: ConcreteGestureHandlerT.() -> Unit): ConcreteGestureHandlerT =
|
|
68
|
+
self().apply { block() }
|
|
69
|
+
|
|
70
|
+
// set and accessed only by the orchestrator
|
|
71
|
+
var activationIndex = 0
|
|
72
|
+
|
|
73
|
+
// set and accessed only by the orchestrator
|
|
74
|
+
var isActive = false
|
|
75
|
+
|
|
76
|
+
// set and accessed only by the orchestrator
|
|
77
|
+
var isAwaiting = false
|
|
78
|
+
|
|
79
|
+
open fun dispatchStateChange(newState: Int, prevState: Int) {
|
|
80
|
+
onTouchEventListener?.onStateChange(self(), newState, prevState)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
open fun dispatchHandlerUpdate(event: MotionEvent) {
|
|
84
|
+
onTouchEventListener?.onHandlerUpdate(self(), event)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
open fun dispatchTouchEvent() {
|
|
88
|
+
if (changedTouchesPayload != null) {
|
|
89
|
+
onTouchEventListener?.onTouchEvent(self())
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
open fun resetConfig() {
|
|
94
|
+
needsPointerData = false
|
|
95
|
+
manualActivation = false
|
|
96
|
+
shouldCancelWhenOutside = false
|
|
97
|
+
isEnabled = true
|
|
98
|
+
hitSlop = null
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
fun hasCommonPointers(other: GestureHandler<*>): Boolean {
|
|
102
|
+
for (i in trackedPointerIDs.indices) {
|
|
103
|
+
if (trackedPointerIDs[i] != -1 && other.trackedPointerIDs[i] != -1) {
|
|
104
|
+
return true
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fun setShouldCancelWhenOutside(shouldCancelWhenOutside: Boolean): ConcreteGestureHandlerT =
|
|
111
|
+
applySelf { this.shouldCancelWhenOutside = shouldCancelWhenOutside }
|
|
112
|
+
|
|
113
|
+
fun setEnabled(enabled: Boolean): ConcreteGestureHandlerT = applySelf {
|
|
114
|
+
// Don't cancel handler when not changing the value of the isEnabled, executing it always caused
|
|
115
|
+
// handlers to be cancelled on re-render because that's the moment when the config is updated.
|
|
116
|
+
// If the enabled prop "changed" from true to true the handler would get cancelled.
|
|
117
|
+
if (view != null && isEnabled != enabled) {
|
|
118
|
+
// If view is set then handler is in "active" state. In that case we want to "cancel" handler
|
|
119
|
+
// when it changes enabled state so that it gets cleared from the orchestrator
|
|
120
|
+
UiThreadUtil.runOnUiThread { cancel() }
|
|
121
|
+
}
|
|
122
|
+
isEnabled = enabled
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
fun setManualActivation(manualActivation: Boolean): ConcreteGestureHandlerT =
|
|
126
|
+
applySelf { this.manualActivation = manualActivation }
|
|
127
|
+
|
|
128
|
+
fun setHitSlop(
|
|
129
|
+
leftPad: Float, topPad: Float, rightPad: Float, bottomPad: Float,
|
|
130
|
+
width: Float, height: Float,
|
|
131
|
+
): ConcreteGestureHandlerT = applySelf {
|
|
132
|
+
if (hitSlop == null) {
|
|
133
|
+
hitSlop = FloatArray(6)
|
|
134
|
+
}
|
|
135
|
+
hitSlop!![HIT_SLOP_LEFT_IDX] = leftPad
|
|
136
|
+
hitSlop!![HIT_SLOP_TOP_IDX] = topPad
|
|
137
|
+
hitSlop!![HIT_SLOP_RIGHT_IDX] = rightPad
|
|
138
|
+
hitSlop!![HIT_SLOP_BOTTOM_IDX] = bottomPad
|
|
139
|
+
hitSlop!![HIT_SLOP_WIDTH_IDX] = width
|
|
140
|
+
hitSlop!![HIT_SLOP_HEIGHT_IDX] = height
|
|
141
|
+
require(!(hitSlopSet(width) && hitSlopSet(leftPad) && hitSlopSet(rightPad))) { "Cannot have all of left, right and width defined" }
|
|
142
|
+
require(!(hitSlopSet(width) && !hitSlopSet(leftPad) && !hitSlopSet(rightPad))) { "When width is set one of left or right pads need to be defined" }
|
|
143
|
+
require(!(hitSlopSet(height) && hitSlopSet(bottomPad) && hitSlopSet(topPad))) { "Cannot have all of top, bottom and height defined" }
|
|
144
|
+
require(!(hitSlopSet(height) && !hitSlopSet(bottomPad) && !hitSlopSet(topPad))) { "When height is set one of top or bottom pads need to be defined" }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
fun setHitSlop(padding: Float): ConcreteGestureHandlerT {
|
|
148
|
+
return setHitSlop(padding, padding, padding, padding, HIT_SLOP_NONE, HIT_SLOP_NONE)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
fun setInteractionController(controller: GestureHandlerInteractionController?): ConcreteGestureHandlerT =
|
|
152
|
+
applySelf { interactionController = controller }
|
|
153
|
+
|
|
154
|
+
fun prepare(view: View?, orchestrator: GestureHandlerOrchestrator?) {
|
|
155
|
+
check(!(this.view != null || this.orchestrator != null)) { "Already prepared or hasn't been reset" }
|
|
156
|
+
Arrays.fill(trackedPointerIDs, -1)
|
|
157
|
+
trackedPointersIDsCount = 0
|
|
158
|
+
state = STATE_UNDETERMINED
|
|
159
|
+
this.view = view
|
|
160
|
+
this.orchestrator = orchestrator
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private fun findNextLocalPointerId(): Int {
|
|
164
|
+
var localPointerId = 0
|
|
165
|
+
while (localPointerId < trackedPointersIDsCount) {
|
|
166
|
+
var i = 0
|
|
167
|
+
while (i < trackedPointerIDs.size) {
|
|
168
|
+
if (trackedPointerIDs[i] == localPointerId) {
|
|
169
|
+
break
|
|
170
|
+
}
|
|
171
|
+
i++
|
|
172
|
+
}
|
|
173
|
+
if (i == trackedPointerIDs.size) {
|
|
174
|
+
return localPointerId
|
|
175
|
+
}
|
|
176
|
+
localPointerId++
|
|
177
|
+
}
|
|
178
|
+
return localPointerId
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
fun startTrackingPointer(pointerId: Int) {
|
|
182
|
+
if (trackedPointerIDs[pointerId] == -1) {
|
|
183
|
+
trackedPointerIDs[pointerId] = findNextLocalPointerId()
|
|
184
|
+
trackedPointersIDsCount++
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
fun stopTrackingPointer(pointerId: Int) {
|
|
189
|
+
if (trackedPointerIDs[pointerId] != -1) {
|
|
190
|
+
trackedPointerIDs[pointerId] = -1
|
|
191
|
+
trackedPointersIDsCount--
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private fun needAdapt(event: MotionEvent): Boolean {
|
|
196
|
+
if (event.pointerCount != trackedPointersIDsCount) {
|
|
197
|
+
return true
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
for (i in trackedPointerIDs.indices) {
|
|
201
|
+
val trackedPointer = trackedPointerIDs[i]
|
|
202
|
+
if (trackedPointer != -1 && trackedPointer != i) {
|
|
203
|
+
return true
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return false
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private fun adaptEvent(event: MotionEvent): MotionEvent {
|
|
210
|
+
if (!needAdapt(event)) {
|
|
211
|
+
return event
|
|
212
|
+
}
|
|
213
|
+
var action = event.actionMasked
|
|
214
|
+
var actionIndex = -1
|
|
215
|
+
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN) {
|
|
216
|
+
actionIndex = event.actionIndex
|
|
217
|
+
val actionPointer = event.getPointerId(actionIndex)
|
|
218
|
+
action = if (trackedPointerIDs[actionPointer] != -1) {
|
|
219
|
+
if (trackedPointersIDsCount == 1) MotionEvent.ACTION_DOWN else MotionEvent.ACTION_POINTER_DOWN
|
|
220
|
+
} else {
|
|
221
|
+
MotionEvent.ACTION_MOVE
|
|
222
|
+
}
|
|
223
|
+
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) {
|
|
224
|
+
actionIndex = event.actionIndex
|
|
225
|
+
val actionPointer = event.getPointerId(actionIndex)
|
|
226
|
+
action = if (trackedPointerIDs[actionPointer] != -1) {
|
|
227
|
+
if (trackedPointersIDsCount == 1) MotionEvent.ACTION_UP else MotionEvent.ACTION_POINTER_UP
|
|
228
|
+
} else {
|
|
229
|
+
MotionEvent.ACTION_MOVE
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
initPointerProps(trackedPointersIDsCount)
|
|
233
|
+
var count = 0
|
|
234
|
+
val oldX = event.x
|
|
235
|
+
val oldY = event.y
|
|
236
|
+
event.setLocation(event.rawX, event.rawY)
|
|
237
|
+
var index = 0
|
|
238
|
+
val size = event.pointerCount
|
|
239
|
+
while (index < size) {
|
|
240
|
+
val origPointerId = event.getPointerId(index)
|
|
241
|
+
if (trackedPointerIDs[origPointerId] != -1) {
|
|
242
|
+
event.getPointerProperties(index, pointerProps[count])
|
|
243
|
+
pointerProps[count]!!.id = trackedPointerIDs[origPointerId]
|
|
244
|
+
event.getPointerCoords(index, pointerCoords[count])
|
|
245
|
+
if (index == actionIndex) {
|
|
246
|
+
action = action or (count shl MotionEvent.ACTION_POINTER_INDEX_SHIFT)
|
|
247
|
+
}
|
|
248
|
+
count++
|
|
249
|
+
}
|
|
250
|
+
index++
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// introduced in 1.11.0, remove if crashes are not reported
|
|
254
|
+
if(pointerProps.isEmpty()|| pointerCoords.isEmpty()){
|
|
255
|
+
throw IllegalStateException("pointerCoords.size=${pointerCoords.size}, pointerProps.size=${pointerProps.size}")
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
val result: MotionEvent
|
|
259
|
+
try {
|
|
260
|
+
result = MotionEvent.obtain(
|
|
261
|
+
event.downTime,
|
|
262
|
+
event.eventTime,
|
|
263
|
+
action,
|
|
264
|
+
count,
|
|
265
|
+
pointerProps, /* props are copied and hence it is safe to use static array here */
|
|
266
|
+
pointerCoords, /* same applies to coords */
|
|
267
|
+
event.metaState,
|
|
268
|
+
event.buttonState,
|
|
269
|
+
event.xPrecision,
|
|
270
|
+
event.yPrecision,
|
|
271
|
+
event.deviceId,
|
|
272
|
+
event.edgeFlags,
|
|
273
|
+
event.source,
|
|
274
|
+
event.flags
|
|
275
|
+
)
|
|
276
|
+
} catch (e: IllegalArgumentException) {
|
|
277
|
+
throw AdaptEventException(this, event, e)
|
|
278
|
+
}
|
|
279
|
+
event.setLocation(oldX, oldY)
|
|
280
|
+
result.setLocation(oldX, oldY)
|
|
281
|
+
return result
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// exception to help debug https://github.com/software-mansion/react-native-gesture-handler/issues/1188
|
|
285
|
+
class AdaptEventException(
|
|
286
|
+
handler: GestureHandler<*>,
|
|
287
|
+
event: MotionEvent,
|
|
288
|
+
e: IllegalArgumentException
|
|
289
|
+
) : Exception("""
|
|
290
|
+
handler: ${handler::class.simpleName}
|
|
291
|
+
state: ${handler.state}
|
|
292
|
+
view: ${handler.view}
|
|
293
|
+
orchestrator: ${handler.orchestrator}
|
|
294
|
+
isEnabled: ${handler.isEnabled}
|
|
295
|
+
isActive: ${handler.isActive}
|
|
296
|
+
isAwaiting: ${handler.isAwaiting}
|
|
297
|
+
trackedPointersCount: ${handler.trackedPointersCount}
|
|
298
|
+
trackedPointers: ${handler.trackedPointerIDs.joinToString(separator = ", ")}
|
|
299
|
+
while handling event: $event
|
|
300
|
+
""".trimIndent(), e) {}
|
|
301
|
+
|
|
302
|
+
fun handle(origEvent: MotionEvent) {
|
|
303
|
+
if (!isEnabled
|
|
304
|
+
|| state == STATE_CANCELLED
|
|
305
|
+
|| state == STATE_FAILED
|
|
306
|
+
|| state == STATE_END
|
|
307
|
+
|| trackedPointersIDsCount < 1) {
|
|
308
|
+
return
|
|
309
|
+
}
|
|
310
|
+
val event = adaptEvent(origEvent)
|
|
311
|
+
x = event.x
|
|
312
|
+
y = event.y
|
|
313
|
+
numberOfPointers = event.pointerCount
|
|
314
|
+
isWithinBounds = isWithinBounds(view, x, y)
|
|
315
|
+
if (shouldCancelWhenOutside && !isWithinBounds) {
|
|
316
|
+
if (state == STATE_ACTIVE) {
|
|
317
|
+
cancel()
|
|
318
|
+
} else if (state == STATE_BEGAN) {
|
|
319
|
+
fail()
|
|
320
|
+
}
|
|
321
|
+
return
|
|
322
|
+
}
|
|
323
|
+
lastAbsolutePositionX = GestureUtils.getLastPointerX(event, true)
|
|
324
|
+
lastAbsolutePositionY = GestureUtils.getLastPointerY(event, true)
|
|
325
|
+
lastEventOffsetX = event.rawX - event.x
|
|
326
|
+
lastEventOffsetY = event.rawY - event.y
|
|
327
|
+
onHandle(event)
|
|
328
|
+
if (event != origEvent) {
|
|
329
|
+
event.recycle()
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private fun dispatchTouchDownEvent(event: MotionEvent) {
|
|
334
|
+
changedTouchesPayload = null
|
|
335
|
+
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_DOWN
|
|
336
|
+
val pointerId = event.getPointerId(event.actionIndex)
|
|
337
|
+
val offsetX = event.rawX - event.x
|
|
338
|
+
val offsetY = event.rawY - event.y
|
|
339
|
+
|
|
340
|
+
trackedPointers[pointerId] = PointerData(
|
|
341
|
+
pointerId,
|
|
342
|
+
event.getX(event.actionIndex),
|
|
343
|
+
event.getY(event.actionIndex),
|
|
344
|
+
event.getX(event.actionIndex) + offsetX,
|
|
345
|
+
event.getY(event.actionIndex) + offsetY,
|
|
346
|
+
)
|
|
347
|
+
trackedPointersCount++
|
|
348
|
+
addChangedPointer(trackedPointers[pointerId]!!)
|
|
349
|
+
extractAllPointersData()
|
|
350
|
+
|
|
351
|
+
dispatchTouchEvent()
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
private fun dispatchTouchUpEvent(event: MotionEvent) {
|
|
355
|
+
extractAllPointersData()
|
|
356
|
+
changedTouchesPayload = null
|
|
357
|
+
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_UP
|
|
358
|
+
val pointerId = event.getPointerId(event.actionIndex)
|
|
359
|
+
val offsetX = event.rawX - event.x
|
|
360
|
+
val offsetY = event.rawY - event.y
|
|
361
|
+
|
|
362
|
+
trackedPointers[pointerId] = PointerData(
|
|
363
|
+
pointerId,
|
|
364
|
+
event.getX(event.actionIndex),
|
|
365
|
+
event.getY(event.actionIndex),
|
|
366
|
+
event.getX(event.actionIndex) + offsetX,
|
|
367
|
+
event.getY(event.actionIndex) + offsetY,
|
|
368
|
+
)
|
|
369
|
+
addChangedPointer(trackedPointers[pointerId]!!)
|
|
370
|
+
trackedPointers[pointerId] = null
|
|
371
|
+
trackedPointersCount--
|
|
372
|
+
|
|
373
|
+
dispatchTouchEvent()
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private fun dispatchTouchMoveEvent(event: MotionEvent) {
|
|
377
|
+
changedTouchesPayload = null
|
|
378
|
+
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_MOVE
|
|
379
|
+
val offsetX = event.rawX - event.x
|
|
380
|
+
val offsetY = event.rawY - event.y
|
|
381
|
+
var pointersAdded = 0
|
|
382
|
+
|
|
383
|
+
for (i in 0 until event.pointerCount) {
|
|
384
|
+
val pointerId = event.getPointerId(i)
|
|
385
|
+
val pointer = trackedPointers[pointerId] ?: continue
|
|
386
|
+
|
|
387
|
+
if (pointer.x != event.getX(i) || pointer.y != event.getY(i)) {
|
|
388
|
+
pointer.x = event.getX(i)
|
|
389
|
+
pointer.y = event.getY(i)
|
|
390
|
+
pointer.absoluteX = event.getX(i) + offsetX
|
|
391
|
+
pointer.absoluteY = event.getY(i) + offsetY
|
|
392
|
+
|
|
393
|
+
addChangedPointer(pointer)
|
|
394
|
+
pointersAdded++
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// only data about pointers that have changed their position is sent, it makes no sense to send
|
|
399
|
+
// an empty move event (especially when this method is called during down/up event and there is
|
|
400
|
+
// only info about one pointer)
|
|
401
|
+
if (pointersAdded > 0) {
|
|
402
|
+
extractAllPointersData()
|
|
403
|
+
dispatchTouchEvent()
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
fun updatePointerData(event: MotionEvent) {
|
|
408
|
+
if (event.actionMasked == MotionEvent.ACTION_DOWN || event.actionMasked == MotionEvent.ACTION_POINTER_DOWN) {
|
|
409
|
+
dispatchTouchDownEvent(event)
|
|
410
|
+
dispatchTouchMoveEvent(event)
|
|
411
|
+
} else if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_POINTER_UP) {
|
|
412
|
+
dispatchTouchMoveEvent(event)
|
|
413
|
+
dispatchTouchUpEvent(event)
|
|
414
|
+
} else if (event.actionMasked == MotionEvent.ACTION_MOVE) {
|
|
415
|
+
dispatchTouchMoveEvent(event)
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
private fun extractAllPointersData() {
|
|
420
|
+
allTouchesPayload = null
|
|
421
|
+
|
|
422
|
+
for (pointerData in trackedPointers) {
|
|
423
|
+
if (pointerData != null) {
|
|
424
|
+
addPointerToAll(pointerData)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
private fun cancelPointers() {
|
|
430
|
+
touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_CANCELLED
|
|
431
|
+
changedTouchesPayload = null
|
|
432
|
+
extractAllPointersData()
|
|
433
|
+
|
|
434
|
+
for (pointer in trackedPointers) {
|
|
435
|
+
pointer?.let {
|
|
436
|
+
addChangedPointer(it)
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
trackedPointersCount = 0
|
|
441
|
+
trackedPointers.fill(null)
|
|
442
|
+
|
|
443
|
+
dispatchTouchEvent()
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
private fun addChangedPointer(pointerData: PointerData) {
|
|
447
|
+
if (changedTouchesPayload == null) {
|
|
448
|
+
changedTouchesPayload = Arguments.createArray()
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
changedTouchesPayload!!.pushMap(createPointerData(pointerData))
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
private fun addPointerToAll(pointerData: PointerData) {
|
|
455
|
+
if (allTouchesPayload == null) {
|
|
456
|
+
allTouchesPayload = Arguments.createArray()
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
allTouchesPayload!!.pushMap(createPointerData(pointerData))
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
private fun createPointerData(pointerData: PointerData) = Arguments.createMap().apply {
|
|
463
|
+
putInt("id", pointerData.pointerId)
|
|
464
|
+
putDouble("x", PixelUtil.toDIPFromPixel(pointerData.x).toDouble())
|
|
465
|
+
putDouble("y", PixelUtil.toDIPFromPixel(pointerData.y).toDouble())
|
|
466
|
+
putDouble("absoluteX", PixelUtil.toDIPFromPixel(pointerData.absoluteX).toDouble())
|
|
467
|
+
putDouble("absoluteY", PixelUtil.toDIPFromPixel(pointerData.absoluteY).toDouble())
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
fun consumeChangedTouchesPayload(): WritableArray? {
|
|
471
|
+
val result = changedTouchesPayload
|
|
472
|
+
changedTouchesPayload = null
|
|
473
|
+
return result
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
fun consumeAllTouchesPayload(): WritableArray? {
|
|
477
|
+
val result = allTouchesPayload
|
|
478
|
+
allTouchesPayload = null
|
|
479
|
+
return result
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
private fun moveToState(newState: Int) {
|
|
483
|
+
UiThreadUtil.assertOnUiThread()
|
|
484
|
+
if (state == newState) {
|
|
485
|
+
return
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// if there are tracked pointers and the gesture is about to end, send event cancelling all pointers
|
|
489
|
+
if (trackedPointersCount > 0 && (newState == STATE_END || newState == STATE_CANCELLED || newState == STATE_FAILED)) {
|
|
490
|
+
cancelPointers()
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
val oldState = state
|
|
494
|
+
state = newState
|
|
495
|
+
if (state == STATE_ACTIVE) {
|
|
496
|
+
// Generate a unique coalescing-key each time the gesture-handler becomes active. All events will have
|
|
497
|
+
// the same coalescing-key allowing EventDispatcher to coalesce RNGestureHandlerEvents when events are
|
|
498
|
+
// generated faster than they can be treated by JS thread
|
|
499
|
+
eventCoalescingKey = nextEventCoalescingKey++
|
|
500
|
+
}
|
|
501
|
+
orchestrator!!.onHandlerStateChange(this, newState, oldState)
|
|
502
|
+
onStateChange(newState, oldState)
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
fun wantEvents(): Boolean {
|
|
506
|
+
return isEnabled
|
|
507
|
+
&& state != STATE_FAILED
|
|
508
|
+
&& state != STATE_CANCELLED
|
|
509
|
+
&& state != STATE_END
|
|
510
|
+
&& trackedPointersIDsCount > 0
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
open fun shouldRequireToWaitForFailure(handler: GestureHandler<*>): Boolean {
|
|
514
|
+
if (handler === this) {
|
|
515
|
+
return false
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return interactionController?.shouldRequireHandlerToWaitForFailure(this, handler) ?: false
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
fun shouldWaitForHandlerFailure(handler: GestureHandler<*>): Boolean {
|
|
522
|
+
if (handler === this) {
|
|
523
|
+
return false
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
return interactionController?.shouldWaitForHandlerFailure(this, handler) ?: false
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
open fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
|
|
530
|
+
if (handler === this) {
|
|
531
|
+
return true
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
return interactionController?.shouldRecognizeSimultaneously(this, handler) ?: false
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
open fun shouldBeCancelledBy(handler: GestureHandler<*>): Boolean {
|
|
538
|
+
if (handler === this) {
|
|
539
|
+
return false
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
return interactionController?.shouldHandlerBeCancelledBy(this, handler) ?: false
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
fun isWithinBounds(view: View?, posX: Float, posY: Float): Boolean {
|
|
546
|
+
var left = 0f
|
|
547
|
+
var top = 0f
|
|
548
|
+
var right = view!!.width.toFloat()
|
|
549
|
+
var bottom = view.height.toFloat()
|
|
550
|
+
if (hitSlop != null) {
|
|
551
|
+
val padLeft = hitSlop!![HIT_SLOP_LEFT_IDX]
|
|
552
|
+
val padTop = hitSlop!![HIT_SLOP_TOP_IDX]
|
|
553
|
+
val padRight = hitSlop!![HIT_SLOP_RIGHT_IDX]
|
|
554
|
+
val padBottom = hitSlop!![HIT_SLOP_BOTTOM_IDX]
|
|
555
|
+
if (hitSlopSet(padLeft)) {
|
|
556
|
+
left -= padLeft
|
|
557
|
+
}
|
|
558
|
+
if (hitSlopSet(padTop)) {
|
|
559
|
+
top -= padTop
|
|
560
|
+
}
|
|
561
|
+
if (hitSlopSet(padRight)) {
|
|
562
|
+
right += padRight
|
|
563
|
+
}
|
|
564
|
+
if (hitSlopSet(padBottom)) {
|
|
565
|
+
bottom += padBottom
|
|
566
|
+
}
|
|
567
|
+
val width = hitSlop!![HIT_SLOP_WIDTH_IDX]
|
|
568
|
+
val height = hitSlop!![HIT_SLOP_HEIGHT_IDX]
|
|
569
|
+
if (hitSlopSet(width)) {
|
|
570
|
+
if (!hitSlopSet(padLeft)) {
|
|
571
|
+
left = right - width
|
|
572
|
+
} else if (!hitSlopSet(padRight)) {
|
|
573
|
+
right = left + width
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (hitSlopSet(height)) {
|
|
577
|
+
if (!hitSlopSet(padTop)) {
|
|
578
|
+
top = bottom - height
|
|
579
|
+
} else if (!hitSlopSet(padBottom)) {
|
|
580
|
+
bottom = top + height
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
return posX in left..right && posY in top..bottom
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
fun cancel() {
|
|
588
|
+
if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN) {
|
|
589
|
+
onCancel()
|
|
590
|
+
moveToState(STATE_CANCELLED)
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
fun fail() {
|
|
595
|
+
if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN) {
|
|
596
|
+
moveToState(STATE_FAILED)
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
fun activate() = activate(force = false)
|
|
601
|
+
|
|
602
|
+
open fun activate(force: Boolean) {
|
|
603
|
+
if ((!manualActivation || force) && (state == STATE_UNDETERMINED || state == STATE_BEGAN)) {
|
|
604
|
+
moveToState(STATE_ACTIVE)
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
fun begin() {
|
|
609
|
+
if (state == STATE_UNDETERMINED) {
|
|
610
|
+
moveToState(STATE_BEGAN)
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
fun end() {
|
|
615
|
+
if (state == STATE_BEGAN || state == STATE_ACTIVE) {
|
|
616
|
+
moveToState(STATE_END)
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
protected open fun onHandle(event: MotionEvent) {
|
|
621
|
+
moveToState(STATE_FAILED)
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
protected open fun onStateChange(newState: Int, previousState: Int) {}
|
|
625
|
+
protected open fun onReset() {}
|
|
626
|
+
protected open fun onCancel() {}
|
|
627
|
+
fun reset() {
|
|
628
|
+
view = null
|
|
629
|
+
orchestrator = null
|
|
630
|
+
Arrays.fill(trackedPointerIDs, -1)
|
|
631
|
+
trackedPointersIDsCount = 0
|
|
632
|
+
|
|
633
|
+
trackedPointersCount = 0
|
|
634
|
+
trackedPointers.fill(null)
|
|
635
|
+
touchEventType = RNGestureHandlerTouchEvent.EVENT_UNDETERMINED
|
|
636
|
+
onReset()
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
fun setOnTouchEventListener(listener: OnTouchEventListener?): GestureHandler<*> {
|
|
640
|
+
onTouchEventListener = listener
|
|
641
|
+
return this
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
override fun toString(): String {
|
|
645
|
+
val viewString = if (view == null) null else view!!.javaClass.simpleName
|
|
646
|
+
return this.javaClass.simpleName + "@[" + tag + "]:" + viewString
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
val lastRelativePositionX: Float
|
|
650
|
+
get() = lastAbsolutePositionX - lastEventOffsetX
|
|
651
|
+
val lastRelativePositionY: Float
|
|
652
|
+
get() = lastAbsolutePositionY - lastEventOffsetY
|
|
653
|
+
|
|
654
|
+
companion object {
|
|
655
|
+
const val STATE_UNDETERMINED = 0
|
|
656
|
+
const val STATE_FAILED = 1
|
|
657
|
+
const val STATE_BEGAN = 2
|
|
658
|
+
const val STATE_CANCELLED = 3
|
|
659
|
+
const val STATE_ACTIVE = 4
|
|
660
|
+
const val STATE_END = 5
|
|
661
|
+
const val HIT_SLOP_NONE = Float.NaN
|
|
662
|
+
private const val HIT_SLOP_LEFT_IDX = 0
|
|
663
|
+
private const val HIT_SLOP_TOP_IDX = 1
|
|
664
|
+
private const val HIT_SLOP_RIGHT_IDX = 2
|
|
665
|
+
private const val HIT_SLOP_BOTTOM_IDX = 3
|
|
666
|
+
private const val HIT_SLOP_WIDTH_IDX = 4
|
|
667
|
+
private const val HIT_SLOP_HEIGHT_IDX = 5
|
|
668
|
+
const val DIRECTION_RIGHT = 1
|
|
669
|
+
const val DIRECTION_LEFT = 2
|
|
670
|
+
const val DIRECTION_UP = 4
|
|
671
|
+
const val DIRECTION_DOWN = 8
|
|
672
|
+
private const val MAX_POINTERS_COUNT = 12
|
|
673
|
+
private lateinit var pointerProps: Array<PointerProperties?>
|
|
674
|
+
private lateinit var pointerCoords: Array<PointerCoords?>
|
|
675
|
+
private fun initPointerProps(size: Int) {
|
|
676
|
+
var size = size
|
|
677
|
+
if (!::pointerProps.isInitialized) {
|
|
678
|
+
pointerProps = arrayOfNulls(MAX_POINTERS_COUNT)
|
|
679
|
+
pointerCoords = arrayOfNulls(MAX_POINTERS_COUNT)
|
|
680
|
+
}
|
|
681
|
+
while (size > 0 && pointerProps[size - 1] == null) {
|
|
682
|
+
pointerProps[size - 1] = PointerProperties()
|
|
683
|
+
pointerCoords[size - 1] = PointerCoords()
|
|
684
|
+
size--
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
private var nextEventCoalescingKey: Short = 0
|
|
689
|
+
private fun hitSlopSet(value: Float): Boolean {
|
|
690
|
+
return !java.lang.Float.isNaN(value)
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
fun stateToString(state: Int): String? {
|
|
694
|
+
when (state) {
|
|
695
|
+
STATE_UNDETERMINED -> return "UNDETERMINED"
|
|
696
|
+
STATE_ACTIVE -> return "ACTIVE"
|
|
697
|
+
STATE_FAILED -> return "FAILED"
|
|
698
|
+
STATE_BEGAN -> return "BEGIN"
|
|
699
|
+
STATE_CANCELLED -> return "CANCELLED"
|
|
700
|
+
STATE_END -> return "END"
|
|
701
|
+
}
|
|
702
|
+
return null
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
private data class PointerData(
|
|
707
|
+
val pointerId: Int,
|
|
708
|
+
var x: Float,
|
|
709
|
+
var y: Float,
|
|
710
|
+
var absoluteX: Float,
|
|
711
|
+
var absoluteY: Float
|
|
712
|
+
)
|
|
713
|
+
}
|