react-native-gesture-handler 2.4.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (382) hide show
  1. package/README.md +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;