react-native-gesture-handler 1.10.3 → 2.1.2

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