react-native-gesture-handler 1.10.3 → 2.2.0

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