react-native-gesture-handler 2.1.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }