react-native-gesture-handler 2.4.1 → 2.6.0
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 +4 -2
- package/RNGestureHandler.podspec +17 -5
- package/android/build.gradle +71 -15
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +2 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +9 -5
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +32 -6
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +5 -2
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +105 -23
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +30 -2
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +3 -2
- package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +0 -8
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +74 -84
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +7 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +5 -1
- package/android/src/main/jni/CMakeLists.txt +59 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +12 -9
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +1 -0
- package/ios/Handlers/RNFlingHandler.m +43 -1
- package/ios/Handlers/{RNNativeViewHandler.m → RNNativeViewHandler.mm} +13 -1
- package/ios/Handlers/RNPanHandler.m +27 -0
- package/ios/RNGestureHandler.h +1 -0
- package/ios/RNGestureHandler.m +22 -4
- package/ios/RNGestureHandlerButtonComponentView.mm +1 -1
- package/ios/RNGestureHandlerManager.mm +10 -7
- package/ios/RNGestureHandlerModule.mm +4 -1
- package/ios/RNGestureHandlerRootViewComponentView.mm +1 -1
- package/ios/RNManualActivationRecognizer.m +10 -3
- package/ios/RNRootViewGestureRecognizer.m +12 -1
- package/lib/commonjs/EnableExperimentalWebImplementation.js +24 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.macos.js +138 -0
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.web.js +87 -25
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/RNRenderer.js +16 -0
- package/lib/commonjs/RNRenderer.js.map +1 -0
- package/lib/commonjs/RNRenderer.web.js +11 -0
- package/lib/commonjs/RNRenderer.web.js.map +1 -0
- package/lib/commonjs/components/DrawerLayout.js +41 -12
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js +42 -9
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js +41 -4
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.web.js +7 -2
- package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +3 -1
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +5 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js +2 -1
- package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js +1 -1
- package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/PressabilityDebugView.js +14 -0
- package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -0
- package/lib/commonjs/handlers/PressabilityDebugView.web.js +12 -0
- package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +1 -0
- package/lib/commonjs/handlers/createHandler.js +33 -12
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +150 -75
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js +13 -2
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureStateManager.js +13 -9
- package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/commonjs/handlers/gestures/panGesture.js +5 -0
- package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +7 -0
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils.js +6 -3
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/constants.js +3 -51
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/detectors/RotationGestureDetector.js +169 -0
- package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -0
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js +167 -0
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -0
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +154 -0
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/GestureHandler.js +538 -0
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +147 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +116 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/PanGestureHandler.js +451 -0
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +171 -0
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +187 -0
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/TapGestureHandler.js +296 -0
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -0
- package/lib/commonjs/web/interfaces.js +34 -0
- package/lib/commonjs/web/interfaces.js.map +1 -0
- package/lib/commonjs/web/tools/EventManager.js +169 -0
- package/lib/commonjs/web/tools/EventManager.js.map +1 -0
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +283 -0
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -0
- package/lib/commonjs/web/tools/InteractionManager.js +102 -0
- package/lib/commonjs/web/tools/InteractionManager.js.map +1 -0
- package/lib/commonjs/web/tools/NodeManager.js +48 -0
- package/lib/commonjs/web/tools/NodeManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerTracker.js +132 -0
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/Errors.js +0 -0
- package/lib/commonjs/{web → web_hammer}/Errors.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/GestureHandler.js +83 -42
- package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
- package/lib/commonjs/web_hammer/NativeViewGestureHandler.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/NodeManager.js +0 -0
- package/lib/commonjs/web_hammer/NodeManager.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
- package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js +0 -0
- package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js.map +0 -0
- package/lib/commonjs/web_hammer/constants.js +64 -0
- package/lib/commonjs/web_hammer/constants.js.map +1 -0
- package/lib/commonjs/{web → web_hammer}/utils.js +0 -0
- package/lib/commonjs/{web → web_hammer}/utils.js.map +1 -1
- package/lib/module/EnableExperimentalWebImplementation.js +15 -0
- package/lib/module/EnableExperimentalWebImplementation.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.macos.js +102 -0
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.web.js +73 -24
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/RNRenderer.js +4 -0
- package/lib/module/RNRenderer.js.map +1 -0
- package/lib/module/RNRenderer.web.js +4 -0
- package/lib/module/RNRenderer.web.js.map +1 -0
- package/lib/module/components/DrawerLayout.js +41 -12
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureButtons.js +43 -9
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js +39 -4
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/GestureComponents.web.js +6 -2
- package/lib/module/components/GestureComponents.web.js.map +1 -1
- package/lib/module/components/Swipeable.js +3 -1
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +5 -1
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/handlers/ForceTouchGestureHandler.js +1 -1
- package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
- package/lib/module/handlers/PanGestureHandler.js +1 -1
- package/lib/module/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/handlers/PressabilityDebugView.js +3 -0
- package/lib/module/handlers/PressabilityDebugView.js.map +1 -0
- package/lib/module/handlers/PressabilityDebugView.web.js +5 -0
- package/lib/module/handlers/PressabilityDebugView.web.js.map +1 -0
- package/lib/module/handlers/createHandler.js +35 -14
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +147 -74
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js +13 -2
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/gestureStateManager.js +13 -9
- package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
- package/lib/module/handlers/gestures/panGesture.js +5 -0
- package/lib/module/handlers/gestures/panGesture.js.map +1 -1
- package/lib/module/handlers/gestures/reanimatedWrapper.js +7 -0
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils.js +2 -1
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/constants.js +1 -36
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/detectors/RotationGestureDetector.js +159 -0
- package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -0
- package/lib/module/web/detectors/ScaleGestureDetector.js +156 -0
- package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -0
- package/lib/module/web/handlers/FlingGestureHandler.js +139 -0
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/GestureHandler.js +521 -0
- package/lib/module/web/handlers/GestureHandler.js.map +1 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js +133 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js +103 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/PanGestureHandler.js +434 -0
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/PinchGestureHandler.js +155 -0
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/RotationGestureHandler.js +171 -0
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/TapGestureHandler.js +281 -0
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -0
- package/lib/module/web/interfaces.js +26 -0
- package/lib/module/web/interfaces.js.map +1 -0
- package/lib/module/web/tools/EventManager.js +160 -0
- package/lib/module/web/tools/EventManager.js.map +1 -0
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +270 -0
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -0
- package/lib/module/web/tools/InteractionManager.js +93 -0
- package/lib/module/web/tools/InteractionManager.js.map +1 -0
- package/lib/module/web/tools/NodeManager.js +39 -0
- package/lib/module/web/tools/NodeManager.js.map +1 -0
- package/lib/module/web/tools/PointerTracker.js +122 -0
- package/lib/module/web/tools/PointerTracker.js.map +1 -0
- package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/DraggingGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/Errors.js +0 -0
- package/lib/module/{web → web_hammer}/Errors.js.map +0 -0
- package/lib/module/{web → web_hammer}/FlingGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/GestureHandler.js +83 -42
- package/lib/module/web_hammer/GestureHandler.js.map +1 -0
- package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/LongPressGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
- package/lib/module/web_hammer/NativeViewGestureHandler.js.map +1 -0
- package/lib/module/{web → web_hammer}/NodeManager.js +0 -0
- package/lib/module/web_hammer/NodeManager.js.map +1 -0
- package/lib/module/{web → web_hammer}/PanGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PanGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/PinchGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/PressGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/PressGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/RotationGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
- package/lib/module/{web → web_hammer}/TapGestureHandler.js +0 -0
- package/lib/module/{web → web_hammer}/TapGestureHandler.js.map +0 -0
- package/lib/module/web_hammer/constants.js +43 -0
- package/lib/module/web_hammer/constants.js.map +1 -0
- package/lib/module/{web → web_hammer}/utils.js +0 -0
- package/lib/module/{web → web_hammer}/utils.js.map +1 -1
- package/lib/typescript/EnableExperimentalWebImplementation.d.ts +2 -0
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +44 -0
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +29 -18
- package/lib/typescript/RNRenderer.d.ts +1 -0
- package/lib/typescript/RNRenderer.web.d.ts +3 -0
- package/lib/typescript/components/DrawerLayout.d.ts +4 -1
- package/lib/typescript/components/GestureButtons.d.ts +22 -0
- package/lib/typescript/components/GestureComponents.d.ts +7 -3
- package/lib/typescript/components/GestureComponents.web.d.ts +1 -0
- package/lib/typescript/components/Swipeable.d.ts +1 -1
- package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +1 -0
- package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
- package/lib/typescript/handlers/PanGestureHandler.d.ts +2 -1
- package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -0
- package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +1 -0
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +1 -0
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +3 -0
- package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -0
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/web/constants.d.ts +1 -33
- package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +30 -0
- package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +30 -0
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +31 -0
- package/lib/typescript/web/handlers/GestureHandler.d.ts +84 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +33 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +16 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +68 -0
- package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +30 -0
- package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +30 -0
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +49 -0
- package/lib/typescript/web/interfaces.d.ts +97 -0
- package/lib/typescript/web/tools/EventManager.d.ts +28 -0
- package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +28 -0
- package/lib/typescript/web/tools/InteractionManager.d.ts +13 -0
- package/lib/typescript/web/tools/NodeManager.d.ts +11 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +28 -0
- package/lib/typescript/{web → web_hammer}/DiscreteGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/DraggingGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/Errors.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/FlingGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/GestureHandler.d.ts +6 -0
- package/lib/typescript/{web → web_hammer}/IndiscreteGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/LongPressGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web_hammer/NodeManager.d.ts +8 -0
- package/lib/typescript/{web → web_hammer}/PanGestureHandler.d.ts +1 -0
- package/lib/typescript/{web → web_hammer}/PinchGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/PressGestureHandler.d.ts +2 -0
- package/lib/typescript/{web → web_hammer}/RotationGestureHandler.d.ts +0 -0
- package/lib/typescript/{web → web_hammer}/TapGestureHandler.d.ts +1 -0
- package/lib/typescript/web_hammer/constants.d.ts +39 -0
- package/lib/typescript/{web → web_hammer}/utils.d.ts +0 -0
- package/package.json +1 -1
- package/src/EnableExperimentalWebImplementation.ts +18 -0
- package/src/RNGestureHandlerModule.macos.ts +114 -0
- package/src/RNGestureHandlerModule.web.ts +89 -26
- package/src/RNRenderer.ts +3 -0
- package/src/RNRenderer.web.ts +3 -0
- package/src/components/DrawerLayout.tsx +37 -14
- package/src/components/GestureButtons.tsx +64 -0
- package/src/components/GestureComponents.tsx +66 -6
- package/src/components/GestureComponents.web.tsx +5 -0
- package/src/components/Swipeable.tsx +3 -1
- package/src/components/touchables/GenericTouchable.tsx +2 -0
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +1 -0
- package/src/handlers/ForceTouchGestureHandler.ts +3 -2
- package/src/handlers/PanGestureHandler.ts +2 -0
- package/src/handlers/PressabilityDebugView.tsx +2 -0
- package/src/handlers/PressabilityDebugView.web.tsx +4 -0
- package/src/handlers/{createHandler.ts → createHandler.tsx} +45 -19
- package/src/handlers/gestureHandlerCommon.ts +2 -0
- package/src/handlers/gestures/GestureDetector.tsx +185 -93
- package/src/handlers/gestures/gesture.ts +16 -0
- package/src/handlers/gestures/gestureStateManager.ts +13 -8
- package/src/handlers/gestures/panGesture.ts +5 -0
- package/src/handlers/gestures/reanimatedWrapper.ts +7 -0
- package/src/index.ts +3 -0
- package/src/utils.ts +3 -1
- package/src/web/constants.ts +1 -41
- package/src/web/detectors/RotationGestureDetector.ts +199 -0
- package/src/web/detectors/ScaleGestureDetector.ts +208 -0
- package/src/web/handlers/FlingGestureHandler.ts +146 -0
- package/src/web/handlers/GestureHandler.ts +572 -0
- package/src/web/handlers/LongPressGestureHandler.ts +122 -0
- package/src/web/handlers/NativeViewGestureHandler.ts +109 -0
- package/src/web/handlers/PanGestureHandler.ts +488 -0
- package/src/web/handlers/PinchGestureHandler.ts +162 -0
- package/src/web/handlers/RotationGestureHandler.ts +181 -0
- package/src/web/handlers/TapGestureHandler.ts +275 -0
- package/src/web/interfaces.ts +114 -0
- package/src/web/tools/EventManager.ts +186 -0
- package/src/web/tools/GestureHandlerOrchestrator.ts +329 -0
- package/src/web/tools/InteractionManager.ts +108 -0
- package/src/web/tools/NodeManager.ts +43 -0
- package/src/web/tools/PointerTracker.ts +130 -0
- package/src/{web → web_hammer}/DiscreteGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/DraggingGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/Errors.ts +0 -0
- package/src/{web → web_hammer}/FlingGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/GestureHandler.ts +102 -55
- package/src/{web → web_hammer}/IndiscreteGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/LongPressGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/NativeViewGestureHandler.ts +4 -0
- package/src/{web → web_hammer}/NodeManager.ts +6 -3
- package/src/{web → web_hammer}/PanGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/PinchGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/PressGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/RotationGestureHandler.ts +0 -0
- package/src/{web → web_hammer}/TapGestureHandler.ts +0 -0
- package/src/web_hammer/constants.ts +48 -0
- package/src/{web → web_hammer}/utils.ts +1 -1
- package/android/src/main/jni/Android.mk +0 -53
- package/android/src/main/jni/OnLoad.cpp +0 -9
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +0 -71
- package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +0 -34
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
- package/lib/commonjs/web/GestureHandler.js.map +0 -1
- package/lib/commonjs/web/NativeViewGestureHandler.js.map +0 -1
- package/lib/commonjs/web/NodeManager.js.map +0 -1
- package/lib/module/web/GestureHandler.js.map +0 -1
- package/lib/module/web/NativeViewGestureHandler.js.map +0 -1
- package/lib/module/web/NodeManager.js.map +0 -1
- package/lib/typescript/web/NodeManager.d.ts +0 -8
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Check out our dedicated documentation page for info about this library, API refe
|
|
|
24
24
|
If you want to play with the API but don't feel like trying it on a real app, you can run the example project. Clone the repo, go to the `example` folder and run:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
|
|
27
|
+
yarn install
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
If you are running on ios, run `pod install` in the ios folder
|
|
@@ -39,12 +39,14 @@ You will need to have an Android or iOS device or emulator connected as well as
|
|
|
39
39
|
|
|
40
40
|
| version | react-native version |
|
|
41
41
|
| ------- | -------------------- |
|
|
42
|
+
| 2.0.0+ | 0.63.0+ |
|
|
42
43
|
| 1.4.0+ | 0.60.0+ |
|
|
43
44
|
| 1.1.0+ | 0.57.2+ |
|
|
44
45
|
| <1.1.0 | 0.50.0+ |
|
|
45
46
|
|
|
46
47
|
It may be possible to use newer versions of react-native-gesture-handler on React Native with version <= 0.59 by reverse Jetifying.
|
|
47
|
-
Read more on that here https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries
|
|
48
|
+
Read more on that here <https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries>
|
|
49
|
+
|
|
48
50
|
## License
|
|
49
51
|
|
|
50
52
|
Gesture handler library is licensed under [The MIT License](LICENSE).
|
package/RNGestureHandler.podspec
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
require "json"
|
|
2
2
|
|
|
3
|
-
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED']
|
|
3
|
+
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
|
|
4
|
+
|
|
5
|
+
isUserApp = File.exists?(File.join(__dir__, "..", "..", "node_modules", "react-native", "package.json"))
|
|
6
|
+
if isUserApp
|
|
7
|
+
libInstances = %x[find ../../ -name "package.json" | grep "/react-native-gesture-handler/package.json" | grep -v "/.yarn/"]
|
|
8
|
+
libInstancesArray = libInstances.split("\n")
|
|
9
|
+
if libInstancesArray.length() > 1
|
|
10
|
+
parsedLocation = ''
|
|
11
|
+
for location in libInstancesArray
|
|
12
|
+
location['../../'] = '- '
|
|
13
|
+
location['/package.json'] = ''
|
|
14
|
+
parsedLocation += location + "\n"
|
|
15
|
+
end
|
|
16
|
+
raise "[Gesture Handler] Multiple versions of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-versions-of-reanimated-were-detected \n\nConflict between: \n" + parsedLocation
|
|
17
|
+
end
|
|
18
|
+
end
|
|
4
19
|
|
|
5
20
|
Pod::Spec.new do |s|
|
|
6
21
|
# NPM package specification
|
|
@@ -17,9 +32,6 @@ Pod::Spec.new do |s|
|
|
|
17
32
|
s.requires_arc = true
|
|
18
33
|
|
|
19
34
|
if fabric_enabled
|
|
20
|
-
# folly_version must match the version used in React Native
|
|
21
|
-
# See folly_version in react-native/React/FBReactNativeSpec/FBReactNativeSpec.podspec
|
|
22
|
-
folly_version = '2021.06.28.00-v2'
|
|
23
35
|
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
|
24
36
|
|
|
25
37
|
s.pod_target_xcconfig = {
|
|
@@ -32,7 +44,7 @@ Pod::Spec.new do |s|
|
|
|
32
44
|
s.dependency "React"
|
|
33
45
|
s.dependency "React-RCTFabric" # This is for fabric component
|
|
34
46
|
s.dependency "React-Codegen"
|
|
35
|
-
s.dependency "RCT-Folly"
|
|
47
|
+
s.dependency "RCT-Folly"
|
|
36
48
|
s.dependency "RCTRequired"
|
|
37
49
|
s.dependency "RCTTypeSafety"
|
|
38
50
|
s.dependency "ReactCommon/turbomodule/core"
|
package/android/build.gradle
CHANGED
|
@@ -21,7 +21,7 @@ def isNewArchitectureEnabled() {
|
|
|
21
21
|
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
def findNodeModulePath(baseDir, packageName) {
|
|
24
|
+
static def findNodeModulePath(baseDir, packageName) {
|
|
25
25
|
def basePath = baseDir.toPath().normalize()
|
|
26
26
|
// Node's module resolution algorithm searches up to the root directory,
|
|
27
27
|
// after which the base path will be null
|
|
@@ -35,6 +35,13 @@ def findNodeModulePath(baseDir, packageName) {
|
|
|
35
35
|
return null
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
def findNodeModulePath(packageName) {
|
|
39
|
+
// Don't start in the project dir, as its path ends with node_modules/react-native-gesture-handler/android
|
|
40
|
+
// we want to go two levels up, so we end up in the first_node modules and eventually
|
|
41
|
+
// search upwards if the package is not found there
|
|
42
|
+
return findNodeModulePath(projectDir.toPath().parent.parent.toFile(), packageName)
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
if (isNewArchitectureEnabled()) {
|
|
39
46
|
apply plugin: 'com.facebook.react'
|
|
40
47
|
}
|
|
@@ -59,6 +66,45 @@ def shouldUseCommonInterfaceFromReanimated() {
|
|
|
59
66
|
}
|
|
60
67
|
}
|
|
61
68
|
|
|
69
|
+
def reactNativeArchitectures() {
|
|
70
|
+
def value = project.getProperties().get("reactNativeArchitectures")
|
|
71
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
def shouldAssertNoMultipleInstances() {
|
|
75
|
+
if (rootProject.hasProperty("disableMultipleInstancesCheck")) {
|
|
76
|
+
return rootProject.property("disableMultipleInstancesCheck") != "true"
|
|
77
|
+
} else {
|
|
78
|
+
return true
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
def noMultipleInstancesAssertion() {
|
|
83
|
+
Set<File> files = fileTree(rootDir.parent) {
|
|
84
|
+
include "node_modules/**/react-native-gesture-handler/package.json"
|
|
85
|
+
exclude "**/.yarn/**"
|
|
86
|
+
}.files
|
|
87
|
+
|
|
88
|
+
if (files.size() > 1) {
|
|
89
|
+
String parsedLocation = files.stream().map({ File file -> "- " + file.toString().replace("/package.json", "") }).collect().join("\n")
|
|
90
|
+
String exceptionMessage = "\n[Gesture Handler] Multiple instances of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-instances-of-gesture-handler-were-detected \n\nConflict between: \n" + parsedLocation + "\n";
|
|
91
|
+
throw new Exception(exceptionMessage);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
def REACT_NATIVE_DIR = findNodeModulePath("react-native")
|
|
96
|
+
|
|
97
|
+
def assertionTask = task assertNoMultipleInstances {
|
|
98
|
+
onlyIf { shouldAssertNoMultipleInstances() }
|
|
99
|
+
doFirst {
|
|
100
|
+
noMultipleInstancesAssertion()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
tasks.preBuild {
|
|
105
|
+
dependsOn assertionTask
|
|
106
|
+
}
|
|
107
|
+
|
|
62
108
|
repositories {
|
|
63
109
|
mavenCentral()
|
|
64
110
|
}
|
|
@@ -84,17 +130,12 @@ android {
|
|
|
84
130
|
if (isNewArchitectureEnabled()) {
|
|
85
131
|
var appProject = rootProject.allprojects.find {it.plugins.hasPlugin('com.android.application')}
|
|
86
132
|
externalNativeBuild {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
"REACT_ANDROID_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid",
|
|
94
|
-
"REACT_ANDROID_BUILD_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid/build"
|
|
95
|
-
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
|
96
|
-
cppFlags "-std=c++17"
|
|
97
|
-
targets "rngesturehandler_modules"
|
|
133
|
+
cmake {
|
|
134
|
+
cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all"
|
|
135
|
+
arguments "-DAPP_BUILD_DIR=${appProject.buildDir}",
|
|
136
|
+
"-DREACT_NATIVE_DIR=${REACT_NATIVE_DIR}",
|
|
137
|
+
"-DANDROID_STL=c++_shared"
|
|
138
|
+
abiFilters (*reactNativeArchitectures())
|
|
98
139
|
}
|
|
99
140
|
}
|
|
100
141
|
}
|
|
@@ -107,8 +148,8 @@ android {
|
|
|
107
148
|
|
|
108
149
|
if (isNewArchitectureEnabled()) {
|
|
109
150
|
externalNativeBuild {
|
|
110
|
-
|
|
111
|
-
path "src/main/jni/
|
|
151
|
+
cmake {
|
|
152
|
+
path "src/main/jni/CMakeLists.txt"
|
|
112
153
|
}
|
|
113
154
|
}
|
|
114
155
|
}
|
|
@@ -116,7 +157,7 @@ android {
|
|
|
116
157
|
packagingOptions {
|
|
117
158
|
// For some reason gradle only complains about the duplicated version of libreact_render libraries
|
|
118
159
|
// while there are more libraries copied in intermediates folder of the lib build directory, we exclude
|
|
119
|
-
// only the ones that make the build fail (ideally we should only include
|
|
160
|
+
// only the ones that make the build fail (ideally we should only include libgesturehandler but we
|
|
120
161
|
// are only allowed to specify exclude patterns)
|
|
121
162
|
exclude "**/libreact_render*.so"
|
|
122
163
|
}
|
|
@@ -178,4 +219,19 @@ if (isNewArchitectureEnabled()) {
|
|
|
178
219
|
libraryName = "rngesturehandler"
|
|
179
220
|
codegenJavaPackageName = "com.swmansion.gesturehandler"
|
|
180
221
|
}
|
|
222
|
+
|
|
223
|
+
// Resolves "LOCAL_SRC_FILES points to a missing file, Check that libfb.so exists or that its path is correct".
|
|
224
|
+
tasks.whenTaskAdded { task ->
|
|
225
|
+
if (task.name.contains("configureCMakeDebug")) {
|
|
226
|
+
rootProject.getTasksByName("packageReactNdkDebugLibs", true).forEach {
|
|
227
|
+
task.dependsOn(it)
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// We want to add a dependency for both configureCMakeRelease and configureCMakeRelWithDebInfo
|
|
231
|
+
if (task.name.contains("configureCMakeRel")) {
|
|
232
|
+
rootProject.getTasksByName("packageReactNdkReleaseLibs", true).forEach {
|
|
233
|
+
task.dependsOn(it)
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
181
237
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.swmansion.gesturehandler
|
|
2
2
|
|
|
3
3
|
import android.os.Handler
|
|
4
|
+
import android.os.Looper
|
|
4
5
|
import android.view.MotionEvent
|
|
5
6
|
|
|
6
7
|
class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
|
|
@@ -27,7 +28,7 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
|
|
|
27
28
|
begin()
|
|
28
29
|
maxNumberOfPointersSimultaneously = 1
|
|
29
30
|
if (handler == null) {
|
|
30
|
-
handler = Handler() // lazy delegate?
|
|
31
|
+
handler = Handler(Looper.getMainLooper()) // lazy delegate?
|
|
31
32
|
} else {
|
|
32
33
|
handler!!.removeCallbacksAndMessages(null)
|
|
33
34
|
}
|
|
@@ -172,8 +172,12 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
172
172
|
windowOffset[0] = 0
|
|
173
173
|
windowOffset[1] = 0
|
|
174
174
|
}
|
|
175
|
+
|
|
176
|
+
onPrepare()
|
|
175
177
|
}
|
|
176
178
|
|
|
179
|
+
protected open fun onPrepare() {}
|
|
180
|
+
|
|
177
181
|
private fun getWindow(context: Context?): Window? {
|
|
178
182
|
if (context == null) return null
|
|
179
183
|
if (context is Activity) return context.window
|
|
@@ -253,9 +257,9 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
253
257
|
}
|
|
254
258
|
initPointerProps(trackedPointersIDsCount)
|
|
255
259
|
var count = 0
|
|
256
|
-
val
|
|
257
|
-
val
|
|
258
|
-
event.
|
|
260
|
+
val deltaX = event.rawX - event.x
|
|
261
|
+
val deltaY = event.rawY - event.y
|
|
262
|
+
event.offsetLocation(deltaX, deltaY)
|
|
259
263
|
var index = 0
|
|
260
264
|
val size = event.pointerCount
|
|
261
265
|
while (index < size) {
|
|
@@ -298,8 +302,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
|
|
|
298
302
|
} catch (e: IllegalArgumentException) {
|
|
299
303
|
throw AdaptEventException(this, event, e)
|
|
300
304
|
}
|
|
301
|
-
event.
|
|
302
|
-
result.
|
|
305
|
+
event.offsetLocation(-deltaX, -deltaY)
|
|
306
|
+
result.offsetLocation(-deltaX, -deltaY)
|
|
303
307
|
return result
|
|
304
308
|
}
|
|
305
309
|
|
package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt
CHANGED
|
@@ -5,6 +5,7 @@ import android.graphics.PointF
|
|
|
5
5
|
import android.view.MotionEvent
|
|
6
6
|
import android.view.View
|
|
7
7
|
import android.view.ViewGroup
|
|
8
|
+
import android.widget.EditText
|
|
8
9
|
import java.util.*
|
|
9
10
|
|
|
10
11
|
class GestureHandlerOrchestrator(
|
|
@@ -128,6 +129,13 @@ class GestureHandlerOrchestrator(
|
|
|
128
129
|
if (newState == GestureHandler.STATE_END) {
|
|
129
130
|
// gesture has ended, we need to kill the awaiting handler
|
|
130
131
|
otherHandler.cancel()
|
|
132
|
+
if (otherHandler.state == GestureHandler.STATE_END) {
|
|
133
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
|
134
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
|
135
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
|
136
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
|
137
|
+
otherHandler.dispatchStateChange(GestureHandler.STATE_CANCELLED, GestureHandler.STATE_BEGAN)
|
|
138
|
+
}
|
|
131
139
|
otherHandler.isAwaiting = false
|
|
132
140
|
} else {
|
|
133
141
|
// gesture has failed recognition, we may try activating
|
|
@@ -142,9 +150,12 @@ class GestureHandlerOrchestrator(
|
|
|
142
150
|
} else if (prevState == GestureHandler.STATE_ACTIVE || prevState == GestureHandler.STATE_END) {
|
|
143
151
|
if (handler.isActive) {
|
|
144
152
|
handler.dispatchStateChange(newState, prevState)
|
|
145
|
-
} else if (prevState == GestureHandler.STATE_ACTIVE) {
|
|
146
|
-
//
|
|
147
|
-
// before the other would not send state change event upon ending
|
|
153
|
+
} else if (prevState == GestureHandler.STATE_ACTIVE && (newState == GestureHandler.STATE_CANCELLED || newState == GestureHandler.STATE_FAILED)) {
|
|
154
|
+
// Handle edge case where handler awaiting for another one tries to activate but finishes
|
|
155
|
+
// before the other would not send state change event upon ending. Note that we only want
|
|
156
|
+
// to do this if the newState is either CANCELLED or FAILED, if it is END we still want to
|
|
157
|
+
// wait for the other handler to finish as in that case synthetic events will be sent by the
|
|
158
|
+
// makeActive method.
|
|
148
159
|
handler.dispatchStateChange(newState, GestureHandler.STATE_BEGAN)
|
|
149
160
|
}
|
|
150
161
|
} else if (prevState != GestureHandler.STATE_UNDETERMINED || newState != GestureHandler.STATE_CANCELLED) {
|
|
@@ -474,9 +485,24 @@ class GestureHandlerOrchestrator(
|
|
|
474
485
|
}
|
|
475
486
|
PointerEventsConfig.BOX_NONE -> {
|
|
476
487
|
// This view can't be the target, but its children might
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
488
|
+
when (view) {
|
|
489
|
+
is ViewGroup -> {
|
|
490
|
+
extractGestureHandlers(view, coords, pointerId).also { found ->
|
|
491
|
+
// A child view is handling touch, also extract handlers attached to this view
|
|
492
|
+
if (found) {
|
|
493
|
+
recordViewHandlersForPointer(view, coords, pointerId)
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// When <TextInput> has editable set to `false` getPointerEventsConfigForView returns
|
|
498
|
+
// `BOX_NONE` as it's `isEnabled` property is false. In this case we still want to extract
|
|
499
|
+
// handlers attached to the text input, as it makes sense that gestures would work on a
|
|
500
|
+
// non-editable TextInput.
|
|
501
|
+
is EditText -> {
|
|
502
|
+
recordViewHandlersForPointer(view, coords, pointerId)
|
|
503
|
+
}
|
|
504
|
+
else -> false
|
|
505
|
+
}
|
|
480
506
|
}
|
|
481
507
|
PointerEventsConfig.AUTO -> {
|
|
482
508
|
// Either this view or one of its children is the target
|
|
@@ -2,6 +2,7 @@ package com.swmansion.gesturehandler
|
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.os.Handler
|
|
5
|
+
import android.os.Looper
|
|
5
6
|
import android.os.SystemClock
|
|
6
7
|
import android.view.MotionEvent
|
|
7
8
|
|
|
@@ -19,7 +20,9 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
|
|
|
19
20
|
|
|
20
21
|
init {
|
|
21
22
|
setShouldCancelWhenOutside(true)
|
|
22
|
-
|
|
23
|
+
|
|
24
|
+
val defaultMaxDist = DEFAULT_MAX_DIST_DP * context.resources.displayMetrics.density
|
|
25
|
+
defaultMaxDistSq = defaultMaxDist * defaultMaxDist
|
|
23
26
|
maxDistSq = defaultMaxDistSq
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -41,7 +44,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
|
|
|
41
44
|
begin()
|
|
42
45
|
startX = event.rawX
|
|
43
46
|
startY = event.rawY
|
|
44
|
-
handler = Handler()
|
|
47
|
+
handler = Handler(Looper.getMainLooper())
|
|
45
48
|
if (minDurationMs > 0) {
|
|
46
49
|
handler!!.postDelayed({ activate() }, minDurationMs)
|
|
47
50
|
} else if (minDurationMs == 0L) {
|
|
@@ -3,12 +3,16 @@ package com.swmansion.gesturehandler
|
|
|
3
3
|
import android.os.SystemClock
|
|
4
4
|
import android.view.MotionEvent
|
|
5
5
|
import android.view.View
|
|
6
|
+
import android.view.ViewConfiguration
|
|
6
7
|
import android.view.ViewGroup
|
|
7
|
-
import com.
|
|
8
|
+
import com.facebook.react.views.textinput.ReactEditText
|
|
8
9
|
|
|
9
10
|
class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
10
11
|
private var shouldActivateOnStart = false
|
|
11
|
-
|
|
12
|
+
var disallowInterruption = false
|
|
13
|
+
private set
|
|
14
|
+
|
|
15
|
+
private var hook: NativeViewGestureHandlerHook = defaultHook
|
|
12
16
|
|
|
13
17
|
init {
|
|
14
18
|
setShouldCancelWhenOutside(true)
|
|
@@ -34,13 +38,17 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
|
|
41
|
+
// if the gesture is marked by user as simultaneous with other or the hook return true
|
|
42
|
+
if (super.shouldRecognizeSimultaneously(handler) || hook.shouldRecognizeSimultaneously(handler)) {
|
|
43
|
+
return true
|
|
44
|
+
}
|
|
45
|
+
|
|
37
46
|
if (handler is NativeViewGestureHandler) {
|
|
38
47
|
// Special case when the peer handler is also an instance of NativeViewGestureHandler:
|
|
39
48
|
// For the `disallowInterruption` to work correctly we need to check the property when
|
|
40
49
|
// accessed as a peer, because simultaneous recognizers can be set on either side of the
|
|
41
50
|
// connection.
|
|
42
|
-
|
|
43
|
-
if (nativeWrapper.state == STATE_ACTIVE && nativeWrapper.disallowInterruption) {
|
|
51
|
+
if (handler.state == STATE_ACTIVE && handler.disallowInterruption) {
|
|
44
52
|
// other handler is active and it disallows interruption, we don't want to get into its way
|
|
45
53
|
return false
|
|
46
54
|
}
|
|
@@ -52,7 +60,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
52
60
|
// as it means the other handler has turned active and returning `true` would prevent it from
|
|
53
61
|
// interrupting the current handler
|
|
54
62
|
false
|
|
55
|
-
} else state == STATE_ACTIVE && canBeInterrupted
|
|
63
|
+
} else state == STATE_ACTIVE && canBeInterrupted && (!hook.shouldCancelRootViewGestureHandlerIfNecessary() || handler.tag > 0)
|
|
56
64
|
// otherwise we can only return `true` if already in an active state
|
|
57
65
|
}
|
|
58
66
|
|
|
@@ -60,19 +68,10 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
60
68
|
return !disallowInterruption
|
|
61
69
|
}
|
|
62
70
|
|
|
63
|
-
|
|
64
|
-
val view = view
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return true
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
private fun afterGestureEnd() {
|
|
73
|
-
val view = view
|
|
74
|
-
if (view is StateChangeHook) {
|
|
75
|
-
view.afterGestureEnd()
|
|
71
|
+
override fun onPrepare() {
|
|
72
|
+
when (val view = view) {
|
|
73
|
+
is NativeViewGestureHandlerHook -> this.hook = view
|
|
74
|
+
is ReactEditText -> this.hook = EditTextHook(this, view)
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
|
|
@@ -84,7 +83,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
84
83
|
activate()
|
|
85
84
|
}
|
|
86
85
|
end()
|
|
87
|
-
afterGestureEnd()
|
|
86
|
+
hook.afterGestureEnd(event)
|
|
88
87
|
} else if (state == STATE_UNDETERMINED || state == STATE_BEGAN) {
|
|
89
88
|
when {
|
|
90
89
|
shouldActivateOnStart -> {
|
|
@@ -96,8 +95,11 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
96
95
|
view.onTouchEvent(event)
|
|
97
96
|
activate()
|
|
98
97
|
}
|
|
98
|
+
hook.wantsToHandleEventBeforeActivation() -> {
|
|
99
|
+
hook.handleEventBeforeActivation(event)
|
|
100
|
+
}
|
|
99
101
|
state != STATE_BEGAN -> {
|
|
100
|
-
if (
|
|
102
|
+
if (hook.canBegin()) {
|
|
101
103
|
begin()
|
|
102
104
|
} else {
|
|
103
105
|
cancel()
|
|
@@ -117,13 +119,93 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
|
|
|
117
119
|
view!!.onTouchEvent(event)
|
|
118
120
|
}
|
|
119
121
|
|
|
122
|
+
override fun onReset() {
|
|
123
|
+
this.hook = defaultHook
|
|
124
|
+
}
|
|
125
|
+
|
|
120
126
|
companion object {
|
|
121
127
|
private fun tryIntercept(view: View, event: MotionEvent) =
|
|
122
128
|
view is ViewGroup && view.onInterceptTouchEvent(event)
|
|
129
|
+
|
|
130
|
+
private val defaultHook = object : NativeViewGestureHandlerHook {}
|
|
123
131
|
}
|
|
124
132
|
|
|
125
|
-
interface
|
|
126
|
-
|
|
127
|
-
|
|
133
|
+
interface NativeViewGestureHandlerHook {
|
|
134
|
+
/**
|
|
135
|
+
* Called when gesture is in the UNDETERMINED state, shouldActivateOnStart is set to false,
|
|
136
|
+
* and both tryIntercept and wantsToHandleEventBeforeActivation returned false.
|
|
137
|
+
*
|
|
138
|
+
* @return Boolean value signalling whether the handler can transition to the BEGAN state. If false
|
|
139
|
+
* the gesture will be cancelled.
|
|
140
|
+
*/
|
|
141
|
+
fun canBegin() = true
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Called after the gesture transitions to the END state.
|
|
145
|
+
*/
|
|
146
|
+
fun afterGestureEnd(event: MotionEvent) = Unit
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @return Boolean value signalling whether the gesture can be recognized simultaneously with
|
|
150
|
+
* other (handler). Returning false doesn't necessarily prevent it from happening.
|
|
151
|
+
*/
|
|
152
|
+
fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) = false
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* shouldActivateOnStart and tryIntercept have priority over this method
|
|
156
|
+
*
|
|
157
|
+
* @return Boolean value signalling if the hook wants to handle events passed to the handler
|
|
158
|
+
* before it activates (after that the events are passed to the underlying view).
|
|
159
|
+
*/
|
|
160
|
+
fun wantsToHandleEventBeforeActivation() = false
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Will be called with events if wantsToHandleEventBeforeActivation returns true.
|
|
164
|
+
*/
|
|
165
|
+
fun handleEventBeforeActivation(event: MotionEvent) = Unit
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @return Boolean value indicating whether the RootViewGestureHandler should be cancelled
|
|
169
|
+
* by this one.
|
|
170
|
+
*/
|
|
171
|
+
fun shouldCancelRootViewGestureHandlerIfNecessary() = false
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private class EditTextHook(
|
|
175
|
+
private val handler: NativeViewGestureHandler,
|
|
176
|
+
private val editText: ReactEditText
|
|
177
|
+
) : NativeViewGestureHandlerHook {
|
|
178
|
+
private var startX = 0f
|
|
179
|
+
private var startY = 0f
|
|
180
|
+
private var touchSlopSquared: Int
|
|
181
|
+
|
|
182
|
+
init {
|
|
183
|
+
val vc = ViewConfiguration.get(editText.context)
|
|
184
|
+
touchSlopSquared = vc.scaledTouchSlop * vc.scaledTouchSlop
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
override fun afterGestureEnd(event: MotionEvent) {
|
|
188
|
+
if ((event.x - startX) * (event.x - startX) + (event.y - startY) * (event.y - startY) < touchSlopSquared) {
|
|
189
|
+
editText.requestFocusFromJS()
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// recognize alongside every handler besides RootViewGestureHandler, which is a private inner class
|
|
194
|
+
// of RNGestureHandlerRootHelper so no explicit type checks, but its tag is always negative
|
|
195
|
+
// also if other handler is NativeViewGestureHandler then don't override the default implementation
|
|
196
|
+
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) =
|
|
197
|
+
handler.tag > 0 && handler !is NativeViewGestureHandler
|
|
198
|
+
|
|
199
|
+
override fun wantsToHandleEventBeforeActivation() = true
|
|
200
|
+
|
|
201
|
+
override fun handleEventBeforeActivation(event: MotionEvent) {
|
|
202
|
+
handler.activate()
|
|
203
|
+
editText.onTouchEvent(event)
|
|
204
|
+
|
|
205
|
+
startX = event.x
|
|
206
|
+
startY = event.y
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
override fun shouldCancelRootViewGestureHandlerIfNecessary() = true
|
|
128
210
|
}
|
|
129
211
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
package com.swmansion.gesturehandler
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.os.Handler
|
|
5
|
+
import android.os.Looper
|
|
4
6
|
import android.view.MotionEvent
|
|
5
7
|
import android.view.VelocityTracker
|
|
6
8
|
import android.view.ViewConfiguration
|
|
@@ -40,6 +42,9 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
40
42
|
private var lastY = 0f
|
|
41
43
|
private var velocityTracker: VelocityTracker? = null
|
|
42
44
|
private var averageTouches = false
|
|
45
|
+
private var activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
|
|
46
|
+
private val activateDelayed = Runnable { activate() }
|
|
47
|
+
private var handler: Handler? = null
|
|
43
48
|
|
|
44
49
|
/**
|
|
45
50
|
* On Android when there are multiple pointers on the screen pan gestures most often just consider
|
|
@@ -54,7 +59,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
54
59
|
* position of all the fingers will remain still while doing a rotation gesture.
|
|
55
60
|
*/
|
|
56
61
|
init {
|
|
57
|
-
val vc = ViewConfiguration.get(context)
|
|
62
|
+
val vc = ViewConfiguration.get(context!!)
|
|
58
63
|
val touchSlop = vc.scaledTouchSlop
|
|
59
64
|
defaultMinDistSq = (touchSlop * touchSlop).toFloat()
|
|
60
65
|
minDistSq = defaultMinDistSq
|
|
@@ -76,6 +81,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
76
81
|
minDistSq = defaultMinDistSq
|
|
77
82
|
minPointers = DEFAULT_MIN_POINTERS
|
|
78
83
|
maxPointers = DEFAULT_MAX_POINTERS
|
|
84
|
+
activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
|
|
79
85
|
averageTouches = false
|
|
80
86
|
}
|
|
81
87
|
|
|
@@ -127,6 +133,10 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
127
133
|
this.averageTouches = averageTouches
|
|
128
134
|
}
|
|
129
135
|
|
|
136
|
+
fun setActivateAfterLongPress(time: Long) = apply {
|
|
137
|
+
this.activateAfterLongPress = time
|
|
138
|
+
}
|
|
139
|
+
|
|
130
140
|
/**
|
|
131
141
|
* @param minVelocity in pixels per second
|
|
132
142
|
*/
|
|
@@ -177,13 +187,18 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
177
187
|
|
|
178
188
|
private fun shouldFail(): Boolean {
|
|
179
189
|
val dx = lastX - startX + offsetX
|
|
190
|
+
val dy = lastY - startY + offsetY
|
|
191
|
+
|
|
192
|
+
if (activateAfterLongPress > 0 && dx * dx + dy * dy > defaultMinDistSq) {
|
|
193
|
+
handler?.removeCallbacksAndMessages(null)
|
|
194
|
+
return true
|
|
195
|
+
}
|
|
180
196
|
if (failOffsetXStart != MAX_VALUE_IGNORE && dx < failOffsetXStart) {
|
|
181
197
|
return true
|
|
182
198
|
}
|
|
183
199
|
if (failOffsetXEnd != MIN_VALUE_IGNORE && dx > failOffsetXEnd) {
|
|
184
200
|
return true
|
|
185
201
|
}
|
|
186
|
-
val dy = lastY - startY + offsetY
|
|
187
202
|
if (failOffsetYStart != MAX_VALUE_IGNORE && dy < failOffsetYStart) {
|
|
188
203
|
return true
|
|
189
204
|
}
|
|
@@ -216,6 +231,13 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
216
231
|
velocityTracker = VelocityTracker.obtain()
|
|
217
232
|
addVelocityMovement(velocityTracker, event)
|
|
218
233
|
begin()
|
|
234
|
+
|
|
235
|
+
if (activateAfterLongPress > 0) {
|
|
236
|
+
if (handler == null) {
|
|
237
|
+
handler = Handler(Looper.getMainLooper())
|
|
238
|
+
}
|
|
239
|
+
handler!!.postDelayed(activateDelayed, activateAfterLongPress)
|
|
240
|
+
}
|
|
219
241
|
} else if (velocityTracker != null) {
|
|
220
242
|
addVelocityMovement(velocityTracker, event)
|
|
221
243
|
velocityTracker!!.computeCurrentVelocity(1000)
|
|
@@ -257,7 +279,12 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
257
279
|
super.activate(force)
|
|
258
280
|
}
|
|
259
281
|
|
|
282
|
+
override fun onCancel() {
|
|
283
|
+
handler?.removeCallbacksAndMessages(null)
|
|
284
|
+
}
|
|
285
|
+
|
|
260
286
|
override fun onReset() {
|
|
287
|
+
handler?.removeCallbacksAndMessages(null)
|
|
261
288
|
velocityTracker?.let {
|
|
262
289
|
it.recycle()
|
|
263
290
|
velocityTracker = null
|
|
@@ -274,6 +301,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
|
|
|
274
301
|
private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
|
|
275
302
|
private const val DEFAULT_MIN_POINTERS = 1
|
|
276
303
|
private const val DEFAULT_MAX_POINTERS = 10
|
|
304
|
+
private const val DEFAULT_ACTIVATE_AFTER_LONG_PRESS = 0L
|
|
277
305
|
|
|
278
306
|
/**
|
|
279
307
|
* This method adds movement to {@class VelocityTracker} first resetting offset of the event so
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.swmansion.gesturehandler
|
|
2
2
|
|
|
3
3
|
import android.os.Handler
|
|
4
|
+
import android.os.Looper
|
|
4
5
|
import android.view.MotionEvent
|
|
5
6
|
import com.swmansion.gesturehandler.GestureUtils.getLastPointerX
|
|
6
7
|
import com.swmansion.gesturehandler.GestureUtils.getLastPointerY
|
|
@@ -70,7 +71,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
|
|
|
70
71
|
|
|
71
72
|
private fun startTap() {
|
|
72
73
|
if (handler == null) {
|
|
73
|
-
handler = Handler() // TODO: lazy init (handle else branch correctly)
|
|
74
|
+
handler = Handler(Looper.getMainLooper()) // TODO: lazy init (handle else branch correctly)
|
|
74
75
|
} else {
|
|
75
76
|
handler!!.removeCallbacksAndMessages(null)
|
|
76
77
|
}
|
|
@@ -79,7 +80,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
|
|
|
79
80
|
|
|
80
81
|
private fun endTap() {
|
|
81
82
|
if (handler == null) {
|
|
82
|
-
handler = Handler()
|
|
83
|
+
handler = Handler(Looper.getMainLooper())
|
|
83
84
|
} else {
|
|
84
85
|
handler!!.removeCallbacksAndMessages(null)
|
|
85
86
|
}
|
package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java
CHANGED
|
@@ -9,7 +9,7 @@ import com.facebook.soloader.SoLoader;
|
|
|
9
9
|
public class RNGestureHandlerComponentsRegistry {
|
|
10
10
|
static {
|
|
11
11
|
SoLoader.loadLibrary("fabricjni");
|
|
12
|
-
SoLoader.loadLibrary("
|
|
12
|
+
SoLoader.loadLibrary("gesturehandler");
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
@DoNotStrip private final HybridData mHybridData;
|