react-native-gesture-handler 2.1.2 → 2.3.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.
Files changed (250) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -3
  3. package/RNGestureHandler.podspec +27 -3
  4. package/android/build.gradle +82 -9
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +47 -12
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +50 -14
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +7 -4
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +8 -8
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +6 -4
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/ScaleGestureDetector.java +558 -0
  11. package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +29 -0
  12. package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +12 -0
  13. package/android/src/main/AndroidManifest.xml +1 -1
  14. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +29 -0
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +29 -10
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +119 -55
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +9 -4
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +17 -2
  20. package/android/src/main/jni/Android.mk +53 -0
  21. package/android/src/main/jni/OnLoad.cpp +9 -0
  22. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +71 -0
  23. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +34 -0
  24. package/android/src/main/jni/cpp-adapter.cpp +41 -0
  25. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +47 -0
  26. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +22 -0
  27. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +25 -0
  28. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +16 -0
  29. package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +13 -0
  30. package/ios/Handlers/RNFlingHandler.m +2 -0
  31. package/ios/Handlers/RNPanHandler.m +2 -0
  32. package/ios/Handlers/RNPinchHandler.m +2 -0
  33. package/ios/Handlers/RNRotationHandler.m +2 -0
  34. package/ios/RNGestureHandler.h +3 -8
  35. package/ios/RNGestureHandler.m +2 -10
  36. package/ios/RNGestureHandlerActionType.h +8 -0
  37. package/ios/RNGestureHandlerButtonComponentView.h +17 -0
  38. package/ios/RNGestureHandlerButtonComponentView.mm +48 -0
  39. package/ios/RNGestureHandlerButtonManager.h +5 -0
  40. package/ios/RNGestureHandlerButtonManager.m +30 -0
  41. package/ios/RNGestureHandlerManager.h +2 -4
  42. package/ios/{RNGestureHandlerManager.m → RNGestureHandlerManager.mm} +92 -20
  43. package/ios/{RNGestureHandlerModule.m → RNGestureHandlerModule.mm} +91 -36
  44. package/ios/RNGestureHandlerRegistry.h +1 -2
  45. package/ios/RNGestureHandlerRegistry.m +2 -11
  46. package/ios/RNGestureHandlerRootViewComponentView.mm +21 -0
  47. package/lib/commonjs/ActionType.js +15 -0
  48. package/lib/commonjs/ActionType.js.map +1 -0
  49. package/lib/commonjs/GestureHandlerRootView.android.js +6 -6
  50. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  51. package/lib/commonjs/GestureHandlerRootView.js +2 -3
  52. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  53. package/lib/commonjs/RNGestureHandlerModule.js +4 -2
  54. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  55. package/lib/commonjs/RNGestureHandlerModule.web.js +1 -1
  56. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  57. package/lib/commonjs/components/DrawerLayout.js +2 -2
  58. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  59. package/lib/commonjs/components/GestureHandlerButton.js +5 -2
  60. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  61. package/lib/commonjs/components/Swipeable.js +22 -20
  62. package/lib/commonjs/components/Swipeable.js.map +1 -1
  63. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +21 -0
  64. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  65. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +21 -0
  66. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  67. package/lib/commonjs/getShadowNodeFromRef.js +24 -0
  68. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -0
  69. package/lib/commonjs/getShadowNodeFromRef.web.js +15 -0
  70. package/lib/commonjs/getShadowNodeFromRef.web.js.map +1 -0
  71. package/lib/commonjs/handlers/FlingGestureHandler.js +4 -2
  72. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -1
  73. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +8 -4
  74. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  75. package/lib/commonjs/handlers/LongPressGestureHandler.js +4 -2
  76. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  77. package/lib/commonjs/handlers/NativeViewGestureHandler.js +4 -2
  78. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  79. package/lib/commonjs/handlers/PanGestureHandler.js +4 -2
  80. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  81. package/lib/commonjs/handlers/PinchGestureHandler.js +4 -2
  82. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -1
  83. package/lib/commonjs/handlers/RotationGestureHandler.js +4 -2
  84. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -1
  85. package/lib/commonjs/handlers/TapGestureHandler.js +4 -2
  86. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -1
  87. package/lib/commonjs/handlers/createHandler.js +72 -8
  88. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  89. package/lib/commonjs/handlers/createNativeWrapper.js +6 -2
  90. package/lib/commonjs/handlers/createNativeWrapper.js.map +1 -1
  91. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  92. package/lib/commonjs/handlers/gestures/GestureDetector.js +84 -32
  93. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  94. package/lib/commonjs/handlers/gestures/eventReceiver.js +25 -8
  95. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  96. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  97. package/lib/commonjs/handlers/gestures/gesture.js +16 -1
  98. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  99. package/lib/commonjs/handlers/gestures/gestureStateManager.js +7 -4
  100. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  101. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  102. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
  103. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +4 -1
  104. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  105. package/lib/commonjs/handlers/handlersRegistry.js +42 -6
  106. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -1
  107. package/lib/commonjs/index.js +14 -106
  108. package/lib/commonjs/index.js.map +1 -1
  109. package/lib/commonjs/init.js +10 -0
  110. package/lib/commonjs/init.js.map +1 -1
  111. package/lib/commonjs/jestUtils.js +375 -0
  112. package/lib/commonjs/jestUtils.js.map +1 -0
  113. package/lib/commonjs/utils.js +38 -0
  114. package/lib/commonjs/utils.js.map +1 -1
  115. package/lib/module/ActionType.js +7 -0
  116. package/lib/module/ActionType.js.map +1 -0
  117. package/lib/module/GestureHandlerRootView.android.js +5 -6
  118. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  119. package/lib/module/GestureHandlerRootView.js +2 -3
  120. package/lib/module/GestureHandlerRootView.js.map +1 -1
  121. package/lib/module/RNGestureHandlerModule.js +3 -2
  122. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  123. package/lib/module/RNGestureHandlerModule.web.js +1 -1
  124. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  125. package/lib/module/components/DrawerLayout.js +2 -2
  126. package/lib/module/components/DrawerLayout.js.map +1 -1
  127. package/lib/module/components/GestureHandlerButton.js +4 -2
  128. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  129. package/lib/module/components/Swipeable.js +22 -20
  130. package/lib/module/components/Swipeable.js.map +1 -1
  131. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +9 -0
  132. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  133. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +9 -0
  134. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  135. package/lib/module/getShadowNodeFromRef.js +17 -0
  136. package/lib/module/getShadowNodeFromRef.js.map +1 -0
  137. package/lib/module/getShadowNodeFromRef.web.js +8 -0
  138. package/lib/module/getShadowNodeFromRef.web.js.map +1 -0
  139. package/lib/module/handlers/FlingGestureHandler.js +2 -1
  140. package/lib/module/handlers/FlingGestureHandler.js.map +1 -1
  141. package/lib/module/handlers/ForceTouchGestureHandler.js +5 -3
  142. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  143. package/lib/module/handlers/LongPressGestureHandler.js +2 -1
  144. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  145. package/lib/module/handlers/NativeViewGestureHandler.js +2 -1
  146. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  147. package/lib/module/handlers/PanGestureHandler.js +2 -1
  148. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  149. package/lib/module/handlers/PinchGestureHandler.js +2 -1
  150. package/lib/module/handlers/PinchGestureHandler.js.map +1 -1
  151. package/lib/module/handlers/RotationGestureHandler.js +2 -1
  152. package/lib/module/handlers/RotationGestureHandler.js.map +1 -1
  153. package/lib/module/handlers/TapGestureHandler.js +2 -1
  154. package/lib/module/handlers/TapGestureHandler.js.map +1 -1
  155. package/lib/module/handlers/createHandler.js +72 -9
  156. package/lib/module/handlers/createHandler.js.map +1 -1
  157. package/lib/module/handlers/createNativeWrapper.js +6 -2
  158. package/lib/module/handlers/createNativeWrapper.js.map +1 -1
  159. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  160. package/lib/module/handlers/gestures/GestureDetector.js +79 -32
  161. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  162. package/lib/module/handlers/gestures/eventReceiver.js +25 -7
  163. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  164. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  165. package/lib/module/handlers/gestures/gesture.js +16 -1
  166. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  167. package/lib/module/handlers/gestures/gestureStateManager.js +6 -4
  168. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  169. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  170. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
  171. package/lib/module/handlers/gestures/reanimatedWrapper.js +2 -1
  172. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  173. package/lib/module/handlers/handlersRegistry.js +34 -6
  174. package/lib/module/handlers/handlersRegistry.js.map +1 -1
  175. package/lib/module/index.js +1 -11
  176. package/lib/module/index.js.map +1 -1
  177. package/lib/module/init.js +6 -0
  178. package/lib/module/init.js.map +1 -1
  179. package/lib/module/jestUtils.js +350 -0
  180. package/lib/module/jestUtils.js.map +1 -0
  181. package/lib/module/utils.js +28 -0
  182. package/lib/module/utils.js.map +1 -1
  183. package/lib/typescript/ActionType.d.ts +7 -0
  184. package/lib/typescript/GestureHandlerRootView.android.d.ts +5 -2
  185. package/lib/typescript/GestureHandlerRootView.d.ts +1 -1
  186. package/lib/typescript/RNGestureHandlerModule.d.ts +3 -1
  187. package/lib/typescript/RNGestureHandlerModule.web.d.ts +2 -1
  188. package/lib/typescript/components/GestureHandlerButton.d.ts +2 -2
  189. package/lib/typescript/components/Swipeable.d.ts +12 -4
  190. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -0
  191. package/lib/typescript/getShadowNodeFromRef.web.d.ts +1 -0
  192. package/lib/typescript/handlers/FlingGestureHandler.d.ts +1 -0
  193. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -1
  194. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +3 -2
  195. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -0
  196. package/lib/typescript/handlers/PanGestureHandler.d.ts +3 -2
  197. package/lib/typescript/handlers/PinchGestureHandler.d.ts +1 -0
  198. package/lib/typescript/handlers/RotationGestureHandler.d.ts +1 -0
  199. package/lib/typescript/handlers/TapGestureHandler.d.ts +1 -0
  200. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +2 -4
  201. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +4 -1
  202. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +1 -2
  203. package/lib/typescript/handlers/gestures/gesture.d.ts +5 -0
  204. package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -2
  205. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +1 -2
  206. package/lib/typescript/handlers/handlersRegistry.d.ts +11 -3
  207. package/lib/typescript/index.d.ts +15 -11
  208. package/lib/typescript/jestUtils.d.ts +28 -0
  209. package/lib/typescript/utils.d.ts +6 -0
  210. package/lib/typescript/web/constants.d.ts +0 -1
  211. package/package.json +39 -16
  212. package/src/ActionType.ts +9 -0
  213. package/src/GestureHandlerRootView.android.tsx +14 -14
  214. package/src/GestureHandlerRootView.tsx +4 -4
  215. package/src/RNGestureHandlerModule.ts +11 -6
  216. package/src/RNGestureHandlerModule.web.ts +2 -1
  217. package/src/components/DrawerLayout.tsx +8 -2
  218. package/src/components/GestureHandlerButton.tsx +7 -4
  219. package/src/components/Swipeable.tsx +28 -22
  220. package/src/fabric/RNGestureHandlerButtonNativeComponent.js +27 -0
  221. package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +19 -0
  222. package/src/getShadowNodeFromRef.ts +19 -0
  223. package/src/getShadowNodeFromRef.web.ts +7 -0
  224. package/src/handlers/FlingGestureHandler.ts +3 -1
  225. package/src/handlers/ForceTouchGestureHandler.ts +8 -2
  226. package/src/handlers/LongPressGestureHandler.ts +5 -3
  227. package/src/handlers/NativeViewGestureHandler.ts +3 -1
  228. package/src/handlers/PanGestureHandler.ts +5 -3
  229. package/src/handlers/PinchGestureHandler.ts +3 -1
  230. package/src/handlers/RotationGestureHandler.ts +3 -1
  231. package/src/handlers/TapGestureHandler.ts +3 -1
  232. package/src/handlers/createHandler.ts +80 -5
  233. package/src/handlers/createNativeWrapper.tsx +7 -1
  234. package/src/handlers/gestureHandlerCommon.ts +2 -5
  235. package/src/handlers/gestures/GestureDetector.tsx +110 -37
  236. package/src/handlers/gestures/eventReceiver.ts +23 -19
  237. package/src/handlers/gestures/forceTouchGesture.ts +1 -1
  238. package/src/handlers/gestures/gesture.ts +21 -1
  239. package/src/handlers/gestures/gestureStateManager.ts +9 -12
  240. package/src/handlers/gestures/panGesture.ts +1 -1
  241. package/src/handlers/gestures/pinchGesture.ts +1 -1
  242. package/src/handlers/gestures/reanimatedWrapper.ts +4 -1
  243. package/src/handlers/handlersRegistry.ts +44 -6
  244. package/src/index.ts +15 -11
  245. package/src/init.ts +6 -0
  246. package/src/jestUtils.ts +506 -0
  247. package/src/utils.ts +38 -0
  248. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +0 -18
  249. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +0 -21
  250. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +0 -17
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 Krzysztof Magiera
3
+ Copyright (c) 2016 Software Mansion <swmansion.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -11,6 +11,10 @@ It makes touch interactions and gesture tracking not only smooth, but also depen
11
11
 
12
12
  Check [getting started](https://docs.swmansion.com/react-native-gesture-handler/docs/#installation) section of our docs for the detailed installation instructions.
13
13
 
14
+ ## Fabric
15
+
16
+ To learn how to use `react-native-gesture-handler` with Fabric architecture, head over to [Fabric README](README-Fabric.md). Instructions on how to run Fabric Example within this repo can be found in the [FabricExample README](FabricExample/README.md).
17
+
14
18
  ## Documentation
15
19
 
16
20
  Check out our dedicated documentation page for info about this library, API reference and more: [https://docs.swmansion.com/react-native-gesture-handler/docs/](https://docs.swmansion.com/react-native-gesture-handler/docs/)
@@ -31,7 +35,7 @@ Run `yarn android` or `yarn ios` (depending on which platform you want to run th
31
35
 
32
36
  You will need to have an Android or iOS device or emulator connected as well as `react-native-cli` package installed globally.
33
37
 
34
- ## React native Support
38
+ ## React Native Support
35
39
 
36
40
  | version | react-native version |
37
41
  | ------- | -------------------- |
@@ -47,7 +51,8 @@ Gesture handler library is licensed under [The MIT License](LICENSE).
47
51
 
48
52
  ## Credits
49
53
 
50
- This project is supported by amazing people from [Expo.io](https://expo.io) and [Software Mansion](https://swmansion.com)
54
+ This project has been build and is maintained thanks to the support from [Shopify](https://shopify.com), [Expo.io](https://expo.io) and [Software Mansion](https://swmansion.com)
51
55
 
56
+ [![shopify](https://avatars1.githubusercontent.com/u/8085?v=3&s=100 'Shopify.com')](https://shopify.com)
52
57
  [![expo](https://avatars2.githubusercontent.com/u/12504344?v=3&s=100 'Expo.io')](https://expo.io)
53
- [![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-gesture-handler-github 'Software Mansion')](https://swmansion.com)
58
+ [![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)
@@ -1,5 +1,7 @@
1
1
  require "json"
2
2
 
3
+ fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED']
4
+
3
5
  Pod::Spec.new do |s|
4
6
  # NPM package specification
5
7
  package = JSON.parse(File.read(File.join(File.dirname(__FILE__), "package.json")))
@@ -10,10 +12,32 @@ Pod::Spec.new do |s|
10
12
  s.homepage = "https://github.com/software-mansion/react-native-gesture-handler"
11
13
  s.license = "MIT"
12
14
  s.author = { package["author"]["name"] => package["author"]["email"] }
13
- s.platforms = { :ios => "9.0", :tvos => "9.0" }
14
15
  s.source = { :git => "https://github.com/software-mansion/react-native-gesture-handler", :tag => "#{s.version}" }
15
- s.source_files = "ios/**/*.{h,m}"
16
+ s.source_files = "ios/**/*.{h,m,mm}"
17
+ s.requires_arc = true
18
+
19
+ 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
+ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
24
+
25
+ s.pod_target_xcconfig = {
26
+ 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"'
27
+ }
28
+ s.platforms = { ios: '11.0', tvos: '11.0' }
29
+ s.compiler_flags = folly_compiler_flags + ' -DRN_FABRIC_ENABLED'
16
30
 
17
- s.dependency "React-Core"
31
+ s.dependency "React"
32
+ s.dependency "React-RCTFabric" # This is for fabric component
33
+ s.dependency "React-Codegen"
34
+ s.dependency "RCT-Folly", folly_version
35
+ s.dependency "RCTRequired"
36
+ s.dependency "RCTTypeSafety"
37
+ s.dependency "ReactCommon/turbomodule/core"
38
+ else
39
+ s.platforms = { :ios => "9.0", :tvos => "9.0" }
18
40
 
41
+ s.dependency "React-Core"
42
+ end
19
43
  end
@@ -12,6 +12,17 @@ buildscript {
12
12
  }
13
13
  }
14
14
 
15
+ def isNewArchitectureEnabled() {
16
+ // To opt-in for the New Architecture, you can either:
17
+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
18
+ // - Invoke gradle with `-newArchEnabled=true`
19
+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
20
+ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
21
+ }
22
+
23
+ if (isNewArchitectureEnabled()) {
24
+ apply plugin: 'com.facebook.react'
25
+ }
15
26
  apply plugin: 'com.android.library'
16
27
  apply plugin: 'kotlin-android'
17
28
 
@@ -27,7 +38,7 @@ def shouldUseCommonInterfaceFromReanimated() {
27
38
  def json = new JsonSlurper().parseText(inputFile.text)
28
39
  def reanimatedVersion = json.version as String
29
40
  def (major, minor, patch) = reanimatedVersion.tokenize('.')
30
- return Integer.parseInt(minor) >= 3
41
+ return Integer.parseInt(major) == 2 && Integer.parseInt(minor) >= 3
31
42
  } else {
32
43
  return false
33
44
  }
@@ -45,18 +56,62 @@ android {
45
56
  targetSdkVersion safeExtGet('targetSdkVersion', 28)
46
57
  versionCode 1
47
58
  versionName "1.0"
59
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
60
+ if (isNewArchitectureEnabled()) {
61
+ var appProject = rootProject.allprojects.find {it.plugins.hasPlugin('com.android.application')}
62
+ externalNativeBuild {
63
+ ndkBuild {
64
+ arguments "APP_PLATFORM=android-21",
65
+ "APP_STL=c++_shared",
66
+ "NDK_TOOLCHAIN_VERSION=clang",
67
+ "GENERATED_SRC_DIR=${appProject.buildDir}/generated/source",
68
+ "PROJECT_BUILD_DIR=${appProject.buildDir}",
69
+ "REACT_ANDROID_DIR=${appProject.rootDir}/../node_modules/react-native/ReactAndroid",
70
+ "REACT_ANDROID_BUILD_DIR=${appProject.rootDir}/../node_modules/react-native/ReactAndroid/build"
71
+ cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
72
+ cppFlags "-std=c++17"
73
+ targets "rngesturehandler_modules"
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ if (isNewArchitectureEnabled()) {
80
+ externalNativeBuild {
81
+ ndkBuild {
82
+ path "src/main/jni/Android.mk"
83
+ }
84
+ }
85
+ }
86
+
87
+ packagingOptions {
88
+ // For some reason gradle only complains about the duplicated version of libreact_render libraries
89
+ // while there are more libraries copied in intermediates folder of the lib build directory, we exclude
90
+ // only the ones that make the build fail (ideally we should only include librngesturehandler_modules but we
91
+ // are only allowed to specify exclude patterns)
92
+ exclude "**/libreact_render*.so"
48
93
  }
49
94
 
50
95
  // Include "lib/" as sources, unfortunately react-native link can't handle
51
96
  // setting up alternative gradle modules. We still have "lib" defined as a
52
97
  // standalone gradle module just to be used in AndroidNativeExample
53
- sourceSets {
54
- main.java.srcDirs += 'lib/src/main/java'
98
+ sourceSets.main {
99
+ java {
100
+ srcDirs += 'lib/src/main/java'
55
101
 
56
- // Include "common/" only when it's not provided by Reanimated to mitigate
57
- // multiple definitions of the same class preventing build
58
- if (!shouldUseCommonInterfaceFromReanimated()) {
59
- main.java.srcDirs += 'common/src/main/java'
102
+ // Include "common/" only when it's not provided by Reanimated to mitigate
103
+ // multiple definitions of the same class preventing build
104
+ if (!shouldUseCommonInterfaceFromReanimated()) {
105
+ srcDirs += 'common/src/main/java'
106
+ }
107
+
108
+ if (isNewArchitectureEnabled()) {
109
+ srcDirs += 'src/fabric/java'
110
+ } else {
111
+ // this folder also includes files from codegen so the library can compile with
112
+ // codegen turned off
113
+ srcDirs += 'src/paper/java'
114
+ }
60
115
  }
61
116
  }
62
117
  }
@@ -65,12 +120,30 @@ def kotlin_version = safeExtGet('kotlinVersion', project.properties['RNGH_kotlin
65
120
 
66
121
  dependencies {
67
122
  //noinspection GradleDynamicVersion
123
+ if (isNewArchitectureEnabled()) {
124
+ implementation project(':ReactAndroid')
125
+ } else {
126
+ implementation 'com.facebook.react:react-native:+'
127
+ }
128
+
68
129
  if (shouldUseCommonInterfaceFromReanimated()) {
69
130
  // Include Reanimated as dependency to load the common interface
70
- implementation project(':react-native-reanimated')
131
+ implementation (project(':react-native-reanimated')) {
132
+ exclude group:'com.facebook.fbjni' // resolves "Duplicate class com.facebook.jni.CppException"
133
+ }
71
134
  }
72
- implementation 'com.facebook.react:react-native:+'
135
+
73
136
  implementation 'androidx.appcompat:appcompat:1.2.0'
74
137
  implementation "androidx.core:core-ktx:1.6.0"
75
138
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
76
139
  }
140
+
141
+ if (isNewArchitectureEnabled()) {
142
+ react {
143
+ reactRoot = rootProject.file("../node_modules/react-native/")
144
+ jsRootDir = file("../src/fabric/")
145
+ codegenDir = rootProject.file("../node_modules/react-native-codegen/")
146
+ libraryName = "rngesturehandler"
147
+ codegenJavaPackageName = "com.swmansion.gesturehandler"
148
+ }
149
+ }
@@ -1,9 +1,14 @@
1
1
  package com.swmansion.gesturehandler
2
2
 
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import android.content.ContextWrapper
6
+ import android.graphics.Rect
3
7
  import android.view.MotionEvent
4
8
  import android.view.MotionEvent.PointerCoords
5
9
  import android.view.MotionEvent.PointerProperties
6
10
  import android.view.View
11
+ import android.view.Window
7
12
  import com.facebook.react.bridge.Arguments
8
13
  import com.facebook.react.bridge.UiThreadUtil
9
14
  import com.facebook.react.bridge.WritableArray
@@ -15,6 +20,7 @@ import java.util.*
15
20
  open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestureHandlerT>> {
16
21
  private val trackedPointerIDs = IntArray(MAX_POINTERS_COUNT)
17
22
  private var trackedPointersIDsCount = 0
23
+ private val windowOffset = IntArray(2) { 0 }
18
24
  var tag = 0
19
25
  var view: View? = null
20
26
  private set
@@ -28,7 +34,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
28
34
  private set
29
35
  var isEnabled = true
30
36
  private set
31
- var usesDeviceEvents = false
37
+ var actionType = 0
32
38
 
33
39
  var changedTouchesPayload: WritableArray? = null
34
40
  private set
@@ -67,14 +73,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
67
73
  protected inline fun applySelf(block: ConcreteGestureHandlerT.() -> Unit): ConcreteGestureHandlerT =
68
74
  self().apply { block() }
69
75
 
70
- // set and accessed only by the orchestrator
76
+ // properties set and accessed only by the orchestrator
71
77
  var activationIndex = 0
72
-
73
- // set and accessed only by the orchestrator
74
78
  var isActive = false
75
-
76
- // set and accessed only by the orchestrator
77
79
  var isAwaiting = false
80
+ var shouldResetProgress = false
78
81
 
79
82
  open fun dispatchStateChange(newState: Int, prevState: Int) {
80
83
  onTouchEventListener?.onStateChange(self(), newState, prevState)
@@ -158,6 +161,25 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
158
161
  state = STATE_UNDETERMINED
159
162
  this.view = view
160
163
  this.orchestrator = orchestrator
164
+
165
+ val decorView = getWindow(view?.context)?.decorView
166
+ if (decorView != null) {
167
+ val frame = Rect()
168
+ decorView.getWindowVisibleDisplayFrame(frame)
169
+ windowOffset[0] = frame.left
170
+ windowOffset[1] = frame.top
171
+ } else {
172
+ windowOffset[0] = 0
173
+ windowOffset[1] = 0
174
+ }
175
+ }
176
+
177
+ private fun getWindow(context: Context?): Window? {
178
+ if (context == null) return null
179
+ if (context is Activity) return context.window
180
+ if (context is ContextWrapper) return getWindow(context.baseContext)
181
+
182
+ return null
161
183
  }
162
184
 
163
185
  private fun findNextLocalPointerId(): Int {
@@ -341,8 +363,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
341
363
  pointerId,
342
364
  event.getX(event.actionIndex),
343
365
  event.getY(event.actionIndex),
344
- event.getX(event.actionIndex) + offsetX,
345
- event.getY(event.actionIndex) + offsetY,
366
+ event.getX(event.actionIndex) + offsetX - windowOffset[0],
367
+ event.getY(event.actionIndex) + offsetY - windowOffset[1],
346
368
  )
347
369
  trackedPointersCount++
348
370
  addChangedPointer(trackedPointers[pointerId]!!)
@@ -363,8 +385,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
363
385
  pointerId,
364
386
  event.getX(event.actionIndex),
365
387
  event.getY(event.actionIndex),
366
- event.getX(event.actionIndex) + offsetX,
367
- event.getY(event.actionIndex) + offsetY,
388
+ event.getX(event.actionIndex) + offsetX - windowOffset[0],
389
+ event.getY(event.actionIndex) + offsetY - windowOffset[1],
368
390
  )
369
391
  addChangedPointer(trackedPointers[pointerId]!!)
370
392
  trackedPointers[pointerId] = null
@@ -387,8 +409,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
387
409
  if (pointer.x != event.getX(i) || pointer.y != event.getY(i)) {
388
410
  pointer.x = event.getX(i)
389
411
  pointer.y = event.getY(i)
390
- pointer.absoluteX = event.getX(i) + offsetX
391
- pointer.absoluteY = event.getY(i) + offsetY
412
+ pointer.absoluteX = event.getX(i) + offsetX - windowOffset[0]
413
+ pointer.absoluteY = event.getY(i) + offsetY - windowOffset[1]
392
414
 
393
415
  addChangedPointer(pointer)
394
416
  pointersAdded++
@@ -617,6 +639,10 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
617
639
  }
618
640
  }
619
641
 
642
+ // responsible for resetting the state of handler upon activation (may be called more than once
643
+ // if the handler is waiting for failure of other one)
644
+ open fun resetProgress() {}
645
+
620
646
  protected open fun onHandle(event: MotionEvent) {
621
647
  moveToState(STATE_FAILED)
622
648
  }
@@ -651,6 +677,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
651
677
  val lastRelativePositionY: Float
652
678
  get() = lastAbsolutePositionY - lastEventOffsetY
653
679
 
680
+ val lastPositionInWindowX: Float
681
+ get() = lastAbsolutePositionX - windowOffset[0]
682
+ val lastPositionInWindowY: Float
683
+ get() = lastAbsolutePositionY - windowOffset[1]
684
+
654
685
  companion object {
655
686
  const val STATE_UNDETERMINED = 0
656
687
  const val STATE_FAILED = 1
@@ -669,6 +700,10 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
669
700
  const val DIRECTION_LEFT = 2
670
701
  const val DIRECTION_UP = 4
671
702
  const val DIRECTION_DOWN = 8
703
+ const val ACTION_TYPE_REANIMATED_WORKLET = 1
704
+ const val ACTION_TYPE_NATIVE_ANIMATED_EVENT = 2
705
+ const val ACTION_TYPE_JS_FUNCTION_OLD_API = 3
706
+ const val ACTION_TYPE_JS_FUNCTION_NEW_API = 4
672
707
  private const val MAX_POINTERS_COUNT = 12
673
708
  private lateinit var pointerProps: Array<PointerProperties?>
674
709
  private lateinit var pointerCoords: Array<PointerCoords?>
@@ -142,8 +142,16 @@ class GestureHandlerOrchestrator(
142
142
  } else if (prevState == GestureHandler.STATE_ACTIVE || prevState == GestureHandler.STATE_END) {
143
143
  if (handler.isActive) {
144
144
  handler.dispatchStateChange(newState, prevState)
145
+ } else if (prevState == GestureHandler.STATE_ACTIVE) {
146
+ // handle edge case where handler awaiting for another one tries to activate but finishes
147
+ // before the other would not send state change event upon ending
148
+ handler.dispatchStateChange(newState, GestureHandler.STATE_BEGAN)
145
149
  }
146
- } else {
150
+ } else if (prevState != GestureHandler.STATE_UNDETERMINED || newState != GestureHandler.STATE_CANCELLED) {
151
+ // If handler is changing state from UNDETERMINED to CANCELLED, the state change event shouldn't
152
+ // be sent. Handler hasn't yet began so it may not be initialized which results in crashes.
153
+ // If it doesn't crash, there may be some weird behavior on JS side, as `onFinalize` will be
154
+ // called without calling `onBegin` first.
147
155
  handler.dispatchStateChange(newState, prevState)
148
156
  }
149
157
  handlingChangeSemaphore -= 1
@@ -155,6 +163,7 @@ class GestureHandlerOrchestrator(
155
163
  with(handler) {
156
164
  isAwaiting = false
157
165
  isActive = true
166
+ shouldResetProgress = true
158
167
  activationIndex = this@GestureHandlerOrchestrator.activationIndex++
159
168
  }
160
169
  var toCancelCount = 0
@@ -242,16 +251,41 @@ class GestureHandlerOrchestrator(
242
251
  // approach when we want to use pointer coordinates to calculate velocity or distance
243
252
  // for pinch so I don't know yet if we should transform or not...
244
253
  event.setLocation(coords[0], coords[1])
245
- if (handler.needsPointerData) {
254
+
255
+ // Touch events are sent before the handler itself has a chance to process them,
256
+ // mainly because `onTouchesUp` shoul be send befor gesture finishes. This means that
257
+ // the first `onTouchesDown` event is sent before a gesture begins, activation in
258
+ // callback for this event causes problems because the handler doesn't have a chance
259
+ // to initialize itself with starting values of pointer (in pan this causes translation
260
+ // to be equal to the coordinates of the pointer). The simplest solution is to send
261
+ // the first `onTouchesDown` event after the handler processes it and changes state
262
+ // to `BEGAN`.
263
+ if (handler.needsPointerData && handler.state != 0) {
246
264
  handler.updatePointerData(event)
247
265
  }
248
266
 
249
267
  if (!handler.isAwaiting || action != MotionEvent.ACTION_MOVE) {
268
+ val isFirstEvent = handler.state == 0
250
269
  handler.handle(event)
251
270
  if (handler.isActive) {
271
+ // After handler is done waiting for other one to fail its progress should be
272
+ // reset, otherwise there may be a visible jump in values sent by the handler.
273
+ // When handler is waiting it's already activated but the `isAwaiting` flag
274
+ // prevents it from receiving touch stream. When the flag is changed, the
275
+ // difference between this event and the last one may be large enough to be
276
+ // visible in interactions based on this gesture. This makes it consistent with
277
+ // the behavior on iOS.
278
+ if (handler.shouldResetProgress) {
279
+ handler.shouldResetProgress = false
280
+ handler.resetProgress()
281
+ }
252
282
  handler.dispatchHandlerUpdate(event)
253
283
  }
254
284
 
285
+ if (handler.needsPointerData && isFirstEvent) {
286
+ handler.updatePointerData(event)
287
+ }
288
+
255
289
  // if event was of type UP or POINTER_UP we request handler to stop tracking now that
256
290
  // the event has been dispatched
257
291
  if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) {
@@ -349,11 +383,13 @@ class GestureHandlerOrchestrator(
349
383
  val parentViewGroup: ViewGroup = parent
350
384
 
351
385
  handlerRegistry.getHandlersForView(parent)?.let {
352
- for (handler in it) {
353
- if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
354
- found = true
355
- recordHandlerIfNotPresent(handler, parentViewGroup)
356
- handler.startTrackingPointer(pointerId)
386
+ synchronized(it) {
387
+ for (handler in it) {
388
+ if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
389
+ found = true
390
+ recordHandlerIfNotPresent(handler, parentViewGroup)
391
+ handler.startTrackingPointer(pointerId)
392
+ }
357
393
  }
358
394
  }
359
395
  }
@@ -368,13 +404,13 @@ class GestureHandlerOrchestrator(
368
404
  private fun recordViewHandlersForPointer(view: View, coords: FloatArray, pointerId: Int): Boolean {
369
405
  var found = false
370
406
  handlerRegistry.getHandlersForView(view)?.let {
371
- val size = it.size
372
- for (i in 0 until size) {
373
- val handler = it[i]
374
- if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
375
- recordHandlerIfNotPresent(handler, view)
376
- handler.startTrackingPointer(pointerId)
377
- found = true
407
+ synchronized(it) {
408
+ for (handler in it) {
409
+ if (handler.isEnabled && handler.isWithinBounds(view, coords[0], coords[1])) {
410
+ recordHandlerIfNotPresent(handler, view)
411
+ handler.startTrackingPointer(pointerId)
412
+ found = true
413
+ }
378
414
  }
379
415
  }
380
416
  }
@@ -208,8 +208,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
208
208
  lastY = getLastPointerY(event, averageTouches)
209
209
  }
210
210
  if (state == STATE_UNDETERMINED && event.pointerCount >= minPointers) {
211
- startX = lastX
212
- startY = lastY
211
+ resetProgress()
213
212
  offsetX = 0f
214
213
  offsetY = 0f
215
214
  velocityX = 0f
@@ -253,8 +252,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
253
252
  override fun activate(force: Boolean) {
254
253
  // reset starting point if the handler has not yet activated
255
254
  if (state != STATE_ACTIVE) {
256
- startX = lastX
257
- startY = lastY
255
+ resetProgress()
258
256
  }
259
257
  super.activate(force)
260
258
  }
@@ -266,6 +264,11 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
266
264
  }
267
265
  }
268
266
 
267
+ override fun resetProgress() {
268
+ startX = lastX
269
+ startY = lastY
270
+ }
271
+
269
272
  companion object {
270
273
  private const val MIN_VALUE_IGNORE = Float.MAX_VALUE
271
274
  private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
@@ -1,8 +1,6 @@
1
1
  package com.swmansion.gesturehandler
2
2
 
3
3
  import android.view.MotionEvent
4
- import android.view.ScaleGestureDetector
5
- import android.view.ScaleGestureDetector.OnScaleGestureListener
6
4
  import android.view.ViewConfiguration
7
5
  import kotlin.math.abs
8
6
 
@@ -19,7 +17,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
19
17
  private var scaleGestureDetector: ScaleGestureDetector? = null
20
18
  private var startingSpan = 0f
21
19
  private var spanSlop = 0f
22
- private val gestureListener: OnScaleGestureListener = object : OnScaleGestureListener {
20
+ private val gestureListener: ScaleGestureDetector.OnScaleGestureListener = object : ScaleGestureDetector.OnScaleGestureListener {
23
21
  override fun onScale(detector: ScaleGestureDetector): Boolean {
24
22
  val prevScaleFactor: Double = scale
25
23
  scale *= detector.scaleFactor.toDouble()
@@ -28,7 +26,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
28
26
  velocity = (scale - prevScaleFactor) / delta
29
27
  }
30
28
  if (abs(startingSpan - detector.currentSpan) >= spanSlop
31
- && state == STATE_BEGAN) {
29
+ && state == STATE_BEGAN) {
32
30
  activate()
33
31
  }
34
32
  return true
@@ -52,8 +50,7 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
52
50
  override fun onHandle(event: MotionEvent) {
53
51
  if (state == STATE_UNDETERMINED) {
54
52
  val context = view!!.context
55
- velocity = 0.0
56
- scale = 1.0
53
+ resetProgress()
57
54
  scaleGestureDetector = ScaleGestureDetector(context, gestureListener)
58
55
  val configuration = ViewConfiguration.get(context)
59
56
  spanSlop = configuration.scaledTouchSlop.toFloat()
@@ -74,14 +71,17 @@ class PinchGestureHandler : GestureHandler<PinchGestureHandler>() {
74
71
  override fun activate(force: Boolean) {
75
72
  // reset scale if the handler has not yet activated
76
73
  if (state != STATE_ACTIVE) {
77
- velocity = 0.0
78
- scale = 1.0
74
+ resetProgress()
79
75
  }
80
76
  super.activate(force)
81
77
  }
82
78
 
83
79
  override fun onReset() {
84
80
  scaleGestureDetector = null
81
+ resetProgress()
82
+ }
83
+
84
+ override fun resetProgress() {
85
85
  velocity = 0.0
86
86
  scale = 1.0
87
87
  }
@@ -43,8 +43,7 @@ class RotationGestureHandler : GestureHandler<RotationGestureHandler>() {
43
43
 
44
44
  override fun onHandle(event: MotionEvent) {
45
45
  if (state == STATE_UNDETERMINED) {
46
- velocity = 0.0
47
- rotation = 0.0
46
+ resetProgress()
48
47
  rotationGestureDetector = RotationGestureDetector(gestureListener)
49
48
  begin()
50
49
  }
@@ -61,14 +60,17 @@ class RotationGestureHandler : GestureHandler<RotationGestureHandler>() {
61
60
  override fun activate(force: Boolean) {
62
61
  // reset rotation if the handler has not yet activated
63
62
  if (state != STATE_ACTIVE) {
64
- rotation = 0.0
65
- velocity = 0.0
63
+ resetProgress()
66
64
  }
67
65
  super.activate(force)
68
66
  }
69
67
 
70
68
  override fun onReset() {
71
69
  rotationGestureDetector = null
70
+ resetProgress()
71
+ }
72
+
73
+ override fun resetProgress() {
72
74
  velocity = 0.0
73
75
  rotation = 0.0
74
76
  }