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,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
+ }