react-native-gesture-handler 2.4.1 → 2.6.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 (382) hide show
  1. package/README.md +4 -2
  2. package/RNGestureHandler.podspec +17 -5
  3. package/android/build.gradle +71 -15
  4. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +2 -1
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +9 -5
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +32 -6
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +5 -2
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +105 -23
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +30 -2
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +3 -2
  11. package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +1 -1
  12. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +0 -8
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +74 -84
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +7 -1
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +5 -1
  16. package/android/src/main/jni/CMakeLists.txt +59 -0
  17. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +12 -9
  18. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +1 -0
  19. package/ios/Handlers/RNFlingHandler.m +43 -1
  20. package/ios/Handlers/{RNNativeViewHandler.m → RNNativeViewHandler.mm} +13 -1
  21. package/ios/Handlers/RNPanHandler.m +27 -0
  22. package/ios/RNGestureHandler.h +1 -0
  23. package/ios/RNGestureHandler.m +22 -4
  24. package/ios/RNGestureHandlerButtonComponentView.mm +1 -1
  25. package/ios/RNGestureHandlerManager.mm +10 -7
  26. package/ios/RNGestureHandlerModule.mm +4 -1
  27. package/ios/RNGestureHandlerRootViewComponentView.mm +1 -1
  28. package/ios/RNManualActivationRecognizer.m +10 -3
  29. package/ios/RNRootViewGestureRecognizer.m +12 -1
  30. package/lib/commonjs/EnableExperimentalWebImplementation.js +24 -0
  31. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -0
  32. package/lib/commonjs/RNGestureHandlerModule.macos.js +138 -0
  33. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -0
  34. package/lib/commonjs/RNGestureHandlerModule.web.js +87 -25
  35. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  36. package/lib/commonjs/RNRenderer.js +16 -0
  37. package/lib/commonjs/RNRenderer.js.map +1 -0
  38. package/lib/commonjs/RNRenderer.web.js +11 -0
  39. package/lib/commonjs/RNRenderer.web.js.map +1 -0
  40. package/lib/commonjs/components/DrawerLayout.js +41 -12
  41. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  42. package/lib/commonjs/components/GestureButtons.js +42 -9
  43. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  44. package/lib/commonjs/components/GestureComponents.js +41 -4
  45. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  46. package/lib/commonjs/components/GestureComponents.web.js +7 -2
  47. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  48. package/lib/commonjs/components/Swipeable.js +3 -1
  49. package/lib/commonjs/components/Swipeable.js.map +1 -1
  50. package/lib/commonjs/components/touchables/GenericTouchable.js +5 -1
  51. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  52. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  53. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +2 -1
  54. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  55. package/lib/commonjs/handlers/PanGestureHandler.js +1 -1
  56. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  57. package/lib/commonjs/handlers/PressabilityDebugView.js +14 -0
  58. package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -0
  59. package/lib/commonjs/handlers/PressabilityDebugView.web.js +12 -0
  60. package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +1 -0
  61. package/lib/commonjs/handlers/createHandler.js +33 -12
  62. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  63. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  64. package/lib/commonjs/handlers/gestures/GestureDetector.js +150 -75
  65. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  66. package/lib/commonjs/handlers/gestures/gesture.js +13 -2
  67. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  68. package/lib/commonjs/handlers/gestures/gestureStateManager.js +13 -9
  69. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  70. package/lib/commonjs/handlers/gestures/panGesture.js +5 -0
  71. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  72. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +7 -0
  73. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  74. package/lib/commonjs/index.js +14 -0
  75. package/lib/commonjs/index.js.map +1 -1
  76. package/lib/commonjs/utils.js +6 -3
  77. package/lib/commonjs/utils.js.map +1 -1
  78. package/lib/commonjs/web/constants.js +3 -51
  79. package/lib/commonjs/web/constants.js.map +1 -1
  80. package/lib/commonjs/web/detectors/RotationGestureDetector.js +169 -0
  81. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -0
  82. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +167 -0
  83. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -0
  84. package/lib/commonjs/web/handlers/FlingGestureHandler.js +154 -0
  85. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -0
  86. package/lib/commonjs/web/handlers/GestureHandler.js +538 -0
  87. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -0
  88. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +147 -0
  89. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -0
  90. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +116 -0
  91. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -0
  92. package/lib/commonjs/web/handlers/PanGestureHandler.js +451 -0
  93. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -0
  94. package/lib/commonjs/web/handlers/PinchGestureHandler.js +171 -0
  95. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -0
  96. package/lib/commonjs/web/handlers/RotationGestureHandler.js +187 -0
  97. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -0
  98. package/lib/commonjs/web/handlers/TapGestureHandler.js +296 -0
  99. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -0
  100. package/lib/commonjs/web/interfaces.js +34 -0
  101. package/lib/commonjs/web/interfaces.js.map +1 -0
  102. package/lib/commonjs/web/tools/EventManager.js +169 -0
  103. package/lib/commonjs/web/tools/EventManager.js.map +1 -0
  104. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +283 -0
  105. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -0
  106. package/lib/commonjs/web/tools/InteractionManager.js +102 -0
  107. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -0
  108. package/lib/commonjs/web/tools/NodeManager.js +48 -0
  109. package/lib/commonjs/web/tools/NodeManager.js.map +1 -0
  110. package/lib/commonjs/web/tools/PointerTracker.js +132 -0
  111. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -0
  112. package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
  113. package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
  114. package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js +0 -0
  115. package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
  116. package/lib/commonjs/{web → web_hammer}/Errors.js +0 -0
  117. package/lib/commonjs/{web → web_hammer}/Errors.js.map +0 -0
  118. package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js +0 -0
  119. package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
  120. package/lib/commonjs/{web → web_hammer}/GestureHandler.js +83 -42
  121. package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -0
  122. package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
  123. package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
  124. package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js +0 -0
  125. package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
  126. package/lib/commonjs/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
  127. package/lib/commonjs/web_hammer/NativeViewGestureHandler.js.map +1 -0
  128. package/lib/commonjs/{web → web_hammer}/NodeManager.js +0 -0
  129. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -0
  130. package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js +0 -0
  131. package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js.map +0 -0
  132. package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js +0 -0
  133. package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
  134. package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js +0 -0
  135. package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js.map +0 -0
  136. package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js +0 -0
  137. package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
  138. package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js +0 -0
  139. package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js.map +0 -0
  140. package/lib/commonjs/web_hammer/constants.js +64 -0
  141. package/lib/commonjs/web_hammer/constants.js.map +1 -0
  142. package/lib/commonjs/{web → web_hammer}/utils.js +0 -0
  143. package/lib/commonjs/{web → web_hammer}/utils.js.map +1 -1
  144. package/lib/module/EnableExperimentalWebImplementation.js +15 -0
  145. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -0
  146. package/lib/module/RNGestureHandlerModule.macos.js +102 -0
  147. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -0
  148. package/lib/module/RNGestureHandlerModule.web.js +73 -24
  149. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  150. package/lib/module/RNRenderer.js +4 -0
  151. package/lib/module/RNRenderer.js.map +1 -0
  152. package/lib/module/RNRenderer.web.js +4 -0
  153. package/lib/module/RNRenderer.web.js.map +1 -0
  154. package/lib/module/components/DrawerLayout.js +41 -12
  155. package/lib/module/components/DrawerLayout.js.map +1 -1
  156. package/lib/module/components/GestureButtons.js +43 -9
  157. package/lib/module/components/GestureButtons.js.map +1 -1
  158. package/lib/module/components/GestureComponents.js +39 -4
  159. package/lib/module/components/GestureComponents.js.map +1 -1
  160. package/lib/module/components/GestureComponents.web.js +6 -2
  161. package/lib/module/components/GestureComponents.web.js.map +1 -1
  162. package/lib/module/components/Swipeable.js +3 -1
  163. package/lib/module/components/Swipeable.js.map +1 -1
  164. package/lib/module/components/touchables/GenericTouchable.js +5 -1
  165. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  166. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  167. package/lib/module/handlers/ForceTouchGestureHandler.js +1 -1
  168. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  169. package/lib/module/handlers/PanGestureHandler.js +1 -1
  170. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  171. package/lib/module/handlers/PressabilityDebugView.js +3 -0
  172. package/lib/module/handlers/PressabilityDebugView.js.map +1 -0
  173. package/lib/module/handlers/PressabilityDebugView.web.js +5 -0
  174. package/lib/module/handlers/PressabilityDebugView.web.js.map +1 -0
  175. package/lib/module/handlers/createHandler.js +35 -14
  176. package/lib/module/handlers/createHandler.js.map +1 -1
  177. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  178. package/lib/module/handlers/gestures/GestureDetector.js +147 -74
  179. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  180. package/lib/module/handlers/gestures/gesture.js +13 -2
  181. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  182. package/lib/module/handlers/gestures/gestureStateManager.js +13 -9
  183. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  184. package/lib/module/handlers/gestures/panGesture.js +5 -0
  185. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  186. package/lib/module/handlers/gestures/reanimatedWrapper.js +7 -0
  187. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  188. package/lib/module/index.js +2 -1
  189. package/lib/module/index.js.map +1 -1
  190. package/lib/module/utils.js +2 -1
  191. package/lib/module/utils.js.map +1 -1
  192. package/lib/module/web/constants.js +1 -36
  193. package/lib/module/web/constants.js.map +1 -1
  194. package/lib/module/web/detectors/RotationGestureDetector.js +159 -0
  195. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -0
  196. package/lib/module/web/detectors/ScaleGestureDetector.js +156 -0
  197. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -0
  198. package/lib/module/web/handlers/FlingGestureHandler.js +139 -0
  199. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -0
  200. package/lib/module/web/handlers/GestureHandler.js +521 -0
  201. package/lib/module/web/handlers/GestureHandler.js.map +1 -0
  202. package/lib/module/web/handlers/LongPressGestureHandler.js +133 -0
  203. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -0
  204. package/lib/module/web/handlers/NativeViewGestureHandler.js +103 -0
  205. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -0
  206. package/lib/module/web/handlers/PanGestureHandler.js +434 -0
  207. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -0
  208. package/lib/module/web/handlers/PinchGestureHandler.js +155 -0
  209. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -0
  210. package/lib/module/web/handlers/RotationGestureHandler.js +171 -0
  211. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -0
  212. package/lib/module/web/handlers/TapGestureHandler.js +281 -0
  213. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -0
  214. package/lib/module/web/interfaces.js +26 -0
  215. package/lib/module/web/interfaces.js.map +1 -0
  216. package/lib/module/web/tools/EventManager.js +160 -0
  217. package/lib/module/web/tools/EventManager.js.map +1 -0
  218. package/lib/module/web/tools/GestureHandlerOrchestrator.js +270 -0
  219. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -0
  220. package/lib/module/web/tools/InteractionManager.js +93 -0
  221. package/lib/module/web/tools/InteractionManager.js.map +1 -0
  222. package/lib/module/web/tools/NodeManager.js +39 -0
  223. package/lib/module/web/tools/NodeManager.js.map +1 -0
  224. package/lib/module/web/tools/PointerTracker.js +122 -0
  225. package/lib/module/web/tools/PointerTracker.js.map +1 -0
  226. package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
  227. package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
  228. package/lib/module/{web → web_hammer}/DraggingGestureHandler.js +0 -0
  229. package/lib/module/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
  230. package/lib/module/{web → web_hammer}/Errors.js +0 -0
  231. package/lib/module/{web → web_hammer}/Errors.js.map +0 -0
  232. package/lib/module/{web → web_hammer}/FlingGestureHandler.js +0 -0
  233. package/lib/module/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
  234. package/lib/module/{web → web_hammer}/GestureHandler.js +83 -42
  235. package/lib/module/web_hammer/GestureHandler.js.map +1 -0
  236. package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
  237. package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
  238. package/lib/module/{web → web_hammer}/LongPressGestureHandler.js +0 -0
  239. package/lib/module/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
  240. package/lib/module/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
  241. package/lib/module/web_hammer/NativeViewGestureHandler.js.map +1 -0
  242. package/lib/module/{web → web_hammer}/NodeManager.js +0 -0
  243. package/lib/module/web_hammer/NodeManager.js.map +1 -0
  244. package/lib/module/{web → web_hammer}/PanGestureHandler.js +0 -0
  245. package/lib/module/{web → web_hammer}/PanGestureHandler.js.map +0 -0
  246. package/lib/module/{web → web_hammer}/PinchGestureHandler.js +0 -0
  247. package/lib/module/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
  248. package/lib/module/{web → web_hammer}/PressGestureHandler.js +0 -0
  249. package/lib/module/{web → web_hammer}/PressGestureHandler.js.map +0 -0
  250. package/lib/module/{web → web_hammer}/RotationGestureHandler.js +0 -0
  251. package/lib/module/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
  252. package/lib/module/{web → web_hammer}/TapGestureHandler.js +0 -0
  253. package/lib/module/{web → web_hammer}/TapGestureHandler.js.map +0 -0
  254. package/lib/module/web_hammer/constants.js +43 -0
  255. package/lib/module/web_hammer/constants.js.map +1 -0
  256. package/lib/module/{web → web_hammer}/utils.js +0 -0
  257. package/lib/module/{web → web_hammer}/utils.js.map +1 -1
  258. package/lib/typescript/EnableExperimentalWebImplementation.d.ts +2 -0
  259. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +44 -0
  260. package/lib/typescript/RNGestureHandlerModule.web.d.ts +29 -18
  261. package/lib/typescript/RNRenderer.d.ts +1 -0
  262. package/lib/typescript/RNRenderer.web.d.ts +3 -0
  263. package/lib/typescript/components/DrawerLayout.d.ts +4 -1
  264. package/lib/typescript/components/GestureButtons.d.ts +22 -0
  265. package/lib/typescript/components/GestureComponents.d.ts +7 -3
  266. package/lib/typescript/components/GestureComponents.web.d.ts +1 -0
  267. package/lib/typescript/components/Swipeable.d.ts +1 -1
  268. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +1 -0
  269. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
  270. package/lib/typescript/handlers/PanGestureHandler.d.ts +2 -1
  271. package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -0
  272. package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +1 -0
  273. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +1 -0
  274. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  275. package/lib/typescript/handlers/gestures/gesture.d.ts +3 -0
  276. package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -0
  277. package/lib/typescript/index.d.ts +2 -1
  278. package/lib/typescript/web/constants.d.ts +1 -33
  279. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +30 -0
  280. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +30 -0
  281. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +31 -0
  282. package/lib/typescript/web/handlers/GestureHandler.d.ts +84 -0
  283. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +33 -0
  284. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +16 -0
  285. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +68 -0
  286. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +30 -0
  287. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +30 -0
  288. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +49 -0
  289. package/lib/typescript/web/interfaces.d.ts +97 -0
  290. package/lib/typescript/web/tools/EventManager.d.ts +28 -0
  291. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +28 -0
  292. package/lib/typescript/web/tools/InteractionManager.d.ts +13 -0
  293. package/lib/typescript/web/tools/NodeManager.d.ts +11 -0
  294. package/lib/typescript/web/tools/PointerTracker.d.ts +28 -0
  295. package/lib/typescript/{web → web_hammer}/DiscreteGestureHandler.d.ts +0 -0
  296. package/lib/typescript/{web → web_hammer}/DraggingGestureHandler.d.ts +0 -0
  297. package/lib/typescript/{web → web_hammer}/Errors.d.ts +0 -0
  298. package/lib/typescript/{web → web_hammer}/FlingGestureHandler.d.ts +1 -0
  299. package/lib/typescript/{web → web_hammer}/GestureHandler.d.ts +6 -0
  300. package/lib/typescript/{web → web_hammer}/IndiscreteGestureHandler.d.ts +1 -0
  301. package/lib/typescript/{web → web_hammer}/LongPressGestureHandler.d.ts +1 -0
  302. package/lib/typescript/{web → web_hammer}/NativeViewGestureHandler.d.ts +1 -0
  303. package/lib/typescript/web_hammer/NodeManager.d.ts +8 -0
  304. package/lib/typescript/{web → web_hammer}/PanGestureHandler.d.ts +1 -0
  305. package/lib/typescript/{web → web_hammer}/PinchGestureHandler.d.ts +0 -0
  306. package/lib/typescript/{web → web_hammer}/PressGestureHandler.d.ts +2 -0
  307. package/lib/typescript/{web → web_hammer}/RotationGestureHandler.d.ts +0 -0
  308. package/lib/typescript/{web → web_hammer}/TapGestureHandler.d.ts +1 -0
  309. package/lib/typescript/web_hammer/constants.d.ts +39 -0
  310. package/lib/typescript/{web → web_hammer}/utils.d.ts +0 -0
  311. package/package.json +1 -1
  312. package/src/EnableExperimentalWebImplementation.ts +18 -0
  313. package/src/RNGestureHandlerModule.macos.ts +114 -0
  314. package/src/RNGestureHandlerModule.web.ts +89 -26
  315. package/src/RNRenderer.ts +3 -0
  316. package/src/RNRenderer.web.ts +3 -0
  317. package/src/components/DrawerLayout.tsx +37 -14
  318. package/src/components/GestureButtons.tsx +64 -0
  319. package/src/components/GestureComponents.tsx +66 -6
  320. package/src/components/GestureComponents.web.tsx +5 -0
  321. package/src/components/Swipeable.tsx +3 -1
  322. package/src/components/touchables/GenericTouchable.tsx +2 -0
  323. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +1 -0
  324. package/src/handlers/ForceTouchGestureHandler.ts +3 -2
  325. package/src/handlers/PanGestureHandler.ts +2 -0
  326. package/src/handlers/PressabilityDebugView.tsx +2 -0
  327. package/src/handlers/PressabilityDebugView.web.tsx +4 -0
  328. package/src/handlers/{createHandler.ts → createHandler.tsx} +45 -19
  329. package/src/handlers/gestureHandlerCommon.ts +2 -0
  330. package/src/handlers/gestures/GestureDetector.tsx +185 -93
  331. package/src/handlers/gestures/gesture.ts +16 -0
  332. package/src/handlers/gestures/gestureStateManager.ts +13 -8
  333. package/src/handlers/gestures/panGesture.ts +5 -0
  334. package/src/handlers/gestures/reanimatedWrapper.ts +7 -0
  335. package/src/index.ts +3 -0
  336. package/src/utils.ts +3 -1
  337. package/src/web/constants.ts +1 -41
  338. package/src/web/detectors/RotationGestureDetector.ts +199 -0
  339. package/src/web/detectors/ScaleGestureDetector.ts +208 -0
  340. package/src/web/handlers/FlingGestureHandler.ts +146 -0
  341. package/src/web/handlers/GestureHandler.ts +572 -0
  342. package/src/web/handlers/LongPressGestureHandler.ts +122 -0
  343. package/src/web/handlers/NativeViewGestureHandler.ts +109 -0
  344. package/src/web/handlers/PanGestureHandler.ts +488 -0
  345. package/src/web/handlers/PinchGestureHandler.ts +162 -0
  346. package/src/web/handlers/RotationGestureHandler.ts +181 -0
  347. package/src/web/handlers/TapGestureHandler.ts +275 -0
  348. package/src/web/interfaces.ts +114 -0
  349. package/src/web/tools/EventManager.ts +186 -0
  350. package/src/web/tools/GestureHandlerOrchestrator.ts +329 -0
  351. package/src/web/tools/InteractionManager.ts +108 -0
  352. package/src/web/tools/NodeManager.ts +43 -0
  353. package/src/web/tools/PointerTracker.ts +130 -0
  354. package/src/{web → web_hammer}/DiscreteGestureHandler.ts +0 -0
  355. package/src/{web → web_hammer}/DraggingGestureHandler.ts +0 -0
  356. package/src/{web → web_hammer}/Errors.ts +0 -0
  357. package/src/{web → web_hammer}/FlingGestureHandler.ts +0 -0
  358. package/src/{web → web_hammer}/GestureHandler.ts +102 -55
  359. package/src/{web → web_hammer}/IndiscreteGestureHandler.ts +0 -0
  360. package/src/{web → web_hammer}/LongPressGestureHandler.ts +0 -0
  361. package/src/{web → web_hammer}/NativeViewGestureHandler.ts +4 -0
  362. package/src/{web → web_hammer}/NodeManager.ts +6 -3
  363. package/src/{web → web_hammer}/PanGestureHandler.ts +0 -0
  364. package/src/{web → web_hammer}/PinchGestureHandler.ts +0 -0
  365. package/src/{web → web_hammer}/PressGestureHandler.ts +0 -0
  366. package/src/{web → web_hammer}/RotationGestureHandler.ts +0 -0
  367. package/src/{web → web_hammer}/TapGestureHandler.ts +0 -0
  368. package/src/web_hammer/constants.ts +48 -0
  369. package/src/{web → web_hammer}/utils.ts +1 -1
  370. package/android/src/main/jni/Android.mk +0 -53
  371. package/android/src/main/jni/OnLoad.cpp +0 -9
  372. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +0 -71
  373. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +0 -34
  374. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  375. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
  376. package/lib/commonjs/web/GestureHandler.js.map +0 -1
  377. package/lib/commonjs/web/NativeViewGestureHandler.js.map +0 -1
  378. package/lib/commonjs/web/NodeManager.js.map +0 -1
  379. package/lib/module/web/GestureHandler.js.map +0 -1
  380. package/lib/module/web/NativeViewGestureHandler.js.map +0 -1
  381. package/lib/module/web/NodeManager.js.map +0 -1
  382. package/lib/typescript/web/NodeManager.d.ts +0 -8
package/README.md CHANGED
@@ -24,7 +24,7 @@ Check out our dedicated documentation page for info about this library, API refe
24
24
  If you want to play with the API but don't feel like trying it on a real app, you can run the example project. Clone the repo, go to the `example` folder and run:
25
25
 
26
26
  ```bash
27
- yarn install
27
+ yarn install
28
28
  ```
29
29
 
30
30
  If you are running on ios, run `pod install` in the ios folder
@@ -39,12 +39,14 @@ You will need to have an Android or iOS device or emulator connected as well as
39
39
 
40
40
  | version | react-native version |
41
41
  | ------- | -------------------- |
42
+ | 2.0.0+ | 0.63.0+ |
42
43
  | 1.4.0+ | 0.60.0+ |
43
44
  | 1.1.0+ | 0.57.2+ |
44
45
  | <1.1.0 | 0.50.0+ |
45
46
 
46
47
  It may be possible to use newer versions of react-native-gesture-handler on React Native with version <= 0.59 by reverse Jetifying.
47
- Read more on that here https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries
48
+ Read more on that here <https://github.com/mikehardy/jetifier#to-reverse-jetify--convert-node_modules-dependencies-to-support-libraries>
49
+
48
50
  ## License
49
51
 
50
52
  Gesture handler library is licensed under [The MIT License](LICENSE).
@@ -1,6 +1,21 @@
1
1
  require "json"
2
2
 
3
- fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED']
3
+ fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
4
+
5
+ isUserApp = File.exists?(File.join(__dir__, "..", "..", "node_modules", "react-native", "package.json"))
6
+ if isUserApp
7
+ libInstances = %x[find ../../ -name "package.json" | grep "/react-native-gesture-handler/package.json" | grep -v "/.yarn/"]
8
+ libInstancesArray = libInstances.split("\n")
9
+ if libInstancesArray.length() > 1
10
+ parsedLocation = ''
11
+ for location in libInstancesArray
12
+ location['../../'] = '- '
13
+ location['/package.json'] = ''
14
+ parsedLocation += location + "\n"
15
+ end
16
+ raise "[Gesture Handler] Multiple versions of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-versions-of-reanimated-were-detected \n\nConflict between: \n" + parsedLocation
17
+ end
18
+ end
4
19
 
5
20
  Pod::Spec.new do |s|
6
21
  # NPM package specification
@@ -17,9 +32,6 @@ Pod::Spec.new do |s|
17
32
  s.requires_arc = true
18
33
 
19
34
  if fabric_enabled
20
- # folly_version must match the version used in React Native
21
- # See folly_version in react-native/React/FBReactNativeSpec/FBReactNativeSpec.podspec
22
- folly_version = '2021.06.28.00-v2'
23
35
  folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
24
36
 
25
37
  s.pod_target_xcconfig = {
@@ -32,7 +44,7 @@ Pod::Spec.new do |s|
32
44
  s.dependency "React"
33
45
  s.dependency "React-RCTFabric" # This is for fabric component
34
46
  s.dependency "React-Codegen"
35
- s.dependency "RCT-Folly", folly_version
47
+ s.dependency "RCT-Folly"
36
48
  s.dependency "RCTRequired"
37
49
  s.dependency "RCTTypeSafety"
38
50
  s.dependency "ReactCommon/turbomodule/core"
@@ -21,7 +21,7 @@ def isNewArchitectureEnabled() {
21
21
  return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
22
22
  }
23
23
 
24
- def findNodeModulePath(baseDir, packageName) {
24
+ static def findNodeModulePath(baseDir, packageName) {
25
25
  def basePath = baseDir.toPath().normalize()
26
26
  // Node's module resolution algorithm searches up to the root directory,
27
27
  // after which the base path will be null
@@ -35,6 +35,13 @@ def findNodeModulePath(baseDir, packageName) {
35
35
  return null
36
36
  }
37
37
 
38
+ def findNodeModulePath(packageName) {
39
+ // Don't start in the project dir, as its path ends with node_modules/react-native-gesture-handler/android
40
+ // we want to go two levels up, so we end up in the first_node modules and eventually
41
+ // search upwards if the package is not found there
42
+ return findNodeModulePath(projectDir.toPath().parent.parent.toFile(), packageName)
43
+ }
44
+
38
45
  if (isNewArchitectureEnabled()) {
39
46
  apply plugin: 'com.facebook.react'
40
47
  }
@@ -59,6 +66,45 @@ def shouldUseCommonInterfaceFromReanimated() {
59
66
  }
60
67
  }
61
68
 
69
+ def reactNativeArchitectures() {
70
+ def value = project.getProperties().get("reactNativeArchitectures")
71
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
72
+ }
73
+
74
+ def shouldAssertNoMultipleInstances() {
75
+ if (rootProject.hasProperty("disableMultipleInstancesCheck")) {
76
+ return rootProject.property("disableMultipleInstancesCheck") != "true"
77
+ } else {
78
+ return true
79
+ }
80
+ }
81
+
82
+ def noMultipleInstancesAssertion() {
83
+ Set<File> files = fileTree(rootDir.parent) {
84
+ include "node_modules/**/react-native-gesture-handler/package.json"
85
+ exclude "**/.yarn/**"
86
+ }.files
87
+
88
+ if (files.size() > 1) {
89
+ String parsedLocation = files.stream().map({ File file -> "- " + file.toString().replace("/package.json", "") }).collect().join("\n")
90
+ String exceptionMessage = "\n[Gesture Handler] Multiple instances of Gesture Handler were detected. Only one instance of react-native-gesture-handler can be installed in a project. You need to resolve the conflict manually. Check out the documentation: https://docs.swmansion.com/react-native-gesture-handler/docs/troubleshooting#multiple-instances-of-gesture-handler-were-detected \n\nConflict between: \n" + parsedLocation + "\n";
91
+ throw new Exception(exceptionMessage);
92
+ }
93
+ }
94
+
95
+ def REACT_NATIVE_DIR = findNodeModulePath("react-native")
96
+
97
+ def assertionTask = task assertNoMultipleInstances {
98
+ onlyIf { shouldAssertNoMultipleInstances() }
99
+ doFirst {
100
+ noMultipleInstancesAssertion()
101
+ }
102
+ }
103
+
104
+ tasks.preBuild {
105
+ dependsOn assertionTask
106
+ }
107
+
62
108
  repositories {
63
109
  mavenCentral()
64
110
  }
@@ -84,17 +130,12 @@ android {
84
130
  if (isNewArchitectureEnabled()) {
85
131
  var appProject = rootProject.allprojects.find {it.plugins.hasPlugin('com.android.application')}
86
132
  externalNativeBuild {
87
- ndkBuild {
88
- arguments "APP_PLATFORM=android-21",
89
- "APP_STL=c++_shared",
90
- "NDK_TOOLCHAIN_VERSION=clang",
91
- "GENERATED_SRC_DIR=${appProject.buildDir}/generated/source",
92
- "PROJECT_BUILD_DIR=${appProject.buildDir}",
93
- "REACT_ANDROID_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid",
94
- "REACT_ANDROID_BUILD_DIR=${findNodeModulePath(appProject.rootDir, "react-native") ?: "../node_modules/react-native/"}/ReactAndroid/build"
95
- cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
96
- cppFlags "-std=c++17"
97
- targets "rngesturehandler_modules"
133
+ cmake {
134
+ cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all"
135
+ arguments "-DAPP_BUILD_DIR=${appProject.buildDir}",
136
+ "-DREACT_NATIVE_DIR=${REACT_NATIVE_DIR}",
137
+ "-DANDROID_STL=c++_shared"
138
+ abiFilters (*reactNativeArchitectures())
98
139
  }
99
140
  }
100
141
  }
@@ -107,8 +148,8 @@ android {
107
148
 
108
149
  if (isNewArchitectureEnabled()) {
109
150
  externalNativeBuild {
110
- ndkBuild {
111
- path "src/main/jni/Android.mk"
151
+ cmake {
152
+ path "src/main/jni/CMakeLists.txt"
112
153
  }
113
154
  }
114
155
  }
@@ -116,7 +157,7 @@ android {
116
157
  packagingOptions {
117
158
  // For some reason gradle only complains about the duplicated version of libreact_render libraries
118
159
  // while there are more libraries copied in intermediates folder of the lib build directory, we exclude
119
- // only the ones that make the build fail (ideally we should only include librngesturehandler_modules but we
160
+ // only the ones that make the build fail (ideally we should only include libgesturehandler but we
120
161
  // are only allowed to specify exclude patterns)
121
162
  exclude "**/libreact_render*.so"
122
163
  }
@@ -178,4 +219,19 @@ if (isNewArchitectureEnabled()) {
178
219
  libraryName = "rngesturehandler"
179
220
  codegenJavaPackageName = "com.swmansion.gesturehandler"
180
221
  }
222
+
223
+ // Resolves "LOCAL_SRC_FILES points to a missing file, Check that libfb.so exists or that its path is correct".
224
+ tasks.whenTaskAdded { task ->
225
+ if (task.name.contains("configureCMakeDebug")) {
226
+ rootProject.getTasksByName("packageReactNdkDebugLibs", true).forEach {
227
+ task.dependsOn(it)
228
+ }
229
+ }
230
+ // We want to add a dependency for both configureCMakeRelease and configureCMakeRelWithDebInfo
231
+ if (task.name.contains("configureCMakeRel")) {
232
+ rootProject.getTasksByName("packageReactNdkReleaseLibs", true).forEach {
233
+ task.dependsOn(it)
234
+ }
235
+ }
236
+ }
181
237
  }
@@ -1,6 +1,7 @@
1
1
  package com.swmansion.gesturehandler
2
2
 
3
3
  import android.os.Handler
4
+ import android.os.Looper
4
5
  import android.view.MotionEvent
5
6
 
6
7
  class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
@@ -27,7 +28,7 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
27
28
  begin()
28
29
  maxNumberOfPointersSimultaneously = 1
29
30
  if (handler == null) {
30
- handler = Handler() // lazy delegate?
31
+ handler = Handler(Looper.getMainLooper()) // lazy delegate?
31
32
  } else {
32
33
  handler!!.removeCallbacksAndMessages(null)
33
34
  }
@@ -172,8 +172,12 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
172
172
  windowOffset[0] = 0
173
173
  windowOffset[1] = 0
174
174
  }
175
+
176
+ onPrepare()
175
177
  }
176
178
 
179
+ protected open fun onPrepare() {}
180
+
177
181
  private fun getWindow(context: Context?): Window? {
178
182
  if (context == null) return null
179
183
  if (context is Activity) return context.window
@@ -253,9 +257,9 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
253
257
  }
254
258
  initPointerProps(trackedPointersIDsCount)
255
259
  var count = 0
256
- val oldX = event.x
257
- val oldY = event.y
258
- event.setLocation(event.rawX, event.rawY)
260
+ val deltaX = event.rawX - event.x
261
+ val deltaY = event.rawY - event.y
262
+ event.offsetLocation(deltaX, deltaY)
259
263
  var index = 0
260
264
  val size = event.pointerCount
261
265
  while (index < size) {
@@ -298,8 +302,8 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
298
302
  } catch (e: IllegalArgumentException) {
299
303
  throw AdaptEventException(this, event, e)
300
304
  }
301
- event.setLocation(oldX, oldY)
302
- result.setLocation(oldX, oldY)
305
+ event.offsetLocation(-deltaX, -deltaY)
306
+ result.offsetLocation(-deltaX, -deltaY)
303
307
  return result
304
308
  }
305
309
 
@@ -5,6 +5,7 @@ import android.graphics.PointF
5
5
  import android.view.MotionEvent
6
6
  import android.view.View
7
7
  import android.view.ViewGroup
8
+ import android.widget.EditText
8
9
  import java.util.*
9
10
 
10
11
  class GestureHandlerOrchestrator(
@@ -128,6 +129,13 @@ class GestureHandlerOrchestrator(
128
129
  if (newState == GestureHandler.STATE_END) {
129
130
  // gesture has ended, we need to kill the awaiting handler
130
131
  otherHandler.cancel()
132
+ if (otherHandler.state == GestureHandler.STATE_END) {
133
+ // Handle edge case, where discrete gestures end immediately after activation thus
134
+ // their state is set to END and when the gesture they are waiting for activates they
135
+ // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
136
+ // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
137
+ otherHandler.dispatchStateChange(GestureHandler.STATE_CANCELLED, GestureHandler.STATE_BEGAN)
138
+ }
131
139
  otherHandler.isAwaiting = false
132
140
  } else {
133
141
  // gesture has failed recognition, we may try activating
@@ -142,9 +150,12 @@ class GestureHandlerOrchestrator(
142
150
  } else if (prevState == GestureHandler.STATE_ACTIVE || prevState == GestureHandler.STATE_END) {
143
151
  if (handler.isActive) {
144
152
  handler.dispatchStateChange(newState, prevState)
145
- } else if (prevState == GestureHandler.STATE_ACTIVE) {
146
- // handle edge case where handler awaiting for another one tries to activate but finishes
147
- // before the other would not send state change event upon ending
153
+ } else if (prevState == GestureHandler.STATE_ACTIVE && (newState == GestureHandler.STATE_CANCELLED || newState == GestureHandler.STATE_FAILED)) {
154
+ // Handle edge case where handler awaiting for another one tries to activate but finishes
155
+ // before the other would not send state change event upon ending. Note that we only want
156
+ // to do this if the newState is either CANCELLED or FAILED, if it is END we still want to
157
+ // wait for the other handler to finish as in that case synthetic events will be sent by the
158
+ // makeActive method.
148
159
  handler.dispatchStateChange(newState, GestureHandler.STATE_BEGAN)
149
160
  }
150
161
  } else if (prevState != GestureHandler.STATE_UNDETERMINED || newState != GestureHandler.STATE_CANCELLED) {
@@ -474,9 +485,24 @@ class GestureHandlerOrchestrator(
474
485
  }
475
486
  PointerEventsConfig.BOX_NONE -> {
476
487
  // This view can't be the target, but its children might
477
- if (view is ViewGroup) {
478
- extractGestureHandlers(view, coords, pointerId)
479
- } else false
488
+ when (view) {
489
+ is ViewGroup -> {
490
+ extractGestureHandlers(view, coords, pointerId).also { found ->
491
+ // A child view is handling touch, also extract handlers attached to this view
492
+ if (found) {
493
+ recordViewHandlersForPointer(view, coords, pointerId)
494
+ }
495
+ }
496
+ }
497
+ // When <TextInput> has editable set to `false` getPointerEventsConfigForView returns
498
+ // `BOX_NONE` as it's `isEnabled` property is false. In this case we still want to extract
499
+ // handlers attached to the text input, as it makes sense that gestures would work on a
500
+ // non-editable TextInput.
501
+ is EditText -> {
502
+ recordViewHandlersForPointer(view, coords, pointerId)
503
+ }
504
+ else -> false
505
+ }
480
506
  }
481
507
  PointerEventsConfig.AUTO -> {
482
508
  // Either this view or one of its children is the target
@@ -2,6 +2,7 @@ package com.swmansion.gesturehandler
2
2
 
3
3
  import android.content.Context
4
4
  import android.os.Handler
5
+ import android.os.Looper
5
6
  import android.os.SystemClock
6
7
  import android.view.MotionEvent
7
8
 
@@ -19,7 +20,9 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
19
20
 
20
21
  init {
21
22
  setShouldCancelWhenOutside(true)
22
- defaultMaxDistSq = DEFAULT_MAX_DIST_DP * context.resources.displayMetrics.density
23
+
24
+ val defaultMaxDist = DEFAULT_MAX_DIST_DP * context.resources.displayMetrics.density
25
+ defaultMaxDistSq = defaultMaxDist * defaultMaxDist
23
26
  maxDistSq = defaultMaxDistSq
24
27
  }
25
28
 
@@ -41,7 +44,7 @@ class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestur
41
44
  begin()
42
45
  startX = event.rawX
43
46
  startY = event.rawY
44
- handler = Handler()
47
+ handler = Handler(Looper.getMainLooper())
45
48
  if (minDurationMs > 0) {
46
49
  handler!!.postDelayed({ activate() }, minDurationMs)
47
50
  } else if (minDurationMs == 0L) {
@@ -3,12 +3,16 @@ package com.swmansion.gesturehandler
3
3
  import android.os.SystemClock
4
4
  import android.view.MotionEvent
5
5
  import android.view.View
6
+ import android.view.ViewConfiguration
6
7
  import android.view.ViewGroup
7
- import com.swmansion.gesturehandler.react.RNGestureHandlerButtonViewManager
8
+ import com.facebook.react.views.textinput.ReactEditText
8
9
 
9
10
  class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
10
11
  private var shouldActivateOnStart = false
11
- private var disallowInterruption = false
12
+ var disallowInterruption = false
13
+ private set
14
+
15
+ private var hook: NativeViewGestureHandlerHook = defaultHook
12
16
 
13
17
  init {
14
18
  setShouldCancelWhenOutside(true)
@@ -34,13 +38,17 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
34
38
  }
35
39
 
36
40
  override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
41
+ // if the gesture is marked by user as simultaneous with other or the hook return true
42
+ if (super.shouldRecognizeSimultaneously(handler) || hook.shouldRecognizeSimultaneously(handler)) {
43
+ return true
44
+ }
45
+
37
46
  if (handler is NativeViewGestureHandler) {
38
47
  // Special case when the peer handler is also an instance of NativeViewGestureHandler:
39
48
  // For the `disallowInterruption` to work correctly we need to check the property when
40
49
  // accessed as a peer, because simultaneous recognizers can be set on either side of the
41
50
  // connection.
42
- val nativeWrapper = handler
43
- if (nativeWrapper.state == STATE_ACTIVE && nativeWrapper.disallowInterruption) {
51
+ if (handler.state == STATE_ACTIVE && handler.disallowInterruption) {
44
52
  // other handler is active and it disallows interruption, we don't want to get into its way
45
53
  return false
46
54
  }
@@ -52,7 +60,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
52
60
  // as it means the other handler has turned active and returning `true` would prevent it from
53
61
  // interrupting the current handler
54
62
  false
55
- } else state == STATE_ACTIVE && canBeInterrupted
63
+ } else state == STATE_ACTIVE && canBeInterrupted && (!hook.shouldCancelRootViewGestureHandlerIfNecessary() || handler.tag > 0)
56
64
  // otherwise we can only return `true` if already in an active state
57
65
  }
58
66
 
@@ -60,19 +68,10 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
60
68
  return !disallowInterruption
61
69
  }
62
70
 
63
- private fun canStart(): Boolean {
64
- val view = view
65
- if (view is StateChangeHook) {
66
- return view.canStart()
67
- }
68
-
69
- return true
70
- }
71
-
72
- private fun afterGestureEnd() {
73
- val view = view
74
- if (view is StateChangeHook) {
75
- view.afterGestureEnd()
71
+ override fun onPrepare() {
72
+ when (val view = view) {
73
+ is NativeViewGestureHandlerHook -> this.hook = view
74
+ is ReactEditText -> this.hook = EditTextHook(this, view)
76
75
  }
77
76
  }
78
77
 
@@ -84,7 +83,7 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
84
83
  activate()
85
84
  }
86
85
  end()
87
- afterGestureEnd()
86
+ hook.afterGestureEnd(event)
88
87
  } else if (state == STATE_UNDETERMINED || state == STATE_BEGAN) {
89
88
  when {
90
89
  shouldActivateOnStart -> {
@@ -96,8 +95,11 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
96
95
  view.onTouchEvent(event)
97
96
  activate()
98
97
  }
98
+ hook.wantsToHandleEventBeforeActivation() -> {
99
+ hook.handleEventBeforeActivation(event)
100
+ }
99
101
  state != STATE_BEGAN -> {
100
- if (canStart()) {
102
+ if (hook.canBegin()) {
101
103
  begin()
102
104
  } else {
103
105
  cancel()
@@ -117,13 +119,93 @@ class NativeViewGestureHandler : GestureHandler<NativeViewGestureHandler>() {
117
119
  view!!.onTouchEvent(event)
118
120
  }
119
121
 
122
+ override fun onReset() {
123
+ this.hook = defaultHook
124
+ }
125
+
120
126
  companion object {
121
127
  private fun tryIntercept(view: View, event: MotionEvent) =
122
128
  view is ViewGroup && view.onInterceptTouchEvent(event)
129
+
130
+ private val defaultHook = object : NativeViewGestureHandlerHook {}
123
131
  }
124
132
 
125
- interface StateChangeHook {
126
- fun canStart(): Boolean
127
- fun afterGestureEnd()
133
+ interface NativeViewGestureHandlerHook {
134
+ /**
135
+ * Called when gesture is in the UNDETERMINED state, shouldActivateOnStart is set to false,
136
+ * and both tryIntercept and wantsToHandleEventBeforeActivation returned false.
137
+ *
138
+ * @return Boolean value signalling whether the handler can transition to the BEGAN state. If false
139
+ * the gesture will be cancelled.
140
+ */
141
+ fun canBegin() = true
142
+
143
+ /**
144
+ * Called after the gesture transitions to the END state.
145
+ */
146
+ fun afterGestureEnd(event: MotionEvent) = Unit
147
+
148
+ /**
149
+ * @return Boolean value signalling whether the gesture can be recognized simultaneously with
150
+ * other (handler). Returning false doesn't necessarily prevent it from happening.
151
+ */
152
+ fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) = false
153
+
154
+ /**
155
+ * shouldActivateOnStart and tryIntercept have priority over this method
156
+ *
157
+ * @return Boolean value signalling if the hook wants to handle events passed to the handler
158
+ * before it activates (after that the events are passed to the underlying view).
159
+ */
160
+ fun wantsToHandleEventBeforeActivation() = false
161
+
162
+ /**
163
+ * Will be called with events if wantsToHandleEventBeforeActivation returns true.
164
+ */
165
+ fun handleEventBeforeActivation(event: MotionEvent) = Unit
166
+
167
+ /**
168
+ * @return Boolean value indicating whether the RootViewGestureHandler should be cancelled
169
+ * by this one.
170
+ */
171
+ fun shouldCancelRootViewGestureHandlerIfNecessary() = false
172
+ }
173
+
174
+ private class EditTextHook(
175
+ private val handler: NativeViewGestureHandler,
176
+ private val editText: ReactEditText
177
+ ) : NativeViewGestureHandlerHook {
178
+ private var startX = 0f
179
+ private var startY = 0f
180
+ private var touchSlopSquared: Int
181
+
182
+ init {
183
+ val vc = ViewConfiguration.get(editText.context)
184
+ touchSlopSquared = vc.scaledTouchSlop * vc.scaledTouchSlop
185
+ }
186
+
187
+ override fun afterGestureEnd(event: MotionEvent) {
188
+ if ((event.x - startX) * (event.x - startX) + (event.y - startY) * (event.y - startY) < touchSlopSquared) {
189
+ editText.requestFocusFromJS()
190
+ }
191
+ }
192
+
193
+ // recognize alongside every handler besides RootViewGestureHandler, which is a private inner class
194
+ // of RNGestureHandlerRootHelper so no explicit type checks, but its tag is always negative
195
+ // also if other handler is NativeViewGestureHandler then don't override the default implementation
196
+ override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>) =
197
+ handler.tag > 0 && handler !is NativeViewGestureHandler
198
+
199
+ override fun wantsToHandleEventBeforeActivation() = true
200
+
201
+ override fun handleEventBeforeActivation(event: MotionEvent) {
202
+ handler.activate()
203
+ editText.onTouchEvent(event)
204
+
205
+ startX = event.x
206
+ startY = event.y
207
+ }
208
+
209
+ override fun shouldCancelRootViewGestureHandlerIfNecessary() = true
128
210
  }
129
211
  }
@@ -1,6 +1,8 @@
1
1
  package com.swmansion.gesturehandler
2
2
 
3
3
  import android.content.Context
4
+ import android.os.Handler
5
+ import android.os.Looper
4
6
  import android.view.MotionEvent
5
7
  import android.view.VelocityTracker
6
8
  import android.view.ViewConfiguration
@@ -40,6 +42,9 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
40
42
  private var lastY = 0f
41
43
  private var velocityTracker: VelocityTracker? = null
42
44
  private var averageTouches = false
45
+ private var activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
46
+ private val activateDelayed = Runnable { activate() }
47
+ private var handler: Handler? = null
43
48
 
44
49
  /**
45
50
  * On Android when there are multiple pointers on the screen pan gestures most often just consider
@@ -54,7 +59,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
54
59
  * position of all the fingers will remain still while doing a rotation gesture.
55
60
  */
56
61
  init {
57
- val vc = ViewConfiguration.get(context)
62
+ val vc = ViewConfiguration.get(context!!)
58
63
  val touchSlop = vc.scaledTouchSlop
59
64
  defaultMinDistSq = (touchSlop * touchSlop).toFloat()
60
65
  minDistSq = defaultMinDistSq
@@ -76,6 +81,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
76
81
  minDistSq = defaultMinDistSq
77
82
  minPointers = DEFAULT_MIN_POINTERS
78
83
  maxPointers = DEFAULT_MAX_POINTERS
84
+ activateAfterLongPress = DEFAULT_ACTIVATE_AFTER_LONG_PRESS
79
85
  averageTouches = false
80
86
  }
81
87
 
@@ -127,6 +133,10 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
127
133
  this.averageTouches = averageTouches
128
134
  }
129
135
 
136
+ fun setActivateAfterLongPress(time: Long) = apply {
137
+ this.activateAfterLongPress = time
138
+ }
139
+
130
140
  /**
131
141
  * @param minVelocity in pixels per second
132
142
  */
@@ -177,13 +187,18 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
177
187
 
178
188
  private fun shouldFail(): Boolean {
179
189
  val dx = lastX - startX + offsetX
190
+ val dy = lastY - startY + offsetY
191
+
192
+ if (activateAfterLongPress > 0 && dx * dx + dy * dy > defaultMinDistSq) {
193
+ handler?.removeCallbacksAndMessages(null)
194
+ return true
195
+ }
180
196
  if (failOffsetXStart != MAX_VALUE_IGNORE && dx < failOffsetXStart) {
181
197
  return true
182
198
  }
183
199
  if (failOffsetXEnd != MIN_VALUE_IGNORE && dx > failOffsetXEnd) {
184
200
  return true
185
201
  }
186
- val dy = lastY - startY + offsetY
187
202
  if (failOffsetYStart != MAX_VALUE_IGNORE && dy < failOffsetYStart) {
188
203
  return true
189
204
  }
@@ -216,6 +231,13 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
216
231
  velocityTracker = VelocityTracker.obtain()
217
232
  addVelocityMovement(velocityTracker, event)
218
233
  begin()
234
+
235
+ if (activateAfterLongPress > 0) {
236
+ if (handler == null) {
237
+ handler = Handler(Looper.getMainLooper())
238
+ }
239
+ handler!!.postDelayed(activateDelayed, activateAfterLongPress)
240
+ }
219
241
  } else if (velocityTracker != null) {
220
242
  addVelocityMovement(velocityTracker, event)
221
243
  velocityTracker!!.computeCurrentVelocity(1000)
@@ -257,7 +279,12 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
257
279
  super.activate(force)
258
280
  }
259
281
 
282
+ override fun onCancel() {
283
+ handler?.removeCallbacksAndMessages(null)
284
+ }
285
+
260
286
  override fun onReset() {
287
+ handler?.removeCallbacksAndMessages(null)
261
288
  velocityTracker?.let {
262
289
  it.recycle()
263
290
  velocityTracker = null
@@ -274,6 +301,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
274
301
  private const val MAX_VALUE_IGNORE = Float.MIN_VALUE
275
302
  private const val DEFAULT_MIN_POINTERS = 1
276
303
  private const val DEFAULT_MAX_POINTERS = 10
304
+ private const val DEFAULT_ACTIVATE_AFTER_LONG_PRESS = 0L
277
305
 
278
306
  /**
279
307
  * This method adds movement to {@class VelocityTracker} first resetting offset of the event so
@@ -1,6 +1,7 @@
1
1
  package com.swmansion.gesturehandler
2
2
 
3
3
  import android.os.Handler
4
+ import android.os.Looper
4
5
  import android.view.MotionEvent
5
6
  import com.swmansion.gesturehandler.GestureUtils.getLastPointerX
6
7
  import com.swmansion.gesturehandler.GestureUtils.getLastPointerY
@@ -70,7 +71,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
70
71
 
71
72
  private fun startTap() {
72
73
  if (handler == null) {
73
- handler = Handler() // TODO: lazy init (handle else branch correctly)
74
+ handler = Handler(Looper.getMainLooper()) // TODO: lazy init (handle else branch correctly)
74
75
  } else {
75
76
  handler!!.removeCallbacksAndMessages(null)
76
77
  }
@@ -79,7 +80,7 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
79
80
 
80
81
  private fun endTap() {
81
82
  if (handler == null) {
82
- handler = Handler()
83
+ handler = Handler(Looper.getMainLooper())
83
84
  } else {
84
85
  handler!!.removeCallbacksAndMessages(null)
85
86
  }
@@ -9,7 +9,7 @@ import com.facebook.soloader.SoLoader;
9
9
  public class RNGestureHandlerComponentsRegistry {
10
10
  static {
11
11
  SoLoader.loadLibrary("fabricjni");
12
- SoLoader.loadLibrary("rngesturehandler_modules");
12
+ SoLoader.loadLibrary("gesturehandler");
13
13
  }
14
14
 
15
15
  @DoNotStrip private final HybridData mHybridData;