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,348 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler.react
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.annotation.TargetApi
|
|
5
|
+
import android.content.Context
|
|
6
|
+
import android.content.res.ColorStateList
|
|
7
|
+
import android.graphics.Color
|
|
8
|
+
import android.graphics.drawable.Drawable
|
|
9
|
+
import android.graphics.drawable.LayerDrawable
|
|
10
|
+
import android.graphics.drawable.PaintDrawable
|
|
11
|
+
import android.graphics.drawable.RippleDrawable
|
|
12
|
+
import android.os.Build
|
|
13
|
+
import android.util.TypedValue
|
|
14
|
+
import android.view.MotionEvent
|
|
15
|
+
import android.view.View
|
|
16
|
+
import android.view.View.OnClickListener
|
|
17
|
+
import android.view.ViewGroup
|
|
18
|
+
import androidx.core.view.children
|
|
19
|
+
import com.facebook.react.bridge.SoftAssertions
|
|
20
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
21
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
22
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
23
|
+
import com.facebook.react.uimanager.ViewProps
|
|
24
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
25
|
+
import com.swmansion.gesturehandler.NativeViewGestureHandler
|
|
26
|
+
import com.swmansion.gesturehandler.react.RNGestureHandlerButtonViewManager.ButtonViewGroup
|
|
27
|
+
|
|
28
|
+
class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>() {
|
|
29
|
+
override fun getName() = "RNGestureHandlerButton"
|
|
30
|
+
|
|
31
|
+
public override fun createViewInstance(context: ThemedReactContext) = ButtonViewGroup(context)
|
|
32
|
+
|
|
33
|
+
@TargetApi(Build.VERSION_CODES.M)
|
|
34
|
+
@ReactProp(name = "foreground")
|
|
35
|
+
fun setForeground(view: ButtonViewGroup, useDrawableOnForeground: Boolean) {
|
|
36
|
+
view.useDrawableOnForeground = useDrawableOnForeground
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@ReactProp(name = "borderless")
|
|
40
|
+
fun setBorderless(view: ButtonViewGroup, useBorderlessDrawable: Boolean) {
|
|
41
|
+
view.useBorderlessDrawable = useBorderlessDrawable
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@ReactProp(name = "enabled")
|
|
45
|
+
fun setEnabled(view: ButtonViewGroup, enabled: Boolean) {
|
|
46
|
+
view.isEnabled = enabled
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@ReactProp(name = ViewProps.BORDER_RADIUS)
|
|
50
|
+
override fun setBorderRadius(view: ButtonViewGroup, borderRadius: Float) {
|
|
51
|
+
view.borderRadius = borderRadius
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@ReactProp(name = "rippleColor")
|
|
55
|
+
fun setRippleColor(view: ButtonViewGroup, rippleColor: Int?) {
|
|
56
|
+
view.rippleColor = rippleColor
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@ReactProp(name = "rippleRadius")
|
|
60
|
+
fun setRippleRadius(view: ButtonViewGroup, rippleRadius: Int?) {
|
|
61
|
+
view.rippleRadius = rippleRadius
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@ReactProp(name = "exclusive")
|
|
65
|
+
fun setExclusive(view: ButtonViewGroup, exclusive: Boolean = true) {
|
|
66
|
+
view.exclusive = exclusive
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
override fun onAfterUpdateTransaction(view: ButtonViewGroup) {
|
|
70
|
+
view.updateBackground()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
class ButtonViewGroup(context: Context?) : ViewGroup(context),
|
|
74
|
+
NativeViewGestureHandler.StateChangeHook {
|
|
75
|
+
// Using object because of handling null representing no value set.
|
|
76
|
+
var rippleColor: Int? = null
|
|
77
|
+
set(color) = withBackgroundUpdate {
|
|
78
|
+
field = color
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var rippleRadius: Int? = null
|
|
82
|
+
set(radius) = withBackgroundUpdate {
|
|
83
|
+
field = radius
|
|
84
|
+
}
|
|
85
|
+
var useDrawableOnForeground = false
|
|
86
|
+
set(useForeground) = withBackgroundUpdate {
|
|
87
|
+
field = useForeground
|
|
88
|
+
}
|
|
89
|
+
var useBorderlessDrawable = false
|
|
90
|
+
var borderRadius = 0f
|
|
91
|
+
set(radius) = withBackgroundUpdate {
|
|
92
|
+
field = radius * resources.displayMetrics.density
|
|
93
|
+
}
|
|
94
|
+
var exclusive = true
|
|
95
|
+
|
|
96
|
+
private var _backgroundColor = Color.TRANSPARENT
|
|
97
|
+
private var needBackgroundUpdate = false
|
|
98
|
+
private var lastEventTime = -1L
|
|
99
|
+
private var lastAction = -1
|
|
100
|
+
|
|
101
|
+
var isTouched = false
|
|
102
|
+
|
|
103
|
+
init {
|
|
104
|
+
// we attach empty click listener to trigger tap sounds (see View#performClick())
|
|
105
|
+
setOnClickListener(dummyClickListener)
|
|
106
|
+
isClickable = true
|
|
107
|
+
isFocusable = true
|
|
108
|
+
needBackgroundUpdate = true
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private inline fun withBackgroundUpdate(block: () -> Unit) {
|
|
112
|
+
block()
|
|
113
|
+
needBackgroundUpdate = true
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
override fun setBackgroundColor(color: Int) = withBackgroundUpdate {
|
|
117
|
+
_backgroundColor = color
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private fun applyRippleEffectWhenNeeded(selectable: Drawable): Drawable {
|
|
121
|
+
val rippleColor = rippleColor
|
|
122
|
+
if (rippleColor != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && selectable is RippleDrawable) {
|
|
123
|
+
val states = arrayOf(intArrayOf(android.R.attr.state_enabled))
|
|
124
|
+
val colors = intArrayOf(rippleColor)
|
|
125
|
+
val colorStateList = ColorStateList(states, colors)
|
|
126
|
+
selectable.setColor(colorStateList)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
val rippleRadius = rippleRadius
|
|
130
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && rippleRadius != null && selectable is RippleDrawable) {
|
|
131
|
+
selectable.radius = PixelUtil.toPixelFromDIP(rippleRadius.toFloat()).toInt()
|
|
132
|
+
}
|
|
133
|
+
return selectable
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
|
|
137
|
+
if (super.onInterceptTouchEvent(ev)) {
|
|
138
|
+
return true
|
|
139
|
+
}
|
|
140
|
+
// We call `onTouchEvent` and wait until button changes state to `pressed`, if it's pressed
|
|
141
|
+
// we return true so that the gesture handler can activate.
|
|
142
|
+
onTouchEvent(ev)
|
|
143
|
+
return isPressed
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Buttons in RN are wrapped in NativeViewGestureHandler which manages
|
|
148
|
+
* calling onTouchEvent after activation of the handler. Problem is, in order to verify that
|
|
149
|
+
* underlying button implementation is interested in receiving touches we have to call onTouchEvent
|
|
150
|
+
* and check if button is pressed.
|
|
151
|
+
*
|
|
152
|
+
* This leads to invoking onTouchEvent twice which isn't idempotent in View - it calls OnClickListener
|
|
153
|
+
* and plays sound effect if OnClickListener was set.
|
|
154
|
+
*
|
|
155
|
+
* To mitigate this behavior we use lastEventTime and lastAction variables to check that we already handled
|
|
156
|
+
* the event in [onInterceptTouchEvent]. We assume here that different events
|
|
157
|
+
* will have different event times or actions.
|
|
158
|
+
* Events with same event time can occur on some devices for different actions.
|
|
159
|
+
* (e.g. move and up in one gesture; move and cancel)
|
|
160
|
+
*
|
|
161
|
+
* Reference:
|
|
162
|
+
* [com.swmansion.gesturehandler.NativeViewGestureHandler.onHandle] */
|
|
163
|
+
@SuppressLint("ClickableViewAccessibility")
|
|
164
|
+
override fun onTouchEvent(event: MotionEvent): Boolean {
|
|
165
|
+
val eventTime = event.eventTime
|
|
166
|
+
val action = event.action
|
|
167
|
+
// always true when lastEventTime or lastAction have default value (-1)
|
|
168
|
+
if (lastEventTime != eventTime || lastAction != action) {
|
|
169
|
+
lastEventTime = eventTime
|
|
170
|
+
lastAction = action
|
|
171
|
+
return super.onTouchEvent(event)
|
|
172
|
+
}
|
|
173
|
+
return false
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
fun updateBackground() {
|
|
177
|
+
if (!needBackgroundUpdate) {
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
needBackgroundUpdate = false
|
|
181
|
+
|
|
182
|
+
if (_backgroundColor == Color.TRANSPARENT) {
|
|
183
|
+
// reset background
|
|
184
|
+
background = null
|
|
185
|
+
}
|
|
186
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
187
|
+
// reset foreground
|
|
188
|
+
foreground = null
|
|
189
|
+
}
|
|
190
|
+
if (useDrawableOnForeground && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
191
|
+
foreground = applyRippleEffectWhenNeeded(createSelectableDrawable())
|
|
192
|
+
if (_backgroundColor != Color.TRANSPARENT) {
|
|
193
|
+
setBackgroundColor(_backgroundColor)
|
|
194
|
+
}
|
|
195
|
+
} else if (_backgroundColor == Color.TRANSPARENT && rippleColor == null) {
|
|
196
|
+
background = createSelectableDrawable()
|
|
197
|
+
} else {
|
|
198
|
+
val colorDrawable = PaintDrawable(_backgroundColor)
|
|
199
|
+
val selectable = createSelectableDrawable()
|
|
200
|
+
if (borderRadius != 0f) {
|
|
201
|
+
// Radius-connected lines below ought to be considered
|
|
202
|
+
// as a temporary solution. It do not allow to set
|
|
203
|
+
// different radius on each corner. However, I suppose it's fairly
|
|
204
|
+
// fine for button-related use cases.
|
|
205
|
+
// Therefore it might be used as long as:
|
|
206
|
+
// 1. ReactViewManager is not a generic class with a possibility to handle another ViewGroup
|
|
207
|
+
// 2. There's no way to force native behavior of ReactViewGroup's superclass's onTouchEvent
|
|
208
|
+
colorDrawable.setCornerRadius(borderRadius)
|
|
209
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
|
|
210
|
+
&& selectable is RippleDrawable) {
|
|
211
|
+
val mask = PaintDrawable(Color.WHITE)
|
|
212
|
+
mask.setCornerRadius(borderRadius)
|
|
213
|
+
selectable.setDrawableByLayerId(android.R.id.mask, mask)
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
applyRippleEffectWhenNeeded(selectable)
|
|
217
|
+
val layerDrawable = LayerDrawable(arrayOf(colorDrawable, selectable))
|
|
218
|
+
background = layerDrawable
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private fun createSelectableDrawable(): Drawable {
|
|
223
|
+
val version = Build.VERSION.SDK_INT
|
|
224
|
+
val identifier = if (useBorderlessDrawable && version >= 21) SELECTABLE_ITEM_BACKGROUND_BORDERLESS else SELECTABLE_ITEM_BACKGROUND
|
|
225
|
+
val attrID = getAttrId(context, identifier)
|
|
226
|
+
context.theme.resolveAttribute(attrID, resolveOutValue, true)
|
|
227
|
+
return if (version >= 21) {
|
|
228
|
+
resources.getDrawable(resolveOutValue.resourceId, context.theme)
|
|
229
|
+
} else {
|
|
230
|
+
@Suppress("Deprecation")
|
|
231
|
+
resources.getDrawable(resolveOutValue.resourceId)
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
236
|
+
// No-op
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
override fun drawableHotspotChanged(x: Float, y: Float) {
|
|
240
|
+
if (responder == null || responder === this) {
|
|
241
|
+
super.drawableHotspotChanged(x, y)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
override fun canStart(): Boolean {
|
|
246
|
+
val isResponder = tryGrabbingResponder()
|
|
247
|
+
if (isResponder) {
|
|
248
|
+
isTouched = true
|
|
249
|
+
}
|
|
250
|
+
return isResponder
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
override fun afterGestureEnd() {
|
|
254
|
+
tryFreeingResponder()
|
|
255
|
+
isTouched = false
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private fun tryGrabbingResponder(): Boolean {
|
|
259
|
+
if (isChildTouched()) {
|
|
260
|
+
return false
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (responder == null) {
|
|
264
|
+
responder = this
|
|
265
|
+
return true
|
|
266
|
+
}
|
|
267
|
+
return if (exclusive) {
|
|
268
|
+
responder === this
|
|
269
|
+
} else {
|
|
270
|
+
!(responder?.exclusive ?: false)
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
private fun tryFreeingResponder() {
|
|
275
|
+
if (responder === this) {
|
|
276
|
+
responder = null
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
private fun isChildTouched(children: Sequence<View> = this.children): Boolean {
|
|
281
|
+
for (child in children) {
|
|
282
|
+
if (child is ButtonViewGroup && (child.isTouched || child.isPressed)) {
|
|
283
|
+
return true
|
|
284
|
+
} else if (child is ViewGroup) {
|
|
285
|
+
return isChildTouched(child.children)
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return false
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
override fun setPressed(pressed: Boolean) {
|
|
293
|
+
// there is a possibility of this method being called before NativeViewGestureHandler has
|
|
294
|
+
// opportunity to call canStart, in that case we need to grab responder in case the gesture
|
|
295
|
+
// will activate
|
|
296
|
+
// when canStart is called eventually, tryGrabbingResponder will return true if the button
|
|
297
|
+
// already is a responder
|
|
298
|
+
if (pressed) {
|
|
299
|
+
tryGrabbingResponder()
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// button can be pressed alongside other button if both are non-exclusive and it doesn't have
|
|
303
|
+
// any pressed children (to prevent pressing the parent when children is pressed).
|
|
304
|
+
val canBePressedAlongsideOther = !exclusive && responder?.exclusive != true && !isChildTouched()
|
|
305
|
+
|
|
306
|
+
if (!pressed || responder === this || canBePressedAlongsideOther) {
|
|
307
|
+
// we set pressed state only for current responder or any non-exclusive button when responder
|
|
308
|
+
// is null or non-exclusive, assuming it doesn't have pressed children
|
|
309
|
+
super.setPressed(pressed)
|
|
310
|
+
isTouched = pressed
|
|
311
|
+
}
|
|
312
|
+
if (!pressed && responder === this) {
|
|
313
|
+
// if the responder is no longer pressed we release button responder
|
|
314
|
+
responder = null
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
override fun dispatchDrawableHotspotChanged(x: Float, y: Float) {
|
|
319
|
+
// No-op
|
|
320
|
+
// by default Viewgroup would pass hotspot change events
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
companion object {
|
|
324
|
+
const val SELECTABLE_ITEM_BACKGROUND = "selectableItemBackground"
|
|
325
|
+
const val SELECTABLE_ITEM_BACKGROUND_BORDERLESS = "selectableItemBackgroundBorderless"
|
|
326
|
+
|
|
327
|
+
var resolveOutValue = TypedValue()
|
|
328
|
+
var responder: ButtonViewGroup? = null
|
|
329
|
+
var dummyClickListener = OnClickListener { }
|
|
330
|
+
|
|
331
|
+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
332
|
+
private fun getAttrId(context: Context, attr: String): Int {
|
|
333
|
+
SoftAssertions.assertNotNull(attr)
|
|
334
|
+
return when (attr) {
|
|
335
|
+
SELECTABLE_ITEM_BACKGROUND -> {
|
|
336
|
+
R.attr.selectableItemBackground
|
|
337
|
+
}
|
|
338
|
+
SELECTABLE_ITEM_BACKGROUND_BORDERLESS -> {
|
|
339
|
+
R.attr.selectableItemBackgroundBorderless
|
|
340
|
+
}
|
|
341
|
+
else -> {
|
|
342
|
+
context.resources.getIdentifier(attr, "attr", "android")
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler.react
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.os.Bundle
|
|
5
|
+
import android.util.AttributeSet
|
|
6
|
+
import android.view.MotionEvent
|
|
7
|
+
import com.facebook.react.ReactInstanceManager
|
|
8
|
+
import com.facebook.react.ReactRootView
|
|
9
|
+
|
|
10
|
+
@Deprecated(message = "Use <GestureHandlerRootView /> component instead. Check gesture handler installation instructions in documentation for more information.")
|
|
11
|
+
class RNGestureHandlerEnabledRootView : ReactRootView {
|
|
12
|
+
private lateinit var _reactInstanceManager: ReactInstanceManager
|
|
13
|
+
private var gestureRootHelper: RNGestureHandlerRootHelper? = null
|
|
14
|
+
|
|
15
|
+
constructor(context: Context?) : super(context) {}
|
|
16
|
+
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {}
|
|
17
|
+
|
|
18
|
+
override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
|
|
19
|
+
gestureRootHelper?.requestDisallowInterceptTouchEvent(disallowIntercept)
|
|
20
|
+
super.requestDisallowInterceptTouchEvent(disallowIntercept)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
|
24
|
+
return if (gestureRootHelper?.dispatchTouchEvent(ev) == true) {
|
|
25
|
+
true
|
|
26
|
+
} else super.dispatchTouchEvent(ev)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* This method is used to enable root view to start processing touch events through the gesture
|
|
31
|
+
* handler library logic. Unless this method is called (which happens as a result of instantiating
|
|
32
|
+
* new gesture handler from JS) the root view component will just proxy all touch related methods
|
|
33
|
+
* to its superclass. Thus in the "disabled" state all touch related events will fallback to
|
|
34
|
+
* default RN behavior.
|
|
35
|
+
*/
|
|
36
|
+
fun initialize() {
|
|
37
|
+
check(gestureRootHelper == null) { "GestureHandler already initialized for root view $this" }
|
|
38
|
+
gestureRootHelper = RNGestureHandlerRootHelper(
|
|
39
|
+
_reactInstanceManager.currentReactContext!!, this)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fun tearDown() {
|
|
43
|
+
gestureRootHelper?.let {
|
|
44
|
+
it.tearDown()
|
|
45
|
+
gestureRootHelper = null
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
override fun startReactApplication(
|
|
50
|
+
reactInstanceManager: ReactInstanceManager,
|
|
51
|
+
moduleName: String,
|
|
52
|
+
initialProperties: Bundle?,
|
|
53
|
+
) {
|
|
54
|
+
super.startReactApplication(reactInstanceManager, moduleName, initialProperties)
|
|
55
|
+
_reactInstanceManager = reactInstanceManager
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler.react
|
|
2
|
+
|
|
3
|
+
import androidx.core.util.Pools
|
|
4
|
+
import com.facebook.react.bridge.Arguments
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.events.Event
|
|
7
|
+
import com.facebook.react.uimanager.events.RCTEventEmitter
|
|
8
|
+
import com.swmansion.gesturehandler.GestureHandler
|
|
9
|
+
|
|
10
|
+
class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>() {
|
|
11
|
+
private var extraData: WritableMap? = null
|
|
12
|
+
private var coalescingKey: Short = 0
|
|
13
|
+
private fun <T : GestureHandler<T>> init(
|
|
14
|
+
handler: T,
|
|
15
|
+
dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
|
|
16
|
+
) {
|
|
17
|
+
super.init(handler.view!!.id)
|
|
18
|
+
extraData = createEventData(handler, dataExtractor)
|
|
19
|
+
coalescingKey = handler.eventCoalescingKey
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun onDispose() {
|
|
23
|
+
extraData = null
|
|
24
|
+
EVENTS_POOL.release(this)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun getEventName() = EVENT_NAME
|
|
28
|
+
|
|
29
|
+
override fun canCoalesce() = true
|
|
30
|
+
|
|
31
|
+
override fun getCoalescingKey() = coalescingKey
|
|
32
|
+
|
|
33
|
+
override fun dispatch(rctEventEmitter: RCTEventEmitter) {
|
|
34
|
+
rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
companion object {
|
|
38
|
+
const val EVENT_NAME = "onGestureHandlerEvent"
|
|
39
|
+
private const val TOUCH_EVENTS_POOL_SIZE = 7 // magic
|
|
40
|
+
private val EVENTS_POOL = Pools.SynchronizedPool<RNGestureHandlerEvent>(TOUCH_EVENTS_POOL_SIZE)
|
|
41
|
+
|
|
42
|
+
fun <T : GestureHandler<T>> obtain(
|
|
43
|
+
handler: T,
|
|
44
|
+
dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
|
|
45
|
+
): RNGestureHandlerEvent =
|
|
46
|
+
(EVENTS_POOL.acquire() ?: RNGestureHandlerEvent()).apply {
|
|
47
|
+
init(handler, dataExtractor)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fun <T: GestureHandler<T>> createEventData(
|
|
51
|
+
handler: T,
|
|
52
|
+
dataExtractor: RNGestureHandlerEventDataExtractor<T>?
|
|
53
|
+
): WritableMap = Arguments.createMap().apply {
|
|
54
|
+
dataExtractor?.extractEventData(handler, this)
|
|
55
|
+
putInt("handlerTag", handler.tag)
|
|
56
|
+
putInt("state", handler.state)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler.react
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.WritableMap
|
|
4
|
+
import com.swmansion.gesturehandler.GestureHandler
|
|
5
|
+
|
|
6
|
+
interface RNGestureHandlerEventDataExtractor<T : GestureHandler<T>> {
|
|
7
|
+
fun extractEventData(handler: T, eventData: WritableMap)
|
|
8
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
package com.swmansion.gesturehandler.react
|
|
2
|
+
|
|
3
|
+
import android.util.SparseArray
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
5
|
+
import com.swmansion.gesturehandler.GestureHandler
|
|
6
|
+
import com.swmansion.gesturehandler.GestureHandlerInteractionController
|
|
7
|
+
|
|
8
|
+
class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
|
|
9
|
+
private val waitForRelations = SparseArray<IntArray>()
|
|
10
|
+
private val simultaneousRelations = SparseArray<IntArray>()
|
|
11
|
+
fun dropRelationsForHandlerWithTag(handlerTag: Int) {
|
|
12
|
+
waitForRelations.remove(handlerTag)
|
|
13
|
+
simultaneousRelations.remove(handlerTag)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
private fun convertHandlerTagsArray(config: ReadableMap, key: String): IntArray {
|
|
17
|
+
val array = config.getArray(key)!!
|
|
18
|
+
return IntArray(array.size()).also {
|
|
19
|
+
for (i in it.indices) {
|
|
20
|
+
it[i] = array.getInt(i)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fun configureInteractions(handler: GestureHandler<*>, config: ReadableMap) {
|
|
26
|
+
handler.setInteractionController(this)
|
|
27
|
+
if (config.hasKey(KEY_WAIT_FOR)) {
|
|
28
|
+
val tags = convertHandlerTagsArray(config, KEY_WAIT_FOR)
|
|
29
|
+
waitForRelations.put(handler.tag, tags)
|
|
30
|
+
}
|
|
31
|
+
if (config.hasKey(KEY_SIMULTANEOUS_HANDLERS)) {
|
|
32
|
+
val tags = convertHandlerTagsArray(config, KEY_SIMULTANEOUS_HANDLERS)
|
|
33
|
+
simultaneousRelations.put(handler.tag, tags)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun shouldWaitForHandlerFailure(handler: GestureHandler<*>, otherHandler: GestureHandler<*>) =
|
|
38
|
+
waitForRelations[handler.tag]?.any { tag -> tag == otherHandler.tag } ?: false
|
|
39
|
+
|
|
40
|
+
override fun shouldRequireHandlerToWaitForFailure(
|
|
41
|
+
handler: GestureHandler<*>,
|
|
42
|
+
otherHandler: GestureHandler<*>,
|
|
43
|
+
) = false
|
|
44
|
+
|
|
45
|
+
override fun shouldHandlerBeCancelledBy(handler: GestureHandler<*>, otherHandler: GestureHandler<*>) = false
|
|
46
|
+
|
|
47
|
+
override fun shouldRecognizeSimultaneously(
|
|
48
|
+
handler: GestureHandler<*>,
|
|
49
|
+
otherHandler: GestureHandler<*>,
|
|
50
|
+
) = simultaneousRelations[handler.tag]?.any { tag -> tag == otherHandler.tag } ?: false
|
|
51
|
+
|
|
52
|
+
fun reset() {
|
|
53
|
+
waitForRelations.clear()
|
|
54
|
+
simultaneousRelations.clear()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
companion object {
|
|
58
|
+
private const val KEY_WAIT_FOR = "waitFor"
|
|
59
|
+
private const val KEY_SIMULTANEOUS_HANDLERS = "simultaneousHandlers"
|
|
60
|
+
}
|
|
61
|
+
}
|