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