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.
Files changed (382) hide show
  1. package/README.md +7 -6
  2. package/android/build.gradle +49 -1
  3. package/android/common/src/main/java/com/swmansion/common/GestureHandlerStateManager.kt +5 -0
  4. package/android/gradle.properties +19 -0
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +18 -0
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/Extensions.kt +11 -0
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +96 -0
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +713 -0
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.kt +8 -0
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +562 -0
  11. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.kt +8 -0
  12. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +21 -0
  13. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +49 -0
  14. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +97 -0
  15. package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +11 -0
  16. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +129 -0
  17. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.kt +9 -0
  18. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +289 -0
  19. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +88 -0
  20. package/android/lib/src/main/java/com/swmansion/gesturehandler/{PointerEventsConfig.java → PointerEventsConfig.kt} +3 -5
  21. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.kt +125 -0
  22. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +79 -0
  23. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +167 -0
  24. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.kt +10 -0
  25. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +348 -0
  26. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +57 -0
  27. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +59 -0
  28. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +8 -0
  29. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +61 -0
  30. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +686 -0
  31. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +17 -0
  32. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +95 -0
  33. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +132 -0
  34. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.kt +5 -0
  35. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +68 -0
  36. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +34 -0
  37. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +66 -0
  38. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +69 -0
  39. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +51 -0
  40. package/ios/Handlers/RNFlingHandler.m +78 -5
  41. package/ios/Handlers/RNForceTouchHandler.m +29 -4
  42. package/ios/Handlers/RNLongPressHandler.m +105 -3
  43. package/ios/Handlers/RNManualHandler.h +4 -0
  44. package/ios/Handlers/RNManualHandler.m +73 -0
  45. package/ios/Handlers/RNNativeViewHandler.m +30 -2
  46. package/ios/Handlers/RNPanHandler.m +64 -4
  47. package/ios/Handlers/RNPinchHandler.m +61 -2
  48. package/ios/Handlers/RNRotationHandler.m +60 -1
  49. package/ios/Handlers/RNTapHandler.m +55 -8
  50. package/ios/RNGestureHandler.h +18 -4
  51. package/ios/RNGestureHandler.m +123 -13
  52. package/ios/RNGestureHandlerEvents.h +9 -0
  53. package/ios/RNGestureHandlerEvents.m +34 -0
  54. package/ios/RNGestureHandlerManager.h +7 -0
  55. package/ios/RNGestureHandlerManager.m +62 -34
  56. package/ios/RNGestureHandlerModule.m +39 -3
  57. package/ios/RNGestureHandlerPointerTracker.h +25 -0
  58. package/ios/RNGestureHandlerPointerTracker.m +237 -0
  59. package/ios/RNGestureHandlerRegistry.h +1 -0
  60. package/ios/RNGestureHandlerRegistry.m +10 -0
  61. package/ios/RNGestureHandlerStateManager.h +5 -0
  62. package/ios/RNManualActivationRecognizer.h +10 -0
  63. package/ios/RNManualActivationRecognizer.m +80 -0
  64. package/ios/RNRootViewGestureRecognizer.m +1 -1
  65. package/ios/RNTouchEventType.h +9 -0
  66. package/lib/commonjs/EventType.js +16 -0
  67. package/lib/commonjs/EventType.js.map +1 -0
  68. package/lib/commonjs/GestureHandlerRootView.android.js +1 -13
  69. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  70. package/lib/commonjs/GestureHandlerRootView.js +11 -3
  71. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  72. package/lib/commonjs/RNGestureHandlerModule.js +3 -1
  73. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  74. package/lib/commonjs/RNGestureHandlerModule.web.js +2 -2
  75. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  76. package/lib/commonjs/components/DrawerLayout.js +41 -37
  77. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  78. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  79. package/lib/commonjs/components/GestureComponents.js +31 -12
  80. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  81. package/lib/commonjs/components/Swipeable.js +10 -6
  82. package/lib/commonjs/components/Swipeable.js.map +1 -1
  83. package/lib/commonjs/components/touchables/GenericTouchable.js +2 -1
  84. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  85. package/lib/commonjs/components/touchables/TouchableOpacity.js +1 -1
  86. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  87. package/lib/commonjs/gestureHandlerRootHOC.js +1 -1
  88. package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
  89. package/lib/commonjs/handlers/FlingGestureHandler.js +23 -0
  90. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -0
  91. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +44 -0
  92. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -0
  93. package/lib/commonjs/handlers/LongPressGestureHandler.js +23 -0
  94. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -0
  95. package/lib/commonjs/handlers/NativeViewGestureHandler.js +6 -4
  96. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  97. package/lib/commonjs/handlers/PanGestureHandler.js +121 -0
  98. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -0
  99. package/lib/commonjs/handlers/PinchGestureHandler.js +21 -0
  100. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -0
  101. package/lib/commonjs/handlers/RotationGestureHandler.js +21 -0
  102. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -0
  103. package/lib/commonjs/handlers/TapGestureHandler.js +23 -0
  104. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -0
  105. package/lib/commonjs/handlers/createHandler.js +52 -83
  106. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  107. package/lib/commonjs/handlers/gestureHandlerCommon.js +80 -0
  108. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -0
  109. package/lib/commonjs/handlers/gestures/GestureDetector.js +440 -0
  110. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -0
  111. package/lib/commonjs/handlers/gestures/eventReceiver.js +135 -0
  112. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -0
  113. package/lib/commonjs/handlers/gestures/flingGesture.js +34 -0
  114. package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -0
  115. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +65 -0
  116. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -0
  117. package/lib/commonjs/handlers/gestures/gesture.js +193 -0
  118. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -0
  119. package/lib/commonjs/handlers/gestures/gestureComposition.js +94 -0
  120. package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -0
  121. package/lib/commonjs/handlers/gestures/gestureObjects.js +85 -0
  122. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -0
  123. package/lib/commonjs/handlers/gestures/gestureStateManager.js +58 -0
  124. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -0
  125. package/lib/commonjs/handlers/gestures/longPressGesture.js +34 -0
  126. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -0
  127. package/lib/commonjs/handlers/gestures/manualGesture.js +31 -0
  128. package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -0
  129. package/lib/commonjs/handlers/gestures/nativeGesture.js +34 -0
  130. package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -0
  131. package/lib/commonjs/handlers/gestures/panGesture.js +144 -0
  132. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -0
  133. package/lib/commonjs/handlers/gestures/pinchGesture.js +45 -0
  134. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -0
  135. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +24 -0
  136. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -0
  137. package/lib/commonjs/handlers/gestures/rotationGesture.js +45 -0
  138. package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -0
  139. package/lib/commonjs/handlers/gestures/tapGesture.js +59 -0
  140. package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -0
  141. package/lib/commonjs/handlers/handlersRegistry.js +31 -0
  142. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -0
  143. package/lib/commonjs/index.js +146 -8
  144. package/lib/commonjs/index.js.map +1 -1
  145. package/lib/commonjs/init.js +13 -0
  146. package/lib/commonjs/init.js.map +1 -0
  147. package/lib/commonjs/mocks.js +31 -2
  148. package/lib/commonjs/mocks.js.map +1 -1
  149. package/lib/commonjs/utils.js +15 -0
  150. package/lib/commonjs/utils.js.map +1 -0
  151. package/lib/commonjs/web/Errors.js +1 -1
  152. package/lib/commonjs/web/Errors.js.map +1 -1
  153. package/lib/commonjs/web/GestureHandler.js +4 -6
  154. package/lib/commonjs/web/GestureHandler.js.map +1 -1
  155. package/lib/commonjs/web/NodeManager.js +8 -2
  156. package/lib/commonjs/web/NodeManager.js.map +1 -1
  157. package/lib/module/EventType.js +8 -0
  158. package/lib/module/EventType.js.map +1 -0
  159. package/lib/module/GestureHandlerRootView.android.js +2 -14
  160. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  161. package/lib/module/GestureHandlerRootView.js +5 -1
  162. package/lib/module/GestureHandlerRootView.js.map +1 -1
  163. package/lib/module/RNGestureHandlerModule.js +3 -1
  164. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  165. package/lib/module/RNGestureHandlerModule.web.js +2 -2
  166. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  167. package/lib/module/components/DrawerLayout.js +43 -40
  168. package/lib/module/components/DrawerLayout.js.map +1 -1
  169. package/lib/module/components/GestureButtons.js.map +1 -1
  170. package/lib/module/components/GestureComponents.js +29 -11
  171. package/lib/module/components/GestureComponents.js.map +1 -1
  172. package/lib/module/components/Swipeable.js +9 -6
  173. package/lib/module/components/Swipeable.js.map +1 -1
  174. package/lib/module/components/touchables/GenericTouchable.js +2 -1
  175. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  176. package/lib/module/components/touchables/TouchableOpacity.js +1 -1
  177. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  178. package/lib/module/gestureHandlerRootHOC.js +1 -1
  179. package/lib/module/gestureHandlerRootHOC.js.map +1 -1
  180. package/lib/module/handlers/FlingGestureHandler.js +10 -0
  181. package/lib/module/handlers/FlingGestureHandler.js.map +1 -0
  182. package/lib/module/handlers/ForceTouchGestureHandler.js +29 -0
  183. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -0
  184. package/lib/module/handlers/LongPressGestureHandler.js +10 -0
  185. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -0
  186. package/lib/module/handlers/NativeViewGestureHandler.js +4 -3
  187. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  188. package/lib/module/handlers/PanGestureHandler.js +106 -0
  189. package/lib/module/handlers/PanGestureHandler.js.map +1 -0
  190. package/lib/module/handlers/PinchGestureHandler.js +9 -0
  191. package/lib/module/handlers/PinchGestureHandler.js.map +1 -0
  192. package/lib/module/handlers/RotationGestureHandler.js +9 -0
  193. package/lib/module/handlers/RotationGestureHandler.js.map +1 -0
  194. package/lib/module/handlers/TapGestureHandler.js +10 -0
  195. package/lib/module/handlers/TapGestureHandler.js.map +1 -0
  196. package/lib/module/handlers/createHandler.js +41 -76
  197. package/lib/module/handlers/createHandler.js.map +1 -1
  198. package/lib/module/handlers/gestureHandlerCommon.js +66 -0
  199. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -0
  200. package/lib/module/handlers/gestures/GestureDetector.js +402 -0
  201. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -0
  202. package/lib/module/handlers/gestures/eventReceiver.js +120 -0
  203. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -0
  204. package/lib/module/handlers/gestures/flingGesture.js +24 -0
  205. package/lib/module/handlers/gestures/flingGesture.js.map +1 -0
  206. package/lib/module/handlers/gestures/forceTouchGesture.js +56 -0
  207. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -0
  208. package/lib/module/handlers/gestures/gesture.js +175 -0
  209. package/lib/module/handlers/gestures/gesture.js.map +1 -0
  210. package/lib/module/handlers/gestures/gestureComposition.js +79 -0
  211. package/lib/module/handlers/gestures/gestureComposition.js.map +1 -0
  212. package/lib/module/handlers/gestures/gestureObjects.js +67 -0
  213. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -0
  214. package/lib/module/handlers/gestures/gestureStateManager.js +48 -0
  215. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -0
  216. package/lib/module/handlers/gestures/longPressGesture.js +24 -0
  217. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -0
  218. package/lib/module/handlers/gestures/manualGesture.js +22 -0
  219. package/lib/module/handlers/gestures/manualGesture.js.map +1 -0
  220. package/lib/module/handlers/gestures/nativeGesture.js +24 -0
  221. package/lib/module/handlers/gestures/nativeGesture.js.map +1 -0
  222. package/lib/module/handlers/gestures/panGesture.js +135 -0
  223. package/lib/module/handlers/gestures/panGesture.js.map +1 -0
  224. package/lib/module/handlers/gestures/pinchGesture.js +36 -0
  225. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -0
  226. package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -0
  227. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -0
  228. package/lib/module/handlers/gestures/rotationGesture.js +36 -0
  229. package/lib/module/handlers/gestures/rotationGesture.js.map +1 -0
  230. package/lib/module/handlers/gestures/tapGesture.js +49 -0
  231. package/lib/module/handlers/gestures/tapGesture.js.map +1 -0
  232. package/lib/module/handlers/handlersRegistry.js +16 -0
  233. package/lib/module/handlers/handlersRegistry.js.map +1 -0
  234. package/lib/module/index.js +22 -1
  235. package/lib/module/index.js.map +1 -1
  236. package/lib/module/init.js +5 -0
  237. package/lib/module/init.js.map +1 -0
  238. package/lib/module/mocks.js +31 -2
  239. package/lib/module/mocks.js.map +1 -1
  240. package/lib/module/utils.js +8 -0
  241. package/lib/module/utils.js.map +1 -0
  242. package/lib/module/web/Errors.js +1 -1
  243. package/lib/module/web/Errors.js.map +1 -1
  244. package/lib/module/web/GestureHandler.js +4 -6
  245. package/lib/module/web/GestureHandler.js.map +1 -1
  246. package/lib/module/web/NodeManager.js +8 -2
  247. package/lib/module/web/NodeManager.js.map +1 -1
  248. package/lib/typescript/EventType.d.ts +8 -0
  249. package/lib/typescript/GestureHandlerRootView.android.d.ts +2 -4
  250. package/lib/typescript/GestureHandlerRootView.d.ts +5 -2
  251. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
  252. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
  253. package/lib/typescript/components/DrawerLayout.d.ts +50 -1
  254. package/lib/typescript/components/GestureButtons.d.ts +36 -0
  255. package/lib/typescript/components/GestureComponents.d.ts +8 -35
  256. package/lib/typescript/components/Swipeable.d.ts +73 -6
  257. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -2
  258. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +1 -0
  259. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +1 -0
  260. package/lib/typescript/handlers/FlingGestureHandler.d.ts +33 -0
  261. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +43 -0
  262. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +55 -0
  263. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +19 -4
  264. package/lib/typescript/handlers/PanGestureHandler.d.ts +137 -0
  265. package/lib/typescript/handlers/PinchGestureHandler.d.ts +28 -0
  266. package/lib/typescript/handlers/RotationGestureHandler.d.ts +28 -0
  267. package/lib/typescript/handlers/TapGestureHandler.d.ts +56 -0
  268. package/lib/typescript/handlers/createHandler.d.ts +1 -1
  269. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +62 -0
  270. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +8 -1
  271. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +16 -0
  272. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
  273. package/lib/typescript/handlers/gestures/flingGesture.d.ts +9 -0
  274. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +16 -0
  275. package/lib/typescript/handlers/gestures/gesture.d.ts +97 -0
  276. package/lib/typescript/handlers/gestures/gestureComposition.d.ts +21 -0
  277. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +39 -0
  278. package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +9 -0
  279. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +9 -0
  280. package/lib/typescript/handlers/gestures/manualGesture.d.ts +7 -0
  281. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +9 -0
  282. package/lib/typescript/handlers/gestures/panGesture.d.ts +26 -0
  283. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +12 -0
  284. package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +14 -0
  285. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +12 -0
  286. package/lib/typescript/handlers/gestures/tapGesture.d.ts +14 -0
  287. package/lib/typescript/handlers/handlersRegistry.d.ts +6 -0
  288. package/lib/typescript/index.d.ts +29 -2
  289. package/lib/typescript/init.d.ts +1 -0
  290. package/lib/typescript/mocks.d.ts +21 -2
  291. package/lib/typescript/utils.d.ts +1 -0
  292. package/lib/typescript/web/FlingGestureHandler.d.ts +0 -1
  293. package/lib/typescript/web/GestureHandler.d.ts +0 -1
  294. package/lib/typescript/web/PanGestureHandler.d.ts +0 -1
  295. package/lib/typescript/web/PinchGestureHandler.d.ts +0 -1
  296. package/lib/typescript/web/PressGestureHandler.d.ts +0 -1
  297. package/lib/typescript/web/RotationGestureHandler.d.ts +0 -1
  298. package/lib/typescript/web/TapGestureHandler.d.ts +0 -1
  299. package/package.json +8 -5
  300. package/src/EventType.ts +10 -0
  301. package/src/GestureHandlerRootView.android.tsx +9 -25
  302. package/src/GestureHandlerRootView.tsx +11 -2
  303. package/src/RNGestureHandlerModule.ts +5 -1
  304. package/src/RNGestureHandlerModule.web.ts +1 -0
  305. package/src/components/DrawerLayout.tsx +114 -41
  306. package/src/components/GestureButtons.tsx +45 -5
  307. package/src/components/GestureComponents.tsx +47 -41
  308. package/src/components/Swipeable.tsx +108 -21
  309. package/src/components/touchables/GenericTouchable.tsx +2 -1
  310. package/src/components/touchables/TouchableOpacity.tsx +1 -1
  311. package/src/handlers/FlingGestureHandler.ts +57 -0
  312. package/src/handlers/ForceTouchGestureHandler.ts +83 -0
  313. package/src/handlers/LongPressGestureHandler.ts +84 -0
  314. package/src/handlers/NativeViewGestureHandler.ts +31 -7
  315. package/src/handlers/PanGestureHandler.ts +321 -0
  316. package/src/handlers/PinchGestureHandler.ts +46 -0
  317. package/src/handlers/RotationGestureHandler.ts +46 -0
  318. package/src/handlers/TapGestureHandler.ts +90 -0
  319. package/src/handlers/createHandler.ts +54 -79
  320. package/src/handlers/gestureHandlerCommon.ts +185 -0
  321. package/src/handlers/gestureHandlerTypesCompat.ts +19 -5
  322. package/src/handlers/gestures/GestureDetector.tsx +519 -0
  323. package/src/handlers/gestures/eventReceiver.ts +151 -0
  324. package/src/handlers/gestures/flingGesture.ts +27 -0
  325. package/src/handlers/gestures/forceTouchGesture.ts +74 -0
  326. package/src/handlers/gestures/gesture.ts +292 -0
  327. package/src/handlers/gestures/gestureComposition.ts +109 -0
  328. package/src/handlers/gestures/gestureObjects.ts +79 -0
  329. package/src/handlers/gestures/gestureStateManager.ts +60 -0
  330. package/src/handlers/gestures/longPressGesture.ts +27 -0
  331. package/src/handlers/gestures/manualGesture.ts +31 -0
  332. package/src/handlers/gestures/nativeGesture.ts +27 -0
  333. package/src/handlers/gestures/panGesture.ts +147 -0
  334. package/src/handlers/gestures/pinchGesture.ts +51 -0
  335. package/src/handlers/gestures/reanimatedWrapper.ts +45 -0
  336. package/src/handlers/gestures/rotationGesture.ts +51 -0
  337. package/src/handlers/gestures/tapGesture.ts +52 -0
  338. package/src/handlers/handlersRegistry.ts +22 -0
  339. package/src/index.ts +57 -17
  340. package/src/init.ts +5 -0
  341. package/src/mocks.ts +42 -2
  342. package/src/utils.ts +7 -0
  343. package/src/web/GestureHandler.ts +1 -2
  344. package/src/web/NodeManager.ts +5 -0
  345. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.java +0 -23
  346. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.java +0 -110
  347. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.java +0 -531
  348. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.java +0 -8
  349. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +0 -543
  350. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.java +0 -10
  351. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.java +0 -29
  352. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.java +0 -53
  353. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.java +0 -81
  354. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.java +0 -110
  355. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.java +0 -8
  356. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +0 -312
  357. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.java +0 -109
  358. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.java +0 -169
  359. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.java +0 -96
  360. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.java +0 -172
  361. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.java +0 -10
  362. package/android/src/main/java/com/facebook/react/views/modal/RNGHModalUtils.java +0 -21
  363. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.java +0 -296
  364. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +0 -72
  365. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +0 -77
  366. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.java +0 -8
  367. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.java +0 -86
  368. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +0 -731
  369. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +0 -31
  370. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +0 -101
  371. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.java +0 -151
  372. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +0 -7
  373. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +0 -76
  374. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +0 -49
  375. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +0 -82
  376. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.java +0 -61
  377. package/lib/commonjs/handlers/gestureHandlers.js +0 -236
  378. package/lib/commonjs/handlers/gestureHandlers.js.map +0 -1
  379. package/lib/module/handlers/gestureHandlers.js +0 -216
  380. package/lib/module/handlers/gestureHandlers.js.map +0 -1
  381. package/lib/typescript/handlers/gestureHandlers.d.ts +0 -158
  382. package/src/handlers/gestureHandlers.ts +0 -511
@@ -0,0 +1,17 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
7
+ import java.util.*
8
+
9
+ class RNGestureHandlerPackage : ReactPackage {
10
+ override fun createNativeModules(reactContext: ReactApplicationContext) =
11
+ listOf<NativeModule>(RNGestureHandlerModule(reactContext))
12
+
13
+ override fun createViewManagers(reactContext: ReactApplicationContext) =
14
+ listOf<ViewManager<*, *>>(
15
+ RNGestureHandlerRootViewManager(),
16
+ RNGestureHandlerButtonViewManager())
17
+ }
@@ -0,0 +1,95 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import android.util.SparseArray
4
+ import android.view.View
5
+ import com.facebook.react.bridge.UiThreadUtil
6
+ import com.swmansion.gesturehandler.GestureHandler
7
+ import com.swmansion.gesturehandler.GestureHandlerRegistry
8
+ import java.util.*
9
+
10
+ class RNGestureHandlerRegistry : GestureHandlerRegistry {
11
+ private val handlers = SparseArray<GestureHandler<*>>()
12
+ private val attachedTo = SparseArray<Int?>()
13
+ private val handlersForView = SparseArray<ArrayList<GestureHandler<*>>>()
14
+
15
+ @Synchronized
16
+ fun registerHandler(handler: GestureHandler<*>) {
17
+ handlers.put(handler.tag, handler)
18
+ }
19
+
20
+ @Synchronized
21
+ fun getHandler(handlerTag: Int): GestureHandler<*>? {
22
+ return handlers[handlerTag]
23
+ }
24
+
25
+ @Synchronized
26
+ fun attachHandlerToView(handlerTag: Int, viewTag: Int, useDeviceEvents: Boolean = false): Boolean {
27
+ val handler = handlers[handlerTag]
28
+ return handler?.let {
29
+ detachHandler(handler)
30
+ handler.usesDeviceEvents = useDeviceEvents
31
+ registerHandlerForViewWithTag(viewTag, handler)
32
+ true
33
+ } ?: false
34
+ }
35
+
36
+ @Synchronized
37
+ private fun registerHandlerForViewWithTag(viewTag: Int, handler: GestureHandler<*>) {
38
+ check(attachedTo[handler.tag] == null) { "Handler $handler already attached" }
39
+ attachedTo.put(handler.tag, viewTag)
40
+ var listToAdd = handlersForView[viewTag]
41
+ if (listToAdd == null) {
42
+ listToAdd = ArrayList(1)
43
+ listToAdd.add(handler)
44
+ handlersForView.put(viewTag, listToAdd)
45
+ } else {
46
+ listToAdd.add(handler)
47
+ }
48
+ }
49
+
50
+ @Synchronized
51
+ private fun detachHandler(handler: GestureHandler<*>) {
52
+ val attachedToView = attachedTo[handler.tag]
53
+ if (attachedToView != null) {
54
+ attachedTo.remove(handler.tag)
55
+ val attachedHandlers = handlersForView[attachedToView]
56
+ if (attachedHandlers != null) {
57
+ attachedHandlers.remove(handler)
58
+ if (attachedHandlers.size == 0) {
59
+ handlersForView.remove(attachedToView)
60
+ }
61
+ }
62
+ }
63
+ if (handler.view != null) {
64
+ // Handler is in "prepared" state which means it is registered in the orchestrator and can
65
+ // receive touch events. This means that before we remove it from the registry we need to
66
+ // "cancel" it so that orchestrator does no longer keep a reference to it.
67
+ UiThreadUtil.runOnUiThread { handler.cancel() }
68
+ }
69
+ }
70
+
71
+ @Synchronized
72
+ fun dropHandler(handlerTag: Int) {
73
+ handlers[handlerTag]?.let {
74
+ detachHandler(it)
75
+ handlers.remove(handlerTag)
76
+ }
77
+ }
78
+
79
+ @Synchronized
80
+ fun dropAllHandlers() {
81
+ handlers.clear()
82
+ attachedTo.clear()
83
+ handlersForView.clear()
84
+ }
85
+
86
+ @Synchronized
87
+ fun getHandlersForViewWithTag(viewTag: Int): ArrayList<GestureHandler<*>>? {
88
+ return handlersForView[viewTag]
89
+ }
90
+
91
+ @Synchronized
92
+ override fun getHandlersForView(view: View): ArrayList<GestureHandler<*>>? {
93
+ return getHandlersForViewWithTag(view.id)
94
+ }
95
+ }
@@ -0,0 +1,132 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import android.os.SystemClock
4
+ import android.util.Log
5
+ import android.view.MotionEvent
6
+ import android.view.ViewGroup
7
+ import android.view.ViewParent
8
+ import com.facebook.react.bridge.ReactContext
9
+ import com.facebook.react.bridge.UiThreadUtil
10
+ import com.facebook.react.common.ReactConstants
11
+ import com.facebook.react.uimanager.RootView
12
+ import com.facebook.react.views.modal.ReactModalHostView
13
+ import com.swmansion.gesturehandler.GestureHandler
14
+ import com.swmansion.gesturehandler.GestureHandlerOrchestrator
15
+
16
+ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView: ViewGroup) {
17
+ private val orchestrator: GestureHandlerOrchestrator?
18
+ private val jsGestureHandler: GestureHandler<*>?
19
+ val rootView: ViewGroup
20
+ private var shouldIntercept = false
21
+ private var passingTouch = false
22
+
23
+ init {
24
+ UiThreadUtil.assertOnUiThread()
25
+ val wrappedViewTag = wrappedView.id
26
+ check(wrappedViewTag >= 1) { "Expect view tag to be set for $wrappedView" }
27
+ val module = context.getNativeModule(RNGestureHandlerModule::class.java)!!
28
+ val registry = module.registry
29
+ rootView = findRootViewTag(wrappedView)
30
+ Log.i(
31
+ ReactConstants.TAG,
32
+ "[GESTURE HANDLER] Initialize gesture handler for root view $rootView")
33
+ orchestrator = GestureHandlerOrchestrator(
34
+ wrappedView, registry, RNViewConfigurationHelper()).apply {
35
+ minimumAlphaForTraversal = MIN_ALPHA_FOR_TOUCH
36
+ }
37
+ jsGestureHandler = RootViewGestureHandler().apply { tag = -wrappedViewTag }
38
+ with(registry) {
39
+ registerHandler(jsGestureHandler)
40
+ attachHandlerToView(jsGestureHandler.tag, wrappedViewTag)
41
+ }
42
+ module.registerRootHelper(this)
43
+ }
44
+
45
+ fun tearDown() {
46
+ Log.i(
47
+ ReactConstants.TAG,
48
+ "[GESTURE HANDLER] Tearing down gesture handler registered for root view $rootView")
49
+ val module = context.getNativeModule(RNGestureHandlerModule::class.java)!!
50
+ with(module) {
51
+ registry.dropHandler(jsGestureHandler!!.tag)
52
+ unregisterRootHelper(this@RNGestureHandlerRootHelper)
53
+ }
54
+ }
55
+
56
+ private inner class RootViewGestureHandler : GestureHandler<RootViewGestureHandler>() {
57
+ override fun onHandle(event: MotionEvent) {
58
+ val currentState = state
59
+ if (currentState == STATE_UNDETERMINED) {
60
+ begin()
61
+ shouldIntercept = false
62
+ }
63
+ if (event.actionMasked == MotionEvent.ACTION_UP) {
64
+ end()
65
+ }
66
+ }
67
+
68
+ override fun onCancel() {
69
+ shouldIntercept = true
70
+ val time = SystemClock.uptimeMillis()
71
+ val event = MotionEvent.obtain(time, time, MotionEvent.ACTION_CANCEL, 0f, 0f, 0).apply {
72
+ action = MotionEvent.ACTION_CANCEL
73
+ }
74
+ if (rootView is RootView) {
75
+ rootView.onChildStartedNativeGesture(event)
76
+ }
77
+ }
78
+ }
79
+
80
+ fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
81
+ // If this method gets called it means that some native view is attempting to grab lock for
82
+ // touch event delivery. In that case we cancel all gesture recognizers
83
+ if (orchestrator != null && !passingTouch) {
84
+ // if we are in the process of delivering touch events via GH orchestrator, we don't want to
85
+ // treat it as a native gesture capturing the lock
86
+ tryCancelAllHandlers()
87
+ }
88
+ }
89
+
90
+ fun dispatchTouchEvent(ev: MotionEvent): Boolean {
91
+ // We mark `mPassingTouch` before we get into `mOrchestrator.onTouchEvent` so that we can tell
92
+ // if `requestDisallow` has been called as a result of a normal gesture handling process or
93
+ // as a result of one of the gesture handlers activating
94
+ passingTouch = true
95
+ orchestrator!!.onTouchEvent(ev)
96
+ passingTouch = false
97
+ return shouldIntercept
98
+ }
99
+
100
+ private fun tryCancelAllHandlers() {
101
+ // In order to cancel handlers we activate handler that is hooked to the root view
102
+ jsGestureHandler?.apply {
103
+ if (state == GestureHandler.STATE_BEGAN) {
104
+ // Try activate main JS handler
105
+ activate()
106
+ end()
107
+ }
108
+ }
109
+ }
110
+
111
+ /*package*/
112
+ fun handleSetJSResponder(viewTag: Int, blockNativeResponder: Boolean) {
113
+ if (blockNativeResponder) {
114
+ UiThreadUtil.runOnUiThread { tryCancelAllHandlers() }
115
+ }
116
+ }
117
+
118
+ companion object {
119
+ private const val MIN_ALPHA_FOR_TOUCH = 0.1f
120
+ private fun findRootViewTag(viewGroup: ViewGroup): ViewGroup {
121
+ UiThreadUtil.assertOnUiThread()
122
+ var parent: ViewParent? = viewGroup
123
+ while (parent != null && parent !is RootView) {
124
+ parent = parent.parent
125
+ }
126
+ checkNotNull(parent) {
127
+ "View $viewGroup has not been mounted under ReactRootView"
128
+ }
129
+ return parent as ViewGroup
130
+ }
131
+ }
132
+ }
@@ -0,0 +1,5 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ interface RNGestureHandlerRootInterface {
4
+ val rootHelper: RNGestureHandlerRootHelper?
5
+ }
@@ -0,0 +1,68 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import android.view.MotionEvent
6
+ import android.view.ViewGroup
7
+ import android.view.ViewParent
8
+ import com.facebook.react.bridge.ReactContext
9
+ import com.facebook.react.bridge.UiThreadUtil
10
+ import com.facebook.react.common.ReactConstants
11
+ import com.facebook.react.uimanager.RootView
12
+ import com.facebook.react.views.modal.ReactModalHostView
13
+ import com.facebook.react.views.view.ReactViewGroup
14
+
15
+ class RNGestureHandlerRootView(context: Context?) : ReactViewGroup(context) {
16
+ private var _enabled = false
17
+ private var rootHelper: RNGestureHandlerRootHelper? = null // TODO: resettable lateinit
18
+ override fun onAttachedToWindow() {
19
+ super.onAttachedToWindow()
20
+ _enabled = !hasGestureHandlerEnabledRootView(this)
21
+ if (!_enabled) {
22
+ Log.i(
23
+ ReactConstants.TAG,
24
+ "[GESTURE HANDLER] Gesture handler is already enabled for a parent view"
25
+ )
26
+ }
27
+ if (_enabled && rootHelper == null) {
28
+ rootHelper = RNGestureHandlerRootHelper(context as ReactContext, this)
29
+ }
30
+ }
31
+
32
+ fun tearDown() {
33
+ rootHelper?.tearDown()
34
+ }
35
+
36
+ override fun dispatchTouchEvent(ev: MotionEvent) =
37
+ if (_enabled && rootHelper!!.dispatchTouchEvent(ev)) {
38
+ true
39
+ } else super.dispatchTouchEvent(ev)
40
+
41
+ override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
42
+ if (_enabled) {
43
+ rootHelper!!.requestDisallowInterceptTouchEvent(disallowIntercept)
44
+ }
45
+ super.requestDisallowInterceptTouchEvent(disallowIntercept)
46
+ }
47
+
48
+ companion object {
49
+ private fun hasGestureHandlerEnabledRootView(viewGroup: ViewGroup): Boolean {
50
+ UiThreadUtil.assertOnUiThread()
51
+
52
+ var parent = viewGroup.parent
53
+ while (parent != null) {
54
+ if (parent is RNGestureHandlerEnabledRootView || parent is RNGestureHandlerRootView) {
55
+ return true
56
+ }
57
+ // Checks other roots views but it's mainly for ReactModalHostView.DialogRootViewGroup
58
+ // since modals are outside RN hierachy and we have to initialize GH's root view for it
59
+ // Note that RNGestureHandlerEnabledRootView implements RootView - that's why this check has to be below
60
+ if (parent is RootView) {
61
+ return false
62
+ }
63
+ parent = parent.parent
64
+ }
65
+ return false
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,34 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import com.facebook.react.module.annotations.ReactModule
4
+ import com.facebook.react.uimanager.ThemedReactContext
5
+ import com.facebook.react.uimanager.ViewGroupManager
6
+
7
+ /**
8
+ * React native's view manager used for creating instances of []RNGestureHandlerRootView}. It
9
+ * is being used by projects using react-native-navigation where for each screen new root view need
10
+ * to be provided.
11
+ */
12
+ @ReactModule(name = RNGestureHandlerRootViewManager.REACT_CLASS)
13
+ class RNGestureHandlerRootViewManager : ViewGroupManager<RNGestureHandlerRootView>() {
14
+ override fun getName() = REACT_CLASS
15
+ override fun createViewInstance(reactContext: ThemedReactContext) = RNGestureHandlerRootView(reactContext)
16
+
17
+ override fun onDropViewInstance(view: RNGestureHandlerRootView) {
18
+ view.tearDown()
19
+ }
20
+
21
+ /**
22
+ * The following event configuration is necessary even if you are not using
23
+ * GestureHandlerRootView component directly.
24
+ */
25
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Map<String, String>> = mutableMapOf(
26
+ RNGestureHandlerEvent.EVENT_NAME to
27
+ mutableMapOf("registrationName" to RNGestureHandlerEvent.EVENT_NAME),
28
+ RNGestureHandlerStateChangeEvent.EVENT_NAME to
29
+ mutableMapOf("registrationName" to RNGestureHandlerStateChangeEvent.EVENT_NAME))
30
+
31
+ companion object {
32
+ const val REACT_CLASS = "GestureHandlerRootView"
33
+ }
34
+ }
@@ -0,0 +1,66 @@
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 RNGestureHandlerStateChangeEvent private constructor() : Event<RNGestureHandlerStateChangeEvent>() {
11
+ private var extraData: WritableMap? = null
12
+ private fun <T : GestureHandler<T>> init(
13
+ handler: T,
14
+ newState: Int,
15
+ oldState: Int,
16
+ dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
17
+ ) {
18
+ super.init(handler.view!!.id)
19
+ extraData = createEventData(handler, dataExtractor, newState, oldState)
20
+ }
21
+
22
+ override fun onDispose() {
23
+ extraData = null
24
+ EVENTS_POOL.release(this)
25
+ }
26
+
27
+ override fun getEventName() = EVENT_NAME
28
+
29
+ // TODO: coalescing
30
+ override fun canCoalesce() = false
31
+
32
+ // TODO: coalescing
33
+ override fun getCoalescingKey(): Short = 0
34
+
35
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
36
+ rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData)
37
+ }
38
+
39
+ companion object {
40
+ const val EVENT_NAME = "onGestureHandlerStateChange"
41
+ private const val TOUCH_EVENTS_POOL_SIZE = 7 // magic
42
+ private val EVENTS_POOL = Pools.SynchronizedPool<RNGestureHandlerStateChangeEvent>(TOUCH_EVENTS_POOL_SIZE)
43
+
44
+ fun <T : GestureHandler<T>> obtain(
45
+ handler: T,
46
+ newState: Int,
47
+ oldState: Int,
48
+ dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
49
+ ): RNGestureHandlerStateChangeEvent =
50
+ (EVENTS_POOL.acquire() ?: RNGestureHandlerStateChangeEvent()).apply {
51
+ init(handler, newState, oldState, dataExtractor)
52
+ }
53
+
54
+ fun <T: GestureHandler<T>> createEventData(
55
+ handler: T,
56
+ dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
57
+ newState: Int,
58
+ oldState: Int,
59
+ ): WritableMap = Arguments.createMap().apply {
60
+ dataExtractor?.extractEventData(handler, this)
61
+ putInt("handlerTag", handler.tag)
62
+ putInt("state", newState)
63
+ putInt("oldState", oldState)
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,69 @@
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 RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerTouchEvent>() {
11
+ private var extraData: WritableMap? = null
12
+ private var coalescingKey: Short = 0
13
+ private fun <T : GestureHandler<T>> init(handler: T) {
14
+ super.init(handler.view!!.id)
15
+ extraData = createEventData(handler)
16
+ coalescingKey = handler.eventCoalescingKey
17
+ }
18
+
19
+ override fun onDispose() {
20
+ extraData = null
21
+ EVENTS_POOL.release(this)
22
+ }
23
+
24
+ override fun getEventName() = EVENT_NAME
25
+
26
+ override fun canCoalesce() = true
27
+
28
+ override fun getCoalescingKey() = coalescingKey
29
+
30
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
31
+ rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData)
32
+ }
33
+
34
+ companion object {
35
+ const val EVENT_UNDETERMINED = 0
36
+ const val EVENT_TOUCH_DOWN = 1
37
+ const val EVENT_TOUCH_MOVE = 2
38
+ const val EVENT_TOUCH_UP = 3
39
+ const val EVENT_TOUCH_CANCELLED = 4
40
+
41
+ const val EVENT_NAME = "onGestureHandlerEvent"
42
+ private const val TOUCH_EVENTS_POOL_SIZE = 7 // magic
43
+ private val EVENTS_POOL = Pools.SynchronizedPool<RNGestureHandlerTouchEvent>(TOUCH_EVENTS_POOL_SIZE)
44
+
45
+ fun <T : GestureHandler<T>> obtain(handler: T): RNGestureHandlerTouchEvent =
46
+ (EVENTS_POOL.acquire() ?: RNGestureHandlerTouchEvent()).apply {
47
+ init(handler)
48
+ }
49
+
50
+ fun <T: GestureHandler<T>> createEventData(handler: T,): WritableMap = Arguments.createMap().apply {
51
+ putInt("handlerTag", handler.tag)
52
+ putInt("state", handler.state)
53
+ putInt("numberOfTouches", handler.trackedPointersCount)
54
+ putInt("eventType", handler.touchEventType)
55
+
56
+ handler.consumeChangedTouchesPayload()?.let {
57
+ putArray("changedTouches", it)
58
+ }
59
+
60
+ handler.consumeAllTouchesPayload()?.let {
61
+ putArray("allTouches", it)
62
+ }
63
+
64
+ if (handler.isAwaiting && handler.state == GestureHandler.STATE_ACTIVE) {
65
+ putInt("state", GestureHandler.STATE_BEGAN)
66
+ }
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,51 @@
1
+ package com.swmansion.gesturehandler.react
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import com.facebook.react.uimanager.PointerEvents
6
+ import com.facebook.react.uimanager.ReactPointerEventsView
7
+ import com.facebook.react.views.view.ReactViewGroup
8
+ import com.swmansion.gesturehandler.PointerEventsConfig
9
+ import com.swmansion.gesturehandler.ViewConfigurationHelper
10
+
11
+ class RNViewConfigurationHelper : ViewConfigurationHelper {
12
+ override fun getPointerEventsConfigForView(view: View): PointerEventsConfig {
13
+ val pointerEvents: PointerEvents =
14
+ if (view is ReactPointerEventsView) {
15
+ (view as ReactPointerEventsView).pointerEvents
16
+ } else PointerEvents.AUTO
17
+
18
+ // Views that are disabled should never be the target of pointer events. However, their children
19
+ // can be because some views (SwipeRefreshLayout) use enabled but still have children that can
20
+ // be valid targets.
21
+ if (!view.isEnabled) {
22
+ if (pointerEvents == PointerEvents.AUTO) {
23
+ return PointerEventsConfig.BOX_NONE
24
+ } else if (pointerEvents == PointerEvents.BOX_ONLY) {
25
+ return PointerEventsConfig.NONE
26
+ }
27
+ }
28
+
29
+ return when (pointerEvents) {
30
+ PointerEvents.BOX_ONLY -> PointerEventsConfig.BOX_ONLY
31
+ PointerEvents.BOX_NONE -> PointerEventsConfig.BOX_NONE
32
+ PointerEvents.NONE -> PointerEventsConfig.NONE
33
+ PointerEvents.AUTO -> PointerEventsConfig.AUTO
34
+ }
35
+ }
36
+
37
+ override fun getChildInDrawingOrderAtIndex(parent: ViewGroup, index: Int): View {
38
+ return if (parent is ReactViewGroup) {
39
+ parent.getChildAt(parent.getZIndexMappedChildIndex(index))
40
+ } else parent.getChildAt(index)
41
+ }
42
+
43
+ override fun isViewClippingChildren(view: ViewGroup): Boolean {
44
+ if (view.clipChildren) {
45
+ return true
46
+ }
47
+ return if (view is ReactViewGroup) {
48
+ "hidden" == view.overflow
49
+ } else false
50
+ }
51
+ }
@@ -1,14 +1,78 @@
1
1
  #import "RNFlingHandler.h"
2
2
 
3
+ @interface RNBetterSwipeGestureRecognizer : UISwipeGestureRecognizer
4
+
5
+ - (id)initWithGestureHandler:(RNGestureHandler*)gestureHandler;
6
+
7
+ @end
8
+
9
+ @implementation RNBetterSwipeGestureRecognizer {
10
+ __weak RNGestureHandler* _gestureHandler;
11
+ }
12
+
13
+ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
14
+ {
15
+ if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
16
+ _gestureHandler = gestureHandler;
17
+ }
18
+ return self;
19
+ }
20
+
21
+ - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
22
+ {
23
+ [_gestureHandler reset];
24
+ [self triggerAction];
25
+ [super touchesBegan:touches withEvent:event];
26
+ [_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
27
+ }
28
+
29
+ - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
30
+ {
31
+ [super touchesMoved:touches withEvent:event];
32
+ [_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
33
+ }
34
+
35
+ - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
36
+ {
37
+ [super touchesEnded:touches withEvent:event];
38
+ [_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
39
+ }
40
+
41
+ - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
42
+ {
43
+ [super touchesCancelled:touches withEvent:event];
44
+ [_gestureHandler.pointerTracker touchesCancelled:touches withEvent:event];
45
+ }
46
+
47
+ - (void)triggerAction
48
+ {
49
+ [_gestureHandler handleGesture:self];
50
+ }
51
+
52
+ - (void)reset
53
+ {
54
+ [self triggerAction];
55
+ [_gestureHandler.pointerTracker reset];
56
+ [super reset];
57
+ }
58
+
59
+ @end
60
+
3
61
  @implementation RNFlingGestureHandler
4
62
 
5
63
  - (instancetype)initWithTag:(NSNumber *)tag
6
64
  {
7
- if ((self = [super initWithTag:tag])) {
8
- _recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
9
-
10
- }
11
- return self;
65
+ if ((self = [super initWithTag:tag])) {
66
+ _recognizer = [[RNBetterSwipeGestureRecognizer alloc] initWithGestureHandler:self];
67
+ }
68
+ return self;
69
+ }
70
+ - (void)resetConfig
71
+ {
72
+ [super resetConfig];
73
+ UISwipeGestureRecognizer *recognizer = (UISwipeGestureRecognizer *)_recognizer;
74
+ recognizer.direction = UISwipeGestureRecognizerDirectionRight;
75
+ recognizer.numberOfTouchesRequired = 1;
12
76
  }
13
77
 
14
78
  - (void)configure:(NSDictionary *)config
@@ -29,5 +93,14 @@
29
93
  #endif
30
94
  }
31
95
 
96
+ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
97
+ {
98
+ RNGestureHandlerState savedState = _lastState;
99
+ BOOL shouldBegin = [super gestureRecognizerShouldBegin:gestureRecognizer];
100
+ _lastState = savedState;
101
+
102
+ return shouldBegin;
103
+ }
104
+
32
105
  @end
33
106