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,713 @@
1
+ package com.swmansion.gesturehandler
2
+
3
+ import android.view.MotionEvent
4
+ import android.view.MotionEvent.PointerCoords
5
+ import android.view.MotionEvent.PointerProperties
6
+ import android.view.View
7
+ import com.facebook.react.bridge.Arguments
8
+ import com.facebook.react.bridge.UiThreadUtil
9
+ import com.facebook.react.bridge.WritableArray
10
+ import com.facebook.react.uimanager.PixelUtil
11
+ import com.swmansion.gesturehandler.react.RNGestureHandlerTouchEvent
12
+ import java.lang.IllegalStateException
13
+ import java.util.*
14
+
15
+ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestureHandlerT>> {
16
+ private val trackedPointerIDs = IntArray(MAX_POINTERS_COUNT)
17
+ private var trackedPointersIDsCount = 0
18
+ var tag = 0
19
+ var view: View? = null
20
+ private set
21
+ var state = STATE_UNDETERMINED
22
+ private set
23
+ var x = 0f
24
+ private set
25
+ var y = 0f
26
+ private set
27
+ var isWithinBounds = false
28
+ private set
29
+ var isEnabled = true
30
+ private set
31
+ var usesDeviceEvents = false
32
+
33
+ var changedTouchesPayload: WritableArray? = null
34
+ private set
35
+ var allTouchesPayload: WritableArray? = null
36
+ private set
37
+ var touchEventType = RNGestureHandlerTouchEvent.EVENT_UNDETERMINED
38
+ private set
39
+ var trackedPointersCount = 0
40
+ private set
41
+ private val trackedPointers: Array<PointerData?> = Array(MAX_POINTERS_COUNT) { null }
42
+ var needsPointerData = false
43
+
44
+
45
+ private var hitSlop: FloatArray? = null
46
+ var eventCoalescingKey: Short = 0
47
+ private set
48
+ var lastAbsolutePositionX = 0f
49
+ private set
50
+ var lastAbsolutePositionY = 0f
51
+ private set
52
+
53
+ private var manualActivation = false
54
+
55
+ private var lastEventOffsetX = 0f
56
+ private var lastEventOffsetY = 0f
57
+ private var shouldCancelWhenOutside = false
58
+ var numberOfPointers = 0
59
+ private set
60
+ private var orchestrator: GestureHandlerOrchestrator? = null
61
+ private var onTouchEventListener: OnTouchEventListener? = null
62
+ private var interactionController: GestureHandlerInteractionController? = null
63
+
64
+ @Suppress("UNCHECKED_CAST")
65
+ protected fun self(): ConcreteGestureHandlerT = this as ConcreteGestureHandlerT
66
+
67
+ protected inline fun applySelf(block: ConcreteGestureHandlerT.() -> Unit): ConcreteGestureHandlerT =
68
+ self().apply { block() }
69
+
70
+ // set and accessed only by the orchestrator
71
+ var activationIndex = 0
72
+
73
+ // set and accessed only by the orchestrator
74
+ var isActive = false
75
+
76
+ // set and accessed only by the orchestrator
77
+ var isAwaiting = false
78
+
79
+ open fun dispatchStateChange(newState: Int, prevState: Int) {
80
+ onTouchEventListener?.onStateChange(self(), newState, prevState)
81
+ }
82
+
83
+ open fun dispatchHandlerUpdate(event: MotionEvent) {
84
+ onTouchEventListener?.onHandlerUpdate(self(), event)
85
+ }
86
+
87
+ open fun dispatchTouchEvent() {
88
+ if (changedTouchesPayload != null) {
89
+ onTouchEventListener?.onTouchEvent(self())
90
+ }
91
+ }
92
+
93
+ open fun resetConfig() {
94
+ needsPointerData = false
95
+ manualActivation = false
96
+ shouldCancelWhenOutside = false
97
+ isEnabled = true
98
+ hitSlop = null
99
+ }
100
+
101
+ fun hasCommonPointers(other: GestureHandler<*>): Boolean {
102
+ for (i in trackedPointerIDs.indices) {
103
+ if (trackedPointerIDs[i] != -1 && other.trackedPointerIDs[i] != -1) {
104
+ return true
105
+ }
106
+ }
107
+ return false
108
+ }
109
+
110
+ fun setShouldCancelWhenOutside(shouldCancelWhenOutside: Boolean): ConcreteGestureHandlerT =
111
+ applySelf { this.shouldCancelWhenOutside = shouldCancelWhenOutside }
112
+
113
+ fun setEnabled(enabled: Boolean): ConcreteGestureHandlerT = applySelf {
114
+ // Don't cancel handler when not changing the value of the isEnabled, executing it always caused
115
+ // handlers to be cancelled on re-render because that's the moment when the config is updated.
116
+ // If the enabled prop "changed" from true to true the handler would get cancelled.
117
+ if (view != null && isEnabled != enabled) {
118
+ // If view is set then handler is in "active" state. In that case we want to "cancel" handler
119
+ // when it changes enabled state so that it gets cleared from the orchestrator
120
+ UiThreadUtil.runOnUiThread { cancel() }
121
+ }
122
+ isEnabled = enabled
123
+ }
124
+
125
+ fun setManualActivation(manualActivation: Boolean): ConcreteGestureHandlerT =
126
+ applySelf { this.manualActivation = manualActivation }
127
+
128
+ fun setHitSlop(
129
+ leftPad: Float, topPad: Float, rightPad: Float, bottomPad: Float,
130
+ width: Float, height: Float,
131
+ ): ConcreteGestureHandlerT = applySelf {
132
+ if (hitSlop == null) {
133
+ hitSlop = FloatArray(6)
134
+ }
135
+ hitSlop!![HIT_SLOP_LEFT_IDX] = leftPad
136
+ hitSlop!![HIT_SLOP_TOP_IDX] = topPad
137
+ hitSlop!![HIT_SLOP_RIGHT_IDX] = rightPad
138
+ hitSlop!![HIT_SLOP_BOTTOM_IDX] = bottomPad
139
+ hitSlop!![HIT_SLOP_WIDTH_IDX] = width
140
+ hitSlop!![HIT_SLOP_HEIGHT_IDX] = height
141
+ require(!(hitSlopSet(width) && hitSlopSet(leftPad) && hitSlopSet(rightPad))) { "Cannot have all of left, right and width defined" }
142
+ require(!(hitSlopSet(width) && !hitSlopSet(leftPad) && !hitSlopSet(rightPad))) { "When width is set one of left or right pads need to be defined" }
143
+ require(!(hitSlopSet(height) && hitSlopSet(bottomPad) && hitSlopSet(topPad))) { "Cannot have all of top, bottom and height defined" }
144
+ require(!(hitSlopSet(height) && !hitSlopSet(bottomPad) && !hitSlopSet(topPad))) { "When height is set one of top or bottom pads need to be defined" }
145
+ }
146
+
147
+ fun setHitSlop(padding: Float): ConcreteGestureHandlerT {
148
+ return setHitSlop(padding, padding, padding, padding, HIT_SLOP_NONE, HIT_SLOP_NONE)
149
+ }
150
+
151
+ fun setInteractionController(controller: GestureHandlerInteractionController?): ConcreteGestureHandlerT =
152
+ applySelf { interactionController = controller }
153
+
154
+ fun prepare(view: View?, orchestrator: GestureHandlerOrchestrator?) {
155
+ check(!(this.view != null || this.orchestrator != null)) { "Already prepared or hasn't been reset" }
156
+ Arrays.fill(trackedPointerIDs, -1)
157
+ trackedPointersIDsCount = 0
158
+ state = STATE_UNDETERMINED
159
+ this.view = view
160
+ this.orchestrator = orchestrator
161
+ }
162
+
163
+ private fun findNextLocalPointerId(): Int {
164
+ var localPointerId = 0
165
+ while (localPointerId < trackedPointersIDsCount) {
166
+ var i = 0
167
+ while (i < trackedPointerIDs.size) {
168
+ if (trackedPointerIDs[i] == localPointerId) {
169
+ break
170
+ }
171
+ i++
172
+ }
173
+ if (i == trackedPointerIDs.size) {
174
+ return localPointerId
175
+ }
176
+ localPointerId++
177
+ }
178
+ return localPointerId
179
+ }
180
+
181
+ fun startTrackingPointer(pointerId: Int) {
182
+ if (trackedPointerIDs[pointerId] == -1) {
183
+ trackedPointerIDs[pointerId] = findNextLocalPointerId()
184
+ trackedPointersIDsCount++
185
+ }
186
+ }
187
+
188
+ fun stopTrackingPointer(pointerId: Int) {
189
+ if (trackedPointerIDs[pointerId] != -1) {
190
+ trackedPointerIDs[pointerId] = -1
191
+ trackedPointersIDsCount--
192
+ }
193
+ }
194
+
195
+ private fun needAdapt(event: MotionEvent): Boolean {
196
+ if (event.pointerCount != trackedPointersIDsCount) {
197
+ return true
198
+ }
199
+
200
+ for (i in trackedPointerIDs.indices) {
201
+ val trackedPointer = trackedPointerIDs[i]
202
+ if (trackedPointer != -1 && trackedPointer != i) {
203
+ return true
204
+ }
205
+ }
206
+ return false
207
+ }
208
+
209
+ private fun adaptEvent(event: MotionEvent): MotionEvent {
210
+ if (!needAdapt(event)) {
211
+ return event
212
+ }
213
+ var action = event.actionMasked
214
+ var actionIndex = -1
215
+ if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN) {
216
+ actionIndex = event.actionIndex
217
+ val actionPointer = event.getPointerId(actionIndex)
218
+ action = if (trackedPointerIDs[actionPointer] != -1) {
219
+ if (trackedPointersIDsCount == 1) MotionEvent.ACTION_DOWN else MotionEvent.ACTION_POINTER_DOWN
220
+ } else {
221
+ MotionEvent.ACTION_MOVE
222
+ }
223
+ } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) {
224
+ actionIndex = event.actionIndex
225
+ val actionPointer = event.getPointerId(actionIndex)
226
+ action = if (trackedPointerIDs[actionPointer] != -1) {
227
+ if (trackedPointersIDsCount == 1) MotionEvent.ACTION_UP else MotionEvent.ACTION_POINTER_UP
228
+ } else {
229
+ MotionEvent.ACTION_MOVE
230
+ }
231
+ }
232
+ initPointerProps(trackedPointersIDsCount)
233
+ var count = 0
234
+ val oldX = event.x
235
+ val oldY = event.y
236
+ event.setLocation(event.rawX, event.rawY)
237
+ var index = 0
238
+ val size = event.pointerCount
239
+ while (index < size) {
240
+ val origPointerId = event.getPointerId(index)
241
+ if (trackedPointerIDs[origPointerId] != -1) {
242
+ event.getPointerProperties(index, pointerProps[count])
243
+ pointerProps[count]!!.id = trackedPointerIDs[origPointerId]
244
+ event.getPointerCoords(index, pointerCoords[count])
245
+ if (index == actionIndex) {
246
+ action = action or (count shl MotionEvent.ACTION_POINTER_INDEX_SHIFT)
247
+ }
248
+ count++
249
+ }
250
+ index++
251
+ }
252
+
253
+ // introduced in 1.11.0, remove if crashes are not reported
254
+ if(pointerProps.isEmpty()|| pointerCoords.isEmpty()){
255
+ throw IllegalStateException("pointerCoords.size=${pointerCoords.size}, pointerProps.size=${pointerProps.size}")
256
+ }
257
+
258
+ val result: MotionEvent
259
+ try {
260
+ result = MotionEvent.obtain(
261
+ event.downTime,
262
+ event.eventTime,
263
+ action,
264
+ count,
265
+ pointerProps, /* props are copied and hence it is safe to use static array here */
266
+ pointerCoords, /* same applies to coords */
267
+ event.metaState,
268
+ event.buttonState,
269
+ event.xPrecision,
270
+ event.yPrecision,
271
+ event.deviceId,
272
+ event.edgeFlags,
273
+ event.source,
274
+ event.flags
275
+ )
276
+ } catch (e: IllegalArgumentException) {
277
+ throw AdaptEventException(this, event, e)
278
+ }
279
+ event.setLocation(oldX, oldY)
280
+ result.setLocation(oldX, oldY)
281
+ return result
282
+ }
283
+
284
+ // exception to help debug https://github.com/software-mansion/react-native-gesture-handler/issues/1188
285
+ class AdaptEventException(
286
+ handler: GestureHandler<*>,
287
+ event: MotionEvent,
288
+ e: IllegalArgumentException
289
+ ) : Exception("""
290
+ handler: ${handler::class.simpleName}
291
+ state: ${handler.state}
292
+ view: ${handler.view}
293
+ orchestrator: ${handler.orchestrator}
294
+ isEnabled: ${handler.isEnabled}
295
+ isActive: ${handler.isActive}
296
+ isAwaiting: ${handler.isAwaiting}
297
+ trackedPointersCount: ${handler.trackedPointersCount}
298
+ trackedPointers: ${handler.trackedPointerIDs.joinToString(separator = ", ")}
299
+ while handling event: $event
300
+ """.trimIndent(), e) {}
301
+
302
+ fun handle(origEvent: MotionEvent) {
303
+ if (!isEnabled
304
+ || state == STATE_CANCELLED
305
+ || state == STATE_FAILED
306
+ || state == STATE_END
307
+ || trackedPointersIDsCount < 1) {
308
+ return
309
+ }
310
+ val event = adaptEvent(origEvent)
311
+ x = event.x
312
+ y = event.y
313
+ numberOfPointers = event.pointerCount
314
+ isWithinBounds = isWithinBounds(view, x, y)
315
+ if (shouldCancelWhenOutside && !isWithinBounds) {
316
+ if (state == STATE_ACTIVE) {
317
+ cancel()
318
+ } else if (state == STATE_BEGAN) {
319
+ fail()
320
+ }
321
+ return
322
+ }
323
+ lastAbsolutePositionX = GestureUtils.getLastPointerX(event, true)
324
+ lastAbsolutePositionY = GestureUtils.getLastPointerY(event, true)
325
+ lastEventOffsetX = event.rawX - event.x
326
+ lastEventOffsetY = event.rawY - event.y
327
+ onHandle(event)
328
+ if (event != origEvent) {
329
+ event.recycle()
330
+ }
331
+ }
332
+
333
+ private fun dispatchTouchDownEvent(event: MotionEvent) {
334
+ changedTouchesPayload = null
335
+ touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_DOWN
336
+ val pointerId = event.getPointerId(event.actionIndex)
337
+ val offsetX = event.rawX - event.x
338
+ val offsetY = event.rawY - event.y
339
+
340
+ trackedPointers[pointerId] = PointerData(
341
+ pointerId,
342
+ event.getX(event.actionIndex),
343
+ event.getY(event.actionIndex),
344
+ event.getX(event.actionIndex) + offsetX,
345
+ event.getY(event.actionIndex) + offsetY,
346
+ )
347
+ trackedPointersCount++
348
+ addChangedPointer(trackedPointers[pointerId]!!)
349
+ extractAllPointersData()
350
+
351
+ dispatchTouchEvent()
352
+ }
353
+
354
+ private fun dispatchTouchUpEvent(event: MotionEvent) {
355
+ extractAllPointersData()
356
+ changedTouchesPayload = null
357
+ touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_UP
358
+ val pointerId = event.getPointerId(event.actionIndex)
359
+ val offsetX = event.rawX - event.x
360
+ val offsetY = event.rawY - event.y
361
+
362
+ trackedPointers[pointerId] = PointerData(
363
+ pointerId,
364
+ event.getX(event.actionIndex),
365
+ event.getY(event.actionIndex),
366
+ event.getX(event.actionIndex) + offsetX,
367
+ event.getY(event.actionIndex) + offsetY,
368
+ )
369
+ addChangedPointer(trackedPointers[pointerId]!!)
370
+ trackedPointers[pointerId] = null
371
+ trackedPointersCount--
372
+
373
+ dispatchTouchEvent()
374
+ }
375
+
376
+ private fun dispatchTouchMoveEvent(event: MotionEvent) {
377
+ changedTouchesPayload = null
378
+ touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_MOVE
379
+ val offsetX = event.rawX - event.x
380
+ val offsetY = event.rawY - event.y
381
+ var pointersAdded = 0
382
+
383
+ for (i in 0 until event.pointerCount) {
384
+ val pointerId = event.getPointerId(i)
385
+ val pointer = trackedPointers[pointerId] ?: continue
386
+
387
+ if (pointer.x != event.getX(i) || pointer.y != event.getY(i)) {
388
+ pointer.x = event.getX(i)
389
+ pointer.y = event.getY(i)
390
+ pointer.absoluteX = event.getX(i) + offsetX
391
+ pointer.absoluteY = event.getY(i) + offsetY
392
+
393
+ addChangedPointer(pointer)
394
+ pointersAdded++
395
+ }
396
+ }
397
+
398
+ // only data about pointers that have changed their position is sent, it makes no sense to send
399
+ // an empty move event (especially when this method is called during down/up event and there is
400
+ // only info about one pointer)
401
+ if (pointersAdded > 0) {
402
+ extractAllPointersData()
403
+ dispatchTouchEvent()
404
+ }
405
+ }
406
+
407
+ fun updatePointerData(event: MotionEvent) {
408
+ if (event.actionMasked == MotionEvent.ACTION_DOWN || event.actionMasked == MotionEvent.ACTION_POINTER_DOWN) {
409
+ dispatchTouchDownEvent(event)
410
+ dispatchTouchMoveEvent(event)
411
+ } else if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_POINTER_UP) {
412
+ dispatchTouchMoveEvent(event)
413
+ dispatchTouchUpEvent(event)
414
+ } else if (event.actionMasked == MotionEvent.ACTION_MOVE) {
415
+ dispatchTouchMoveEvent(event)
416
+ }
417
+ }
418
+
419
+ private fun extractAllPointersData() {
420
+ allTouchesPayload = null
421
+
422
+ for (pointerData in trackedPointers) {
423
+ if (pointerData != null) {
424
+ addPointerToAll(pointerData)
425
+ }
426
+ }
427
+ }
428
+
429
+ private fun cancelPointers() {
430
+ touchEventType = RNGestureHandlerTouchEvent.EVENT_TOUCH_CANCELLED
431
+ changedTouchesPayload = null
432
+ extractAllPointersData()
433
+
434
+ for (pointer in trackedPointers) {
435
+ pointer?.let {
436
+ addChangedPointer(it)
437
+ }
438
+ }
439
+
440
+ trackedPointersCount = 0
441
+ trackedPointers.fill(null)
442
+
443
+ dispatchTouchEvent()
444
+ }
445
+
446
+ private fun addChangedPointer(pointerData: PointerData) {
447
+ if (changedTouchesPayload == null) {
448
+ changedTouchesPayload = Arguments.createArray()
449
+ }
450
+
451
+ changedTouchesPayload!!.pushMap(createPointerData(pointerData))
452
+ }
453
+
454
+ private fun addPointerToAll(pointerData: PointerData) {
455
+ if (allTouchesPayload == null) {
456
+ allTouchesPayload = Arguments.createArray()
457
+ }
458
+
459
+ allTouchesPayload!!.pushMap(createPointerData(pointerData))
460
+ }
461
+
462
+ private fun createPointerData(pointerData: PointerData) = Arguments.createMap().apply {
463
+ putInt("id", pointerData.pointerId)
464
+ putDouble("x", PixelUtil.toDIPFromPixel(pointerData.x).toDouble())
465
+ putDouble("y", PixelUtil.toDIPFromPixel(pointerData.y).toDouble())
466
+ putDouble("absoluteX", PixelUtil.toDIPFromPixel(pointerData.absoluteX).toDouble())
467
+ putDouble("absoluteY", PixelUtil.toDIPFromPixel(pointerData.absoluteY).toDouble())
468
+ }
469
+
470
+ fun consumeChangedTouchesPayload(): WritableArray? {
471
+ val result = changedTouchesPayload
472
+ changedTouchesPayload = null
473
+ return result
474
+ }
475
+
476
+ fun consumeAllTouchesPayload(): WritableArray? {
477
+ val result = allTouchesPayload
478
+ allTouchesPayload = null
479
+ return result
480
+ }
481
+
482
+ private fun moveToState(newState: Int) {
483
+ UiThreadUtil.assertOnUiThread()
484
+ if (state == newState) {
485
+ return
486
+ }
487
+
488
+ // if there are tracked pointers and the gesture is about to end, send event cancelling all pointers
489
+ if (trackedPointersCount > 0 && (newState == STATE_END || newState == STATE_CANCELLED || newState == STATE_FAILED)) {
490
+ cancelPointers()
491
+ }
492
+
493
+ val oldState = state
494
+ state = newState
495
+ if (state == STATE_ACTIVE) {
496
+ // Generate a unique coalescing-key each time the gesture-handler becomes active. All events will have
497
+ // the same coalescing-key allowing EventDispatcher to coalesce RNGestureHandlerEvents when events are
498
+ // generated faster than they can be treated by JS thread
499
+ eventCoalescingKey = nextEventCoalescingKey++
500
+ }
501
+ orchestrator!!.onHandlerStateChange(this, newState, oldState)
502
+ onStateChange(newState, oldState)
503
+ }
504
+
505
+ fun wantEvents(): Boolean {
506
+ return isEnabled
507
+ && state != STATE_FAILED
508
+ && state != STATE_CANCELLED
509
+ && state != STATE_END
510
+ && trackedPointersIDsCount > 0
511
+ }
512
+
513
+ open fun shouldRequireToWaitForFailure(handler: GestureHandler<*>): Boolean {
514
+ if (handler === this) {
515
+ return false
516
+ }
517
+
518
+ return interactionController?.shouldRequireHandlerToWaitForFailure(this, handler) ?: false
519
+ }
520
+
521
+ fun shouldWaitForHandlerFailure(handler: GestureHandler<*>): Boolean {
522
+ if (handler === this) {
523
+ return false
524
+ }
525
+
526
+ return interactionController?.shouldWaitForHandlerFailure(this, handler) ?: false
527
+ }
528
+
529
+ open fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
530
+ if (handler === this) {
531
+ return true
532
+ }
533
+
534
+ return interactionController?.shouldRecognizeSimultaneously(this, handler) ?: false
535
+ }
536
+
537
+ open fun shouldBeCancelledBy(handler: GestureHandler<*>): Boolean {
538
+ if (handler === this) {
539
+ return false
540
+ }
541
+
542
+ return interactionController?.shouldHandlerBeCancelledBy(this, handler) ?: false
543
+ }
544
+
545
+ fun isWithinBounds(view: View?, posX: Float, posY: Float): Boolean {
546
+ var left = 0f
547
+ var top = 0f
548
+ var right = view!!.width.toFloat()
549
+ var bottom = view.height.toFloat()
550
+ if (hitSlop != null) {
551
+ val padLeft = hitSlop!![HIT_SLOP_LEFT_IDX]
552
+ val padTop = hitSlop!![HIT_SLOP_TOP_IDX]
553
+ val padRight = hitSlop!![HIT_SLOP_RIGHT_IDX]
554
+ val padBottom = hitSlop!![HIT_SLOP_BOTTOM_IDX]
555
+ if (hitSlopSet(padLeft)) {
556
+ left -= padLeft
557
+ }
558
+ if (hitSlopSet(padTop)) {
559
+ top -= padTop
560
+ }
561
+ if (hitSlopSet(padRight)) {
562
+ right += padRight
563
+ }
564
+ if (hitSlopSet(padBottom)) {
565
+ bottom += padBottom
566
+ }
567
+ val width = hitSlop!![HIT_SLOP_WIDTH_IDX]
568
+ val height = hitSlop!![HIT_SLOP_HEIGHT_IDX]
569
+ if (hitSlopSet(width)) {
570
+ if (!hitSlopSet(padLeft)) {
571
+ left = right - width
572
+ } else if (!hitSlopSet(padRight)) {
573
+ right = left + width
574
+ }
575
+ }
576
+ if (hitSlopSet(height)) {
577
+ if (!hitSlopSet(padTop)) {
578
+ top = bottom - height
579
+ } else if (!hitSlopSet(padBottom)) {
580
+ bottom = top + height
581
+ }
582
+ }
583
+ }
584
+ return posX in left..right && posY in top..bottom
585
+ }
586
+
587
+ fun cancel() {
588
+ if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN) {
589
+ onCancel()
590
+ moveToState(STATE_CANCELLED)
591
+ }
592
+ }
593
+
594
+ fun fail() {
595
+ if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN) {
596
+ moveToState(STATE_FAILED)
597
+ }
598
+ }
599
+
600
+ fun activate() = activate(force = false)
601
+
602
+ open fun activate(force: Boolean) {
603
+ if ((!manualActivation || force) && (state == STATE_UNDETERMINED || state == STATE_BEGAN)) {
604
+ moveToState(STATE_ACTIVE)
605
+ }
606
+ }
607
+
608
+ fun begin() {
609
+ if (state == STATE_UNDETERMINED) {
610
+ moveToState(STATE_BEGAN)
611
+ }
612
+ }
613
+
614
+ fun end() {
615
+ if (state == STATE_BEGAN || state == STATE_ACTIVE) {
616
+ moveToState(STATE_END)
617
+ }
618
+ }
619
+
620
+ protected open fun onHandle(event: MotionEvent) {
621
+ moveToState(STATE_FAILED)
622
+ }
623
+
624
+ protected open fun onStateChange(newState: Int, previousState: Int) {}
625
+ protected open fun onReset() {}
626
+ protected open fun onCancel() {}
627
+ fun reset() {
628
+ view = null
629
+ orchestrator = null
630
+ Arrays.fill(trackedPointerIDs, -1)
631
+ trackedPointersIDsCount = 0
632
+
633
+ trackedPointersCount = 0
634
+ trackedPointers.fill(null)
635
+ touchEventType = RNGestureHandlerTouchEvent.EVENT_UNDETERMINED
636
+ onReset()
637
+ }
638
+
639
+ fun setOnTouchEventListener(listener: OnTouchEventListener?): GestureHandler<*> {
640
+ onTouchEventListener = listener
641
+ return this
642
+ }
643
+
644
+ override fun toString(): String {
645
+ val viewString = if (view == null) null else view!!.javaClass.simpleName
646
+ return this.javaClass.simpleName + "@[" + tag + "]:" + viewString
647
+ }
648
+
649
+ val lastRelativePositionX: Float
650
+ get() = lastAbsolutePositionX - lastEventOffsetX
651
+ val lastRelativePositionY: Float
652
+ get() = lastAbsolutePositionY - lastEventOffsetY
653
+
654
+ companion object {
655
+ const val STATE_UNDETERMINED = 0
656
+ const val STATE_FAILED = 1
657
+ const val STATE_BEGAN = 2
658
+ const val STATE_CANCELLED = 3
659
+ const val STATE_ACTIVE = 4
660
+ const val STATE_END = 5
661
+ const val HIT_SLOP_NONE = Float.NaN
662
+ private const val HIT_SLOP_LEFT_IDX = 0
663
+ private const val HIT_SLOP_TOP_IDX = 1
664
+ private const val HIT_SLOP_RIGHT_IDX = 2
665
+ private const val HIT_SLOP_BOTTOM_IDX = 3
666
+ private const val HIT_SLOP_WIDTH_IDX = 4
667
+ private const val HIT_SLOP_HEIGHT_IDX = 5
668
+ const val DIRECTION_RIGHT = 1
669
+ const val DIRECTION_LEFT = 2
670
+ const val DIRECTION_UP = 4
671
+ const val DIRECTION_DOWN = 8
672
+ private const val MAX_POINTERS_COUNT = 12
673
+ private lateinit var pointerProps: Array<PointerProperties?>
674
+ private lateinit var pointerCoords: Array<PointerCoords?>
675
+ private fun initPointerProps(size: Int) {
676
+ var size = size
677
+ if (!::pointerProps.isInitialized) {
678
+ pointerProps = arrayOfNulls(MAX_POINTERS_COUNT)
679
+ pointerCoords = arrayOfNulls(MAX_POINTERS_COUNT)
680
+ }
681
+ while (size > 0 && pointerProps[size - 1] == null) {
682
+ pointerProps[size - 1] = PointerProperties()
683
+ pointerCoords[size - 1] = PointerCoords()
684
+ size--
685
+ }
686
+ }
687
+
688
+ private var nextEventCoalescingKey: Short = 0
689
+ private fun hitSlopSet(value: Float): Boolean {
690
+ return !java.lang.Float.isNaN(value)
691
+ }
692
+
693
+ fun stateToString(state: Int): String? {
694
+ when (state) {
695
+ STATE_UNDETERMINED -> return "UNDETERMINED"
696
+ STATE_ACTIVE -> return "ACTIVE"
697
+ STATE_FAILED -> return "FAILED"
698
+ STATE_BEGAN -> return "BEGIN"
699
+ STATE_CANCELLED -> return "CANCELLED"
700
+ STATE_END -> return "END"
701
+ }
702
+ return null
703
+ }
704
+ }
705
+
706
+ private data class PointerData(
707
+ val pointerId: Int,
708
+ var x: Float,
709
+ var y: Float,
710
+ var absoluteX: Float,
711
+ var absoluteY: Float
712
+ )
713
+ }