react-native-gesture-handler 2.16.0-rc.0 → 2.16.1

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 (399) hide show
  1. package/README.md +1 -0
  2. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
  3. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
  4. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
  5. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +2 -2
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +61 -24
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +17 -22
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +30 -11
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
  11. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
  12. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +4 -2
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
  19. package/apple/Handlers/RNLongPressHandler.m +5 -13
  20. package/apple/Handlers/RNPinchHandler.m +12 -1
  21. package/apple/RNGestureHandler.m +3 -1
  22. package/lib/commonjs/Directions.js +19 -6
  23. package/lib/commonjs/Directions.js.map +1 -1
  24. package/lib/commonjs/RNGestureHandlerModule.js +97 -4
  25. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  26. package/lib/commonjs/RNGestureHandlerModule.native.js +16 -0
  27. package/lib/commonjs/RNGestureHandlerModule.native.js.map +1 -0
  28. package/lib/commonjs/RNRenderer.js +5 -10
  29. package/lib/commonjs/RNRenderer.js.map +1 -1
  30. package/lib/commonjs/RNRenderer.native.js +16 -0
  31. package/lib/commonjs/RNRenderer.native.js.map +1 -0
  32. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  33. package/lib/commonjs/components/GestureComponents.js +19 -82
  34. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  35. package/lib/commonjs/components/GestureComponents.native.js +115 -0
  36. package/lib/commonjs/components/GestureComponents.native.js.map +1 -0
  37. package/lib/commonjs/components/GestureHandlerButton.js +13 -3
  38. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  39. package/lib/commonjs/components/GestureHandlerButton.native.js +14 -0
  40. package/lib/commonjs/components/GestureHandlerButton.native.js.map +1 -0
  41. package/lib/commonjs/components/GestureHandlerRootView.js +0 -6
  42. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  43. package/lib/commonjs/components/{GestureHandlerRootView.web.js → GestureHandlerRootView.native.js} +7 -1
  44. package/lib/commonjs/components/GestureHandlerRootView.native.js.map +1 -0
  45. package/lib/commonjs/components/Swipeable.js +3 -1
  46. package/lib/commonjs/components/Swipeable.js.map +1 -1
  47. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
  48. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  49. package/lib/commonjs/getReactNativeVersion.js +1 -12
  50. package/lib/commonjs/getReactNativeVersion.js.map +1 -1
  51. package/lib/commonjs/getReactNativeVersion.native.js +22 -0
  52. package/lib/commonjs/getReactNativeVersion.native.js.map +1 -0
  53. package/lib/commonjs/getShadowNodeFromRef.js +5 -34
  54. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  55. package/lib/commonjs/getShadowNodeFromRef.native.js +44 -0
  56. package/lib/commonjs/getShadowNodeFromRef.native.js.map +1 -0
  57. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  58. package/lib/commonjs/handlers/PressabilityDebugView.js +5 -7
  59. package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -1
  60. package/lib/commonjs/handlers/PressabilityDebugView.native.js +14 -0
  61. package/lib/commonjs/handlers/PressabilityDebugView.native.js.map +1 -0
  62. package/lib/commonjs/handlers/createHandler.js +11 -5
  63. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  64. package/lib/commonjs/handlers/customDirectEventTypes.js +11 -0
  65. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
  66. package/lib/commonjs/handlers/customDirectEventTypes.native.js +14 -0
  67. package/lib/commonjs/handlers/customDirectEventTypes.native.js.map +1 -0
  68. package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
  69. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  70. package/lib/commonjs/handlers/gestures/GestureDetector.js +25 -0
  71. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  72. package/lib/commonjs/handlers/gestures/flingGesture.js +13 -0
  73. package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -1
  74. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +17 -0
  75. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  76. package/lib/commonjs/handlers/gestures/gesture.js +135 -0
  77. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  78. package/lib/commonjs/handlers/gestures/gestureObjects.js +66 -0
  79. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -1
  80. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +1 -1
  81. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -1
  82. package/lib/commonjs/handlers/gestures/hoverGesture.js +1 -1
  83. package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
  84. package/lib/commonjs/handlers/gestures/longPressGesture.js +12 -0
  85. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
  86. package/lib/commonjs/handlers/gestures/nativeGesture.js +10 -0
  87. package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -1
  88. package/lib/commonjs/handlers/gestures/panGesture.js +76 -0
  89. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  90. package/lib/commonjs/handlers/gestures/tapGesture.js +42 -0
  91. package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -1
  92. package/lib/commonjs/index.js +8 -8
  93. package/lib/commonjs/index.js.map +1 -1
  94. package/lib/commonjs/mocks.js +2 -0
  95. package/lib/commonjs/mocks.js.map +1 -1
  96. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  97. package/lib/commonjs/utils.js +5 -1
  98. package/lib/commonjs/utils.js.map +1 -1
  99. package/lib/commonjs/web/Gestures.js +66 -0
  100. package/lib/commonjs/web/Gestures.js.map +1 -0
  101. package/lib/commonjs/web/constants.js +3 -8
  102. package/lib/commonjs/web/constants.js.map +1 -1
  103. package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
  104. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  105. package/lib/commonjs/web/handlers/GestureHandler.js +11 -9
  106. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  107. package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
  108. package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
  109. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
  110. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  111. package/lib/commonjs/web/handlers/PanGestureHandler.js +3 -1
  112. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  113. package/lib/commonjs/web/interfaces.js +1 -13
  114. package/lib/commonjs/web/interfaces.js.map +1 -1
  115. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  116. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +114 -115
  117. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  118. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
  119. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  120. package/lib/commonjs/web/tools/InteractionManager.js +12 -3
  121. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  122. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  123. package/lib/commonjs/web/tools/PointerEventManager.js +55 -27
  124. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  125. package/lib/commonjs/web/tools/TouchEventManager.js +26 -5
  126. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  127. package/lib/commonjs/web/tools/Vector.js +58 -0
  128. package/lib/commonjs/web/tools/Vector.js.map +1 -0
  129. package/lib/commonjs/web/utils.js +9 -1
  130. package/lib/commonjs/web/utils.js.map +1 -1
  131. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  132. package/lib/module/Directions.js +16 -4
  133. package/lib/module/Directions.js.map +1 -1
  134. package/lib/module/RNGestureHandlerModule.js +84 -4
  135. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  136. package/lib/module/RNGestureHandlerModule.native.js +5 -0
  137. package/lib/module/RNGestureHandlerModule.native.js.map +1 -0
  138. package/lib/module/RNRenderer.js +3 -3
  139. package/lib/module/RNRenderer.js.map +1 -1
  140. package/lib/module/RNRenderer.native.js +4 -0
  141. package/lib/module/RNRenderer.native.js.map +1 -0
  142. package/lib/module/components/DrawerLayout.js.map +1 -1
  143. package/lib/module/components/GestureComponents.js +18 -80
  144. package/lib/module/components/GestureComponents.js.map +1 -1
  145. package/lib/module/components/GestureComponents.native.js +90 -0
  146. package/lib/module/components/GestureComponents.native.js.map +1 -0
  147. package/lib/module/components/GestureHandlerButton.js +8 -2
  148. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  149. package/lib/module/components/GestureHandlerButton.native.js +3 -0
  150. package/lib/module/components/GestureHandlerButton.native.js.map +1 -0
  151. package/lib/module/components/GestureHandlerRootView.js +0 -5
  152. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  153. package/lib/module/components/{GestureHandlerRootView.web.js → GestureHandlerRootView.native.js} +6 -1
  154. package/lib/module/components/GestureHandlerRootView.native.js.map +1 -0
  155. package/lib/module/components/Swipeable.js +3 -1
  156. package/lib/module/components/Swipeable.js.map +1 -1
  157. package/lib/module/components/touchables/GenericTouchable.js +1 -0
  158. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  159. package/lib/module/getReactNativeVersion.js +1 -7
  160. package/lib/module/getReactNativeVersion.js.map +1 -1
  161. package/lib/module/getReactNativeVersion.native.js +10 -0
  162. package/lib/module/getReactNativeVersion.native.js.map +1 -0
  163. package/lib/module/getShadowNodeFromRef.js +4 -33
  164. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  165. package/lib/module/getShadowNodeFromRef.native.js +37 -0
  166. package/lib/module/getShadowNodeFromRef.native.js.map +1 -0
  167. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  168. package/lib/module/handlers/PressabilityDebugView.js +4 -2
  169. package/lib/module/handlers/PressabilityDebugView.js.map +1 -1
  170. package/lib/module/handlers/PressabilityDebugView.native.js +3 -0
  171. package/lib/module/handlers/PressabilityDebugView.native.js.map +1 -0
  172. package/lib/module/handlers/createHandler.js +11 -6
  173. package/lib/module/handlers/createHandler.js.map +1 -1
  174. package/lib/module/handlers/customDirectEventTypes.js +5 -0
  175. package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
  176. package/lib/module/handlers/customDirectEventTypes.native.js +3 -0
  177. package/lib/module/handlers/customDirectEventTypes.native.js.map +1 -0
  178. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  179. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  180. package/lib/module/handlers/gestures/GestureDetector.js +25 -0
  181. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  182. package/lib/module/handlers/gestures/flingGesture.js +13 -0
  183. package/lib/module/handlers/gestures/flingGesture.js.map +1 -1
  184. package/lib/module/handlers/gestures/forceTouchGesture.js +17 -0
  185. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  186. package/lib/module/handlers/gestures/gesture.js +135 -0
  187. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  188. package/lib/module/handlers/gestures/gestureObjects.js +67 -0
  189. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -1
  190. package/lib/module/handlers/gestures/gestureStateManager.web.js +1 -1
  191. package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -1
  192. package/lib/module/handlers/gestures/hoverGesture.js +1 -1
  193. package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
  194. package/lib/module/handlers/gestures/longPressGesture.js +12 -0
  195. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
  196. package/lib/module/handlers/gestures/nativeGesture.js +10 -0
  197. package/lib/module/handlers/gestures/nativeGesture.js.map +1 -1
  198. package/lib/module/handlers/gestures/panGesture.js +76 -0
  199. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  200. package/lib/module/handlers/gestures/tapGesture.js +42 -0
  201. package/lib/module/handlers/gestures/tapGesture.js.map +1 -1
  202. package/lib/module/index.js +1 -1
  203. package/lib/module/index.js.map +1 -1
  204. package/lib/module/mocks.js +2 -0
  205. package/lib/module/mocks.js.map +1 -1
  206. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  207. package/lib/module/utils.js +5 -1
  208. package/lib/module/utils.js.map +1 -1
  209. package/lib/module/web/Gestures.js +39 -0
  210. package/lib/module/web/Gestures.js.map +1 -0
  211. package/lib/module/web/constants.js +1 -6
  212. package/lib/module/web/constants.js.map +1 -1
  213. package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
  214. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  215. package/lib/module/web/handlers/GestureHandler.js +10 -9
  216. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  217. package/lib/module/web/handlers/IGestureHandler.js +2 -0
  218. package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
  219. package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
  220. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  221. package/lib/module/web/handlers/PanGestureHandler.js +3 -1
  222. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  223. package/lib/module/web/interfaces.js +0 -11
  224. package/lib/module/web/interfaces.js.map +1 -1
  225. package/lib/module/web/tools/EventManager.js.map +1 -1
  226. package/lib/module/web/tools/GestureHandlerOrchestrator.js +114 -115
  227. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  228. package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
  229. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  230. package/lib/module/web/tools/InteractionManager.js +9 -3
  231. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  232. package/lib/module/web/tools/NodeManager.js.map +1 -1
  233. package/lib/module/web/tools/PointerEventManager.js +53 -26
  234. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  235. package/lib/module/web/tools/TouchEventManager.js +26 -5
  236. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  237. package/lib/module/web/tools/Vector.js +47 -0
  238. package/lib/module/web/tools/Vector.js.map +1 -0
  239. package/lib/module/web/utils.js +2 -0
  240. package/lib/module/web/utils.js.map +1 -1
  241. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  242. package/lib/typescript/Directions.d.ts +7 -0
  243. package/lib/typescript/RNGestureHandlerModule.d.ts +15 -2
  244. package/lib/typescript/RNGestureHandlerModule.native.d.ts +2 -0
  245. package/lib/typescript/RNRenderer.d.ts +3 -1
  246. package/lib/typescript/RNRenderer.native.d.ts +1 -0
  247. package/lib/typescript/components/DrawerLayout.d.ts +1 -2
  248. package/lib/typescript/components/GestureComponents.d.ts +7 -21
  249. package/lib/typescript/components/GestureComponents.native.d.ts +22 -0
  250. package/lib/typescript/components/GestureHandlerButton.d.ts +3 -3
  251. package/lib/typescript/components/GestureHandlerButton.native.d.ts +4 -0
  252. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
  253. package/lib/typescript/getReactNativeVersion.d.ts +1 -4
  254. package/lib/typescript/getReactNativeVersion.native.d.ts +4 -0
  255. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -1
  256. package/lib/typescript/getShadowNodeFromRef.native.d.ts +1 -0
  257. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  258. package/lib/typescript/handlers/PanGestureHandler.d.ts +4 -4
  259. package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -1
  260. package/lib/typescript/handlers/PressabilityDebugView.native.d.ts +1 -0
  261. package/lib/typescript/handlers/customDirectEventTypes.d.ts +2 -0
  262. package/lib/typescript/handlers/customDirectEventTypes.native.d.ts +1 -0
  263. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +11 -2
  264. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +38 -1
  265. package/lib/typescript/handlers/gestures/flingGesture.d.ts +11 -0
  266. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +14 -0
  267. package/lib/typescript/handlers/gestures/gesture.d.ts +114 -2
  268. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +57 -0
  269. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -1
  270. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +10 -0
  271. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +8 -0
  272. package/lib/typescript/handlers/gestures/panGesture.d.ts +67 -4
  273. package/lib/typescript/handlers/gestures/tapGesture.d.ts +35 -0
  274. package/lib/typescript/index.d.ts +1 -1
  275. package/lib/typescript/mocks.d.ts +1 -0
  276. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
  277. package/lib/typescript/web/Gestures.d.ts +36 -0
  278. package/lib/typescript/web/constants.d.ts +1 -6
  279. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
  280. package/lib/typescript/web/handlers/GestureHandler.d.ts +13 -11
  281. package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
  282. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  283. package/lib/typescript/web/interfaces.d.ts +8 -10
  284. package/lib/typescript/web/tools/EventManager.d.ts +15 -12
  285. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
  286. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
  287. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
  288. package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
  289. package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
  290. package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
  291. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
  292. package/lib/typescript/web/tools/Vector.d.ts +15 -0
  293. package/lib/typescript/web/utils.d.ts +4 -4
  294. package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
  295. package/package.json +4 -2
  296. package/src/Directions.ts +21 -4
  297. package/src/RNGestureHandlerModule.native.ts +5 -0
  298. package/src/RNGestureHandlerModule.ts +104 -4
  299. package/src/RNRenderer.native.ts +3 -0
  300. package/src/RNRenderer.ts +3 -3
  301. package/src/components/DrawerLayout.tsx +1 -1
  302. package/src/components/GestureComponents.native.tsx +148 -0
  303. package/src/components/GestureComponents.tsx +24 -131
  304. package/src/components/GestureHandlerButton.native.tsx +5 -0
  305. package/src/components/GestureHandlerButton.tsx +5 -4
  306. package/src/components/{GestureHandlerRootView.web.tsx → GestureHandlerRootView.native.tsx} +6 -0
  307. package/src/components/GestureHandlerRootView.tsx +0 -6
  308. package/src/components/Swipeable.tsx +2 -0
  309. package/src/components/touchables/GenericTouchable.tsx +3 -0
  310. package/src/getReactNativeVersion.native.ts +11 -0
  311. package/src/getReactNativeVersion.ts +1 -9
  312. package/src/getShadowNodeFromRef.native.ts +44 -0
  313. package/src/getShadowNodeFromRef.ts +4 -41
  314. package/src/handlers/PanGestureHandler.ts +8 -4
  315. package/src/handlers/PressabilityDebugView.native.tsx +2 -0
  316. package/src/handlers/PressabilityDebugView.tsx +4 -2
  317. package/src/handlers/createHandler.tsx +24 -14
  318. package/src/handlers/customDirectEventTypes.native.ts +2 -0
  319. package/src/handlers/customDirectEventTypes.ts +5 -0
  320. package/src/handlers/gestureHandlerCommon.ts +28 -1
  321. package/src/handlers/gestures/GestureDetector.tsx +62 -4
  322. package/src/handlers/gestures/flingGesture.ts +11 -0
  323. package/src/handlers/gestures/forceTouchGesture.ts +14 -0
  324. package/src/handlers/gestures/gesture.ts +114 -1
  325. package/src/handlers/gestures/gestureObjects.ts +57 -0
  326. package/src/handlers/gestures/gestureStateManager.web.ts +1 -1
  327. package/src/handlers/gestures/hoverGesture.ts +1 -1
  328. package/src/handlers/gestures/longPressGesture.ts +10 -0
  329. package/src/handlers/gestures/nativeGesture.ts +8 -0
  330. package/src/handlers/gestures/panGesture.ts +75 -4
  331. package/src/handlers/gestures/tapGesture.ts +35 -0
  332. package/src/index.ts +1 -1
  333. package/src/mocks.ts +2 -0
  334. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
  335. package/src/utils.ts +9 -2
  336. package/src/web/Gestures.ts +41 -0
  337. package/src/web/constants.ts +1 -7
  338. package/src/web/handlers/FlingGestureHandler.ts +54 -24
  339. package/src/web/handlers/GestureHandler.ts +23 -19
  340. package/src/web/handlers/IGestureHandler.ts +50 -0
  341. package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
  342. package/src/web/handlers/PanGestureHandler.ts +4 -0
  343. package/src/web/interfaces.ts +14 -10
  344. package/src/web/tools/EventManager.ts +16 -14
  345. package/src/web/tools/GestureHandlerDelegate.ts +3 -4
  346. package/src/web/tools/GestureHandlerOrchestrator.ts +160 -145
  347. package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
  348. package/src/web/tools/InteractionManager.ts +18 -12
  349. package/src/web/tools/NodeManager.ts +4 -3
  350. package/src/web/tools/PointerEventManager.ts +181 -166
  351. package/src/web/tools/TouchEventManager.ts +126 -114
  352. package/src/web/tools/Vector.ts +60 -0
  353. package/src/web/utils.ts +7 -4
  354. package/src/web_hammer/NodeManager.ts +1 -1
  355. package/lib/commonjs/RNGestureHandlerModule.web.js +0 -163
  356. package/lib/commonjs/RNGestureHandlerModule.web.js.map +0 -1
  357. package/lib/commonjs/RNRenderer.web.js +0 -11
  358. package/lib/commonjs/RNRenderer.web.js.map +0 -1
  359. package/lib/commonjs/components/GestureComponents.web.js +0 -52
  360. package/lib/commonjs/components/GestureComponents.web.js.map +0 -1
  361. package/lib/commonjs/components/GestureHandlerButton.web.js +0 -24
  362. package/lib/commonjs/components/GestureHandlerButton.web.js.map +0 -1
  363. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +0 -1
  364. package/lib/commonjs/getReactNativeVersion.web.js +0 -11
  365. package/lib/commonjs/getReactNativeVersion.web.js.map +0 -1
  366. package/lib/commonjs/getShadowNodeFromRef.web.js +0 -15
  367. package/lib/commonjs/getShadowNodeFromRef.web.js.map +0 -1
  368. package/lib/commonjs/handlers/PressabilityDebugView.web.js +0 -12
  369. package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +0 -1
  370. package/lib/module/RNGestureHandlerModule.web.js +0 -122
  371. package/lib/module/RNGestureHandlerModule.web.js.map +0 -1
  372. package/lib/module/RNRenderer.web.js +0 -4
  373. package/lib/module/RNRenderer.web.js.map +0 -1
  374. package/lib/module/components/GestureComponents.web.js +0 -28
  375. package/lib/module/components/GestureComponents.web.js.map +0 -1
  376. package/lib/module/components/GestureHandlerButton.web.js +0 -9
  377. package/lib/module/components/GestureHandlerButton.web.js.map +0 -1
  378. package/lib/module/components/GestureHandlerRootView.web.js.map +0 -1
  379. package/lib/module/getReactNativeVersion.web.js +0 -4
  380. package/lib/module/getReactNativeVersion.web.js.map +0 -1
  381. package/lib/module/getShadowNodeFromRef.web.js +0 -8
  382. package/lib/module/getShadowNodeFromRef.web.js.map +0 -1
  383. package/lib/module/handlers/PressabilityDebugView.web.js +0 -5
  384. package/lib/module/handlers/PressabilityDebugView.web.js.map +0 -1
  385. package/lib/typescript/RNGestureHandlerModule.web.d.ts +0 -50
  386. package/lib/typescript/RNRenderer.web.d.ts +0 -3
  387. package/lib/typescript/components/GestureComponents.web.d.ts +0 -8
  388. package/lib/typescript/components/GestureHandlerButton.web.d.ts +0 -4
  389. package/lib/typescript/getReactNativeVersion.web.d.ts +0 -1
  390. package/lib/typescript/getShadowNodeFromRef.web.d.ts +0 -1
  391. package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +0 -1
  392. package/src/RNGestureHandlerModule.web.ts +0 -146
  393. package/src/RNRenderer.web.ts +0 -3
  394. package/src/components/GestureComponents.web.tsx +0 -41
  395. package/src/components/GestureHandlerButton.web.tsx +0 -6
  396. package/src/getReactNativeVersion.web.ts +0 -3
  397. package/src/getShadowNodeFromRef.web.ts +0 -7
  398. package/src/handlers/PressabilityDebugView.web.tsx +0 -4
  399. /package/lib/typescript/components/{GestureHandlerRootView.web.d.ts → GestureHandlerRootView.native.d.ts} +0 -0
package/README.md CHANGED
@@ -39,6 +39,7 @@ 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.16.0+ | 0.68.0+ |
42
43
  | 2.14.0+ | 0.67.0+ |
43
44
  | 2.10.0+ | 0.64.0+ |
44
45
  | 2.0.0+ | 0.63.0+ |
@@ -4,6 +4,8 @@ import com.facebook.react.bridge.ReactContext
4
4
  import com.facebook.react.uimanager.events.Event
5
5
 
6
6
  class ReanimatedEventDispatcher {
7
+ @Suppress("UNUSED_PARAMETER", "COMMENT_IN_SUPPRESSION")
8
+ // This is necessary on new architecture
7
9
  fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
8
10
  // no-op
9
11
  }
@@ -43,6 +43,15 @@ public class RNGestureHandlerButtonManagerDelegate<T extends View, U extends Bas
43
43
  case "touchSoundDisabled":
44
44
  mViewManager.setTouchSoundDisabled(view, value == null ? false : (boolean) value);
45
45
  break;
46
+ case "borderWidth":
47
+ mViewManager.setBorderWidth(view, value == null ? 0f : ((Double) value).floatValue());
48
+ break;
49
+ case "borderColor":
50
+ mViewManager.setBorderColor(view, ColorPropConverter.getColor(value, view.getContext()));
51
+ break;
52
+ case "borderStyle":
53
+ mViewManager.setBorderStyle(view, value == null ? "solid" : (String) value);
54
+ break;
46
55
  default:
47
56
  super.setProperty(view, propName, value);
48
57
  }
@@ -20,4 +20,7 @@ public interface RNGestureHandlerButtonManagerInterface<T extends View> {
20
20
  void setRippleColor(T view, @Nullable Integer value);
21
21
  void setRippleRadius(T view, int value);
22
22
  void setTouchSoundDisabled(T view, boolean value);
23
+ void setBorderWidth(T view, float value);
24
+ void setBorderColor(T view, @Nullable Integer value);
25
+ void setBorderStyle(T view, @Nullable String value);
23
26
  }
@@ -60,7 +60,7 @@ class RNGestureHandlerPackage : TurboReactPackage(), ViewManagerOnDemandReactPac
60
60
  try {
61
61
  val reactModuleInfoProviderClass =
62
62
  Class.forName("com.swmansion.gesturehandler.RNGestureHandlerPackage$\$ReactModuleInfoProvider")
63
- return reactModuleInfoProviderClass.newInstance() as ReactModuleInfoProvider
63
+ return reactModuleInfoProviderClass.getDeclaredConstructor().newInstance() as ReactModuleInfoProvider
64
64
  } catch (e: ClassNotFoundException) {
65
65
  return ReactModuleInfoProvider {
66
66
  val reactModule: ReactModule = RNGestureHandlerModule::class.java.getAnnotation(ReactModule::class.java)!!
@@ -71,7 +71,7 @@ class RNGestureHandlerPackage : TurboReactPackage(), ViewManagerOnDemandReactPac
71
71
  RNGestureHandlerModule::class.java.name,
72
72
  reactModule.canOverrideExistingModule,
73
73
  reactModule.needsEagerInit,
74
- reactModule.hasConstants,
74
+ true, // Has constants is hardcoded to return true, so replacing it with `true` changes nothing.
75
75
  reactModule.isCxxModule,
76
76
  true
77
77
  )
@@ -0,0 +1,8 @@
1
+ package com.swmansion.gesturehandler.core
2
+
3
+ object DiagonalDirections {
4
+ const val DIRECTION_RIGHT_UP = GestureHandler.DIRECTION_RIGHT or GestureHandler.DIRECTION_UP
5
+ const val DIRECTION_RIGHT_DOWN = GestureHandler.DIRECTION_RIGHT or GestureHandler.DIRECTION_DOWN
6
+ const val DIRECTION_LEFT_UP = GestureHandler.DIRECTION_LEFT or GestureHandler.DIRECTION_UP
7
+ const val DIRECTION_LEFT_DOWN = GestureHandler.DIRECTION_LEFT or GestureHandler.DIRECTION_DOWN
8
+ }
@@ -3,18 +3,18 @@ package com.swmansion.gesturehandler.core
3
3
  import android.os.Handler
4
4
  import android.os.Looper
5
5
  import android.view.MotionEvent
6
+ import android.view.VelocityTracker
6
7
 
7
8
  class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
8
9
  var numberOfPointersRequired = DEFAULT_NUMBER_OF_TOUCHES_REQUIRED
9
10
  var direction = DEFAULT_DIRECTION
10
11
 
11
12
  private val maxDurationMs = DEFAULT_MAX_DURATION_MS
12
- private val minAcceptableDelta = DEFAULT_MIN_ACCEPTABLE_DELTA
13
- private var startX = 0f
14
- private var startY = 0f
13
+ private val minVelocity = DEFAULT_MIN_VELOCITY
15
14
  private var handler: Handler? = null
16
15
  private var maxNumberOfPointersSimultaneously = 0
17
16
  private val failDelayed = Runnable { fail() }
17
+ private var velocityTracker: VelocityTracker? = null
18
18
 
19
19
  override fun resetConfig() {
20
20
  super.resetConfig()
@@ -23,8 +23,7 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
23
23
  }
24
24
 
25
25
  private fun startFling(event: MotionEvent) {
26
- startX = event.rawX
27
- startY = event.rawY
26
+ velocityTracker = VelocityTracker.obtain()
28
27
  begin()
29
28
  maxNumberOfPointersSimultaneously = 1
30
29
  if (handler == null) {
@@ -35,26 +34,48 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
35
34
  handler!!.postDelayed(failDelayed, maxDurationMs)
36
35
  }
37
36
 
38
- private fun tryEndFling(event: MotionEvent) = if (
39
- maxNumberOfPointersSimultaneously == numberOfPointersRequired &&
40
- (
41
- direction and DIRECTION_RIGHT != 0 &&
42
- event.rawX - startX > minAcceptableDelta ||
43
- direction and DIRECTION_LEFT != 0 &&
44
- startX - event.rawX > minAcceptableDelta ||
45
- direction and DIRECTION_UP != 0 &&
46
- startY - event.rawY > minAcceptableDelta ||
47
- direction and DIRECTION_DOWN != 0 &&
48
- event.rawY - startY > minAcceptableDelta
37
+ private fun tryEndFling(event: MotionEvent): Boolean {
38
+ addVelocityMovement(velocityTracker, event)
39
+
40
+ val velocityVector = Vector.fromVelocity(velocityTracker!!)
41
+
42
+ fun getVelocityAlignment(
43
+ direction: Int,
44
+ maxDeviationCosine: Double,
45
+ ): Boolean = (
46
+ (this.direction and direction) == direction &&
47
+ velocityVector.isSimilar(Vector.fromDirection(direction), maxDeviationCosine)
49
48
  )
50
- ) {
51
- handler!!.removeCallbacksAndMessages(null)
52
- activate()
53
- true
54
- } else {
55
- false
56
- }
57
49
 
50
+ val axialAlignmentsList = arrayOf(
51
+ DIRECTION_LEFT,
52
+ DIRECTION_RIGHT,
53
+ DIRECTION_UP,
54
+ DIRECTION_DOWN,
55
+ ).map { direction -> getVelocityAlignment(direction, MAX_AXIAL_DEVIATION) }
56
+
57
+ val diagonalAlignmentsList = arrayOf(
58
+ DiagonalDirections.DIRECTION_RIGHT_UP,
59
+ DiagonalDirections.DIRECTION_RIGHT_DOWN,
60
+ DiagonalDirections.DIRECTION_LEFT_UP,
61
+ DiagonalDirections.DIRECTION_LEFT_DOWN,
62
+ ).map { direction -> getVelocityAlignment(direction, MAX_DIAGONAL_DEVIATION) }
63
+
64
+ val isAligned = axialAlignmentsList.any { it } or diagonalAlignmentsList.any { it }
65
+ val isFast = velocityVector.magnitude > this.minVelocity
66
+
67
+ return if (
68
+ maxNumberOfPointersSimultaneously == numberOfPointersRequired &&
69
+ isAligned &&
70
+ isFast
71
+ ) {
72
+ handler!!.removeCallbacksAndMessages(null)
73
+ activate()
74
+ true
75
+ } else {
76
+ false
77
+ }
78
+ }
58
79
  override fun activate(force: Boolean) {
59
80
  super.activate(force)
60
81
  end()
@@ -92,13 +113,29 @@ class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
92
113
  }
93
114
 
94
115
  override fun onReset() {
116
+ velocityTracker?.recycle()
117
+ velocityTracker = null
95
118
  handler?.removeCallbacksAndMessages(null)
96
119
  }
97
120
 
121
+ private fun addVelocityMovement(tracker: VelocityTracker?, event: MotionEvent) {
122
+ val offsetX = event.rawX - event.x
123
+ val offsetY = event.rawY - event.y
124
+ event.offsetLocation(offsetX, offsetY)
125
+ tracker!!.addMovement(event)
126
+ event.offsetLocation(-offsetX, -offsetY)
127
+ }
128
+
98
129
  companion object {
99
130
  private const val DEFAULT_MAX_DURATION_MS: Long = 800
100
- private const val DEFAULT_MIN_ACCEPTABLE_DELTA: Long = 160
131
+ private const val DEFAULT_MIN_VELOCITY: Long = 2000
132
+ private const val DEFAULT_ALIGNMENT_CONE: Double = 30.0
101
133
  private const val DEFAULT_DIRECTION = DIRECTION_RIGHT
102
134
  private const val DEFAULT_NUMBER_OF_TOUCHES_REQUIRED = 1
135
+
136
+ private val MAX_AXIAL_DEVIATION: Double =
137
+ GestureUtils.coneToDeviation(DEFAULT_ALIGNMENT_CONE)
138
+ private val MAX_DIAGONAL_DEVIATION: Double =
139
+ GestureUtils.coneToDeviation(90 - DEFAULT_ALIGNMENT_CONE)
103
140
  }
104
141
  }
@@ -4,14 +4,13 @@ import android.app.Activity
4
4
  import android.content.Context
5
5
  import android.content.ContextWrapper
6
6
  import android.graphics.PointF
7
- import android.graphics.Rect
8
7
  import android.os.Build
9
8
  import android.view.MotionEvent
10
9
  import android.view.MotionEvent.PointerCoords
11
10
  import android.view.MotionEvent.PointerProperties
12
11
  import android.view.View
13
- import android.view.Window
14
12
  import com.facebook.react.bridge.Arguments
13
+ import com.facebook.react.bridge.ReactContext
15
14
  import com.facebook.react.bridge.UiThreadUtil
16
15
  import com.facebook.react.bridge.WritableArray
17
16
  import com.facebook.react.uimanager.PixelUtil
@@ -176,12 +175,9 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
176
175
  this.view = view
177
176
  this.orchestrator = orchestrator
178
177
 
179
- val decorView = getWindow(view?.context)?.decorView
180
- if (decorView != null) {
181
- val frame = Rect()
182
- decorView.getWindowVisibleDisplayFrame(frame)
183
- windowOffset[0] = frame.left
184
- windowOffset[1] = frame.top
178
+ val content = getActivity(view?.context)?.findViewById<View>(android.R.id.content)
179
+ if (content != null) {
180
+ content.getLocationOnScreen(windowOffset)
185
181
  } else {
186
182
  windowOffset[0] = 0
187
183
  windowOffset[1] = 0
@@ -192,13 +188,13 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
192
188
 
193
189
  protected open fun onPrepare() {}
194
190
 
195
- private fun getWindow(context: Context?): Window? {
196
- if (context == null) return null
197
- if (context is Activity) return context.window
198
- if (context is ContextWrapper) return getWindow(context.baseContext)
199
-
200
- return null
201
- }
191
+ private fun getActivity(context: Context?): Activity? =
192
+ when (context) {
193
+ is ReactContext -> context.currentActivity
194
+ is Activity -> context
195
+ is ContextWrapper -> getActivity(context.baseContext)
196
+ else -> null
197
+ }
202
198
 
203
199
  private fun findNextLocalPointerId(): Int {
204
200
  var localPointerId = 0
@@ -656,7 +652,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
656
652
  }
657
653
 
658
654
  fun cancel() {
659
- if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN) {
655
+ if (state == STATE_ACTIVE || state == STATE_UNDETERMINED || state == STATE_BEGAN || this.isAwaiting) {
660
656
  onCancel()
661
657
  moveToState(STATE_CANCELLED)
662
658
  }
@@ -762,7 +758,6 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
762
758
  orchestrator = null
763
759
  Arrays.fill(trackedPointerIDs, -1)
764
760
  trackedPointersIDsCount = 0
765
-
766
761
  trackedPointersCount = 0
767
762
  trackedPointers.fill(null)
768
763
  touchEventType = RNGestureHandlerTouchEvent.EVENT_UNDETERMINED
@@ -836,15 +831,15 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
836
831
  private lateinit var pointerProps: Array<PointerProperties?>
837
832
  private lateinit var pointerCoords: Array<PointerCoords?>
838
833
  private fun initPointerProps(size: Int) {
839
- var size = size
834
+ var pointerPropsSize = size
840
835
  if (!Companion::pointerProps.isInitialized) {
841
836
  pointerProps = arrayOfNulls(MAX_POINTERS_COUNT)
842
837
  pointerCoords = arrayOfNulls(MAX_POINTERS_COUNT)
843
838
  }
844
- while (size > 0 && pointerProps[size - 1] == null) {
845
- pointerProps[size - 1] = PointerProperties()
846
- pointerCoords[size - 1] = PointerCoords()
847
- size--
839
+ while (pointerPropsSize > 0 && pointerProps[pointerPropsSize - 1] == null) {
840
+ pointerProps[pointerPropsSize - 1] = PointerProperties()
841
+ pointerCoords[pointerPropsSize - 1] = PointerCoords()
842
+ pointerPropsSize--
848
843
  }
849
844
  }
850
845
 
@@ -7,6 +7,7 @@ import android.view.View
7
7
  import android.view.ViewGroup
8
8
  import android.widget.EditText
9
9
  import java.util.*
10
+ import kotlin.collections.HashSet
10
11
 
11
12
  class GestureHandlerOrchestrator(
12
13
  private val wrapperView: ViewGroup,
@@ -22,6 +23,14 @@ class GestureHandlerOrchestrator(
22
23
  private val gestureHandlers = arrayListOf<GestureHandler<*>>()
23
24
  private val awaitingHandlers = arrayListOf<GestureHandler<*>>()
24
25
  private val preparedHandlers = arrayListOf<GestureHandler<*>>()
26
+
27
+ // In `onHandlerStateChange` method we iterate through `awaitingHandlers`, but calling `tryActivate` may modify this list.
28
+ // To avoid `ConcurrentModificationException` we iterate through copy. There is one more problem though - if handler was
29
+ // removed from `awaitingHandlers`, it was still present in copy of original list. This hashset helps us identify which handlers
30
+ // are really inside `awaitingHandlers`.
31
+ // `contains` method on HashSet has O(1) complexity, so calling it inside for loop won't result in O(n^2) (contrary to ArrayList)
32
+ private val awaitingHandlersTags = HashSet<Int>()
33
+
25
34
  private var isHandlingTouch = false
26
35
  private var handlingChangeSemaphore = 0
27
36
  private var finishedHandlersCleanupScheduled = false
@@ -73,16 +82,18 @@ class GestureHandlerOrchestrator(
73
82
  finishedHandlersCleanupScheduled = false
74
83
  }
75
84
 
76
- private fun hasOtherHandlerToWaitFor(handler: GestureHandler<*>): Boolean {
77
- for (otherHandler in gestureHandlers) {
78
- if (!isFinished(otherHandler.state) && shouldHandlerWaitForOther(handler, otherHandler)) {
79
- return true
80
- }
81
- }
82
- return false
83
- }
85
+ private fun hasOtherHandlerToWaitFor(handler: GestureHandler<*>) =
86
+ gestureHandlers.any { !isFinished(it.state) && shouldHandlerWaitForOther(handler, it) }
87
+
88
+ private fun shouldBeCancelledByFinishedHandler(handler: GestureHandler<*>) = gestureHandlers.any { shouldHandlerWaitForOther(handler, it) && it.state == GestureHandler.STATE_END }
84
89
 
85
90
  private fun tryActivate(handler: GestureHandler<*>) {
91
+ // If we are waiting for a gesture that has successfully finished, we should cancel handler
92
+ if (shouldBeCancelledByFinishedHandler(handler)) {
93
+ handler.cancel()
94
+ return
95
+ }
96
+
86
97
  // see if there is anyone else who we need to wait for
87
98
  if (hasOtherHandlerToWaitFor(handler)) {
88
99
  addAwaitingHandler(handler)
@@ -94,7 +105,14 @@ class GestureHandlerOrchestrator(
94
105
  }
95
106
 
96
107
  private fun cleanupAwaitingHandlers() {
97
- awaitingHandlers.removeAll { !it.isAwaiting }
108
+ val awaitingHandlersCopy = awaitingHandlers.toList()
109
+
110
+ for (handler in awaitingHandlersCopy) {
111
+ if (!handler.isAwaiting) {
112
+ awaitingHandlers.remove(handler)
113
+ awaitingHandlersTags.remove(handler.tag)
114
+ }
115
+ }
98
116
  }
99
117
 
100
118
  /*package*/
@@ -107,7 +125,7 @@ class GestureHandlerOrchestrator(
107
125
 
108
126
  // if there were handlers awaiting completion of this handler, we can trigger active state
109
127
  for (otherHandler in currentlyAwaitingHandlers) {
110
- if (!shouldHandlerWaitForOther(otherHandler, handler)) {
128
+ if (!shouldHandlerWaitForOther(otherHandler, handler) || !awaitingHandlersTags.contains(otherHandler.tag)) {
111
129
  continue
112
130
  }
113
131
 
@@ -174,7 +192,6 @@ class GestureHandlerOrchestrator(
174
192
  // Clear all awaiting handlers waiting for the current handler to fail
175
193
  for (otherHandler in awaitingHandlers.reversed()) {
176
194
  if (shouldHandlerBeCancelledBy(otherHandler, handler)) {
177
- otherHandler.cancel()
178
195
  otherHandler.isAwaiting = false
179
196
  }
180
197
  }
@@ -389,6 +406,8 @@ class GestureHandlerOrchestrator(
389
406
  }
390
407
 
391
408
  awaitingHandlers.add(handler)
409
+ awaitingHandlersTags.add(handler.tag)
410
+
392
411
  with(handler) {
393
412
  isAwaiting = true
394
413
  activationIndex = this@GestureHandlerOrchestrator.activationIndex++
@@ -1,6 +1,7 @@
1
1
  package com.swmansion.gesturehandler.core
2
2
 
3
3
  import android.view.MotionEvent
4
+ import kotlin.math.cos
4
5
 
5
6
  object GestureUtils {
6
7
  fun getLastPointerX(event: MotionEvent, averageTouches: Boolean): Float {
@@ -44,4 +45,6 @@ object GestureUtils {
44
45
  event.getY(lastPointerIdx)
45
46
  }
46
47
  }
48
+ fun coneToDeviation(angle: Double): Double =
49
+ cos(Math.toRadians(angle / 2.0))
47
50
  }
@@ -0,0 +1,66 @@
1
+ package com.swmansion.gesturehandler.core
2
+
3
+ import android.view.VelocityTracker
4
+ import com.swmansion.gesturehandler.core.GestureHandler.Companion.DIRECTION_DOWN
5
+ import com.swmansion.gesturehandler.core.GestureHandler.Companion.DIRECTION_LEFT
6
+ import com.swmansion.gesturehandler.core.GestureHandler.Companion.DIRECTION_RIGHT
7
+ import com.swmansion.gesturehandler.core.GestureHandler.Companion.DIRECTION_UP
8
+ import kotlin.math.hypot
9
+
10
+ class Vector(val x: Double, val y: Double) {
11
+ private val unitX: Double
12
+ private val unitY: Double
13
+ val magnitude = hypot(x, y)
14
+
15
+ init {
16
+ val isMagnitudeSufficient = magnitude > MINIMAL_MAGNITUDE
17
+
18
+ unitX = if (isMagnitudeSufficient) x / magnitude else 0.0
19
+ unitY = if (isMagnitudeSufficient) y / magnitude else 0.0
20
+ }
21
+
22
+ private fun computeSimilarity(vector: Vector): Double {
23
+ return unitX * vector.unitX + unitY * vector.unitY
24
+ }
25
+
26
+ fun isSimilar(vector: Vector, threshold: Double): Boolean {
27
+ return computeSimilarity(vector) > threshold
28
+ }
29
+
30
+ companion object {
31
+ private val VECTOR_LEFT: Vector = Vector(-1.0, 0.0)
32
+ private val VECTOR_RIGHT: Vector = Vector(1.0, 0.0)
33
+ private val VECTOR_UP: Vector = Vector(0.0, -1.0)
34
+ private val VECTOR_DOWN: Vector = Vector(0.0, 1.0)
35
+
36
+ private val VECTOR_RIGHT_UP: Vector = Vector(1.0, -1.0)
37
+ private val VECTOR_RIGHT_DOWN: Vector = Vector(1.0, 1.0)
38
+ private val VECTOR_LEFT_UP: Vector = Vector(-1.0, -1.0)
39
+ private val VECTOR_LEFT_DOWN: Vector = Vector(-1.0, 1.0)
40
+
41
+ private val VECTOR_ZERO: Vector = Vector(0.0, 0.0)
42
+ private const val MINIMAL_MAGNITUDE = 0.1
43
+
44
+ fun fromDirection(direction: Int): Vector =
45
+ when (direction) {
46
+ DIRECTION_LEFT -> VECTOR_LEFT
47
+ DIRECTION_RIGHT -> VECTOR_RIGHT
48
+ DIRECTION_UP -> VECTOR_UP
49
+ DIRECTION_DOWN -> VECTOR_DOWN
50
+ DiagonalDirections.DIRECTION_RIGHT_UP -> VECTOR_RIGHT_UP
51
+ DiagonalDirections.DIRECTION_RIGHT_DOWN -> VECTOR_RIGHT_DOWN
52
+ DiagonalDirections.DIRECTION_LEFT_UP -> VECTOR_LEFT_UP
53
+ DiagonalDirections.DIRECTION_LEFT_DOWN -> VECTOR_LEFT_DOWN
54
+ else -> VECTOR_ZERO
55
+ }
56
+
57
+ fun fromVelocity(tracker: VelocityTracker): Vector {
58
+ tracker.computeCurrentVelocity(1000)
59
+
60
+ val velocityX = tracker.xVelocity.toDouble()
61
+ val velocityY = tracker.yVelocity.toDouble()
62
+
63
+ return Vector(velocityX, velocityY)
64
+ }
65
+ }
66
+ }
@@ -5,6 +5,9 @@ import android.annotation.TargetApi
5
5
  import android.content.Context
6
6
  import android.content.res.ColorStateList
7
7
  import android.graphics.Color
8
+ import android.graphics.DashPathEffect
9
+ import android.graphics.Paint
10
+ import android.graphics.PathEffect
8
11
  import android.graphics.drawable.Drawable
9
12
  import android.graphics.drawable.LayerDrawable
10
13
  import android.graphics.drawable.PaintDrawable
@@ -65,6 +68,41 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
65
68
  view.borderRadius = borderRadius
66
69
  }
67
70
 
71
+ @ReactProp(name = "borderTopLeftRadius")
72
+ override fun setBorderTopLeftRadius(view: ButtonViewGroup, borderTopLeftRadius: Float) {
73
+ view.borderTopLeftRadius = borderTopLeftRadius
74
+ }
75
+
76
+ @ReactProp(name = "borderTopRightRadius")
77
+ override fun setBorderTopRightRadius(view: ButtonViewGroup, borderTopRightRadius: Float) {
78
+ view.borderTopRightRadius = borderTopRightRadius
79
+ }
80
+
81
+ @ReactProp(name = "borderBottomLeftRadius")
82
+ override fun setBorderBottomLeftRadius(view: ButtonViewGroup, borderBottomLeftRadius: Float) {
83
+ view.borderBottomLeftRadius = borderBottomLeftRadius
84
+ }
85
+
86
+ @ReactProp(name = "borderBottomRightRadius")
87
+ override fun setBorderBottomRightRadius(view: ButtonViewGroup, borderBottomRightRadius: Float) {
88
+ view.borderBottomRightRadius = borderBottomRightRadius
89
+ }
90
+
91
+ @ReactProp(name = "borderWidth")
92
+ override fun setBorderWidth(view: ButtonViewGroup, borderWidth: Float) {
93
+ view.borderWidth = borderWidth
94
+ }
95
+
96
+ @ReactProp(name = "borderColor")
97
+ override fun setBorderColor(view: ButtonViewGroup, borderColor: Int?) {
98
+ view.borderColor = borderColor
99
+ }
100
+
101
+ @ReactProp(name = "borderStyle")
102
+ override fun setBorderStyle(view: ButtonViewGroup, borderStyle: String?) {
103
+ view.borderStyle = borderStyle
104
+ }
105
+
68
106
  @ReactProp(name = "rippleColor")
69
107
  override fun setRippleColor(view: ButtonViewGroup, rippleColor: Int?) {
70
108
  view.rippleColor = rippleColor
@@ -115,6 +153,42 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
115
153
  set(radius) = withBackgroundUpdate {
116
154
  field = radius * resources.displayMetrics.density
117
155
  }
156
+ var borderTopLeftRadius = 0f
157
+ set(radius) = withBackgroundUpdate {
158
+ field = radius * resources.displayMetrics.density
159
+ }
160
+ var borderTopRightRadius = 0f
161
+ set(radius) = withBackgroundUpdate {
162
+ field = radius * resources.displayMetrics.density
163
+ }
164
+ var borderBottomLeftRadius = 0f
165
+ set(radius) = withBackgroundUpdate {
166
+ field = radius * resources.displayMetrics.density
167
+ }
168
+ var borderBottomRightRadius = 0f
169
+ set(radius) = withBackgroundUpdate {
170
+ field = radius * resources.displayMetrics.density
171
+ }
172
+ var borderWidth = 0f
173
+ set(width) = withBackgroundUpdate {
174
+ field = width * resources.displayMetrics.density
175
+ }
176
+ var borderColor: Int? = null
177
+ set(color) = withBackgroundUpdate {
178
+ field = color
179
+ }
180
+ var borderStyle: String? = "solid"
181
+ set(style) = withBackgroundUpdate {
182
+ field = style
183
+ }
184
+
185
+ private val hasBorderRadii: Boolean
186
+ get() = borderRadius != 0f ||
187
+ borderTopLeftRadius != 0f ||
188
+ borderTopRightRadius != 0f ||
189
+ borderBottomLeftRadius != 0f ||
190
+ borderBottomRightRadius != 0f
191
+
118
192
  var exclusive = true
119
193
 
120
194
  private var _backgroundColor = Color.TRANSPARENT
@@ -139,6 +213,30 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
139
213
  needBackgroundUpdate = true
140
214
  }
141
215
 
216
+ private fun buildBorderRadii(): FloatArray {
217
+ // duplicate radius for each corner, as setCornerRadii expects X radius and Y radius for each
218
+ return floatArrayOf(
219
+ borderTopLeftRadius,
220
+ borderTopLeftRadius,
221
+ borderTopRightRadius,
222
+ borderTopRightRadius,
223
+ borderBottomRightRadius,
224
+ borderBottomRightRadius,
225
+ borderBottomLeftRadius,
226
+ borderBottomLeftRadius,
227
+ )
228
+ .map { if (it != 0f) it else borderRadius }
229
+ .toFloatArray()
230
+ }
231
+
232
+ private fun buildBorderStyle(): PathEffect? {
233
+ return when (borderStyle) {
234
+ "dotted" -> DashPathEffect(floatArrayOf(borderWidth, borderWidth, borderWidth, borderWidth), 0f)
235
+ "dashed" -> DashPathEffect(floatArrayOf(borderWidth * 3, borderWidth * 3, borderWidth * 3, borderWidth * 3), 0f)
236
+ else -> null
237
+ }
238
+ }
239
+
142
240
  override fun setBackgroundColor(color: Int) = withBackgroundUpdate {
143
241
  _backgroundColor = color
144
242
  }
@@ -188,14 +286,25 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
188
286
  return false
189
287
  }
190
288
 
191
- private fun updateBackgroundColor(backgroundColor: Int, borderRadius: Float, selectable: Drawable?) {
289
+ private fun updateBackgroundColor(backgroundColor: Int, selectable: Drawable?) {
192
290
  val colorDrawable = PaintDrawable(backgroundColor)
291
+ val borderDrawable = PaintDrawable(Color.TRANSPARENT)
193
292
 
194
- if (borderRadius != 0f) {
195
- colorDrawable.setCornerRadius(borderRadius)
293
+ if (hasBorderRadii) {
294
+ colorDrawable.setCornerRadii(buildBorderRadii())
295
+ borderDrawable.setCornerRadii(buildBorderRadii())
196
296
  }
197
297
 
198
- val layerDrawable = LayerDrawable(if (selectable != null) arrayOf(colorDrawable, selectable) else arrayOf(colorDrawable))
298
+ if (borderWidth > 0f) {
299
+ borderDrawable.paint.apply {
300
+ style = Paint.Style.STROKE
301
+ strokeWidth = borderWidth
302
+ color = borderColor ?: Color.BLACK
303
+ pathEffect = buildBorderStyle()
304
+ }
305
+ }
306
+
307
+ val layerDrawable = LayerDrawable(if (selectable != null) arrayOf(colorDrawable, selectable, borderDrawable) else arrayOf(colorDrawable, borderDrawable))
199
308
  background = layerDrawable
200
309
  }
201
310
 
@@ -216,30 +325,21 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
216
325
 
217
326
  val selectable = createSelectableDrawable()
218
327
 
219
- if (borderRadius != 0f) {
220
- // Radius-connected lines below ought to be considered
221
- // as a temporary solution. It do not allow to set
222
- // different radius on each corner. However, I suppose it's fairly
223
- // fine for button-related use cases.
224
- // Therefore it might be used as long as:
225
- // 1. ReactViewManager is not a generic class with a possibility to handle another ViewGroup
226
- // 2. There's no way to force native behavior of ReactViewGroup's superclass's onTouchEvent
227
- if (selectable is RippleDrawable) {
228
- val mask = PaintDrawable(Color.WHITE)
229
- mask.setCornerRadius(borderRadius)
230
- selectable.setDrawableByLayerId(android.R.id.mask, mask)
231
- }
328
+ if (hasBorderRadii && selectable is RippleDrawable) {
329
+ val mask = PaintDrawable(Color.WHITE)
330
+ mask.setCornerRadii(buildBorderRadii())
331
+ selectable.setDrawableByLayerId(android.R.id.mask, mask)
232
332
  }
233
333
 
234
334
  if (useDrawableOnForeground && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
235
335
  foreground = selectable
236
336
  if (_backgroundColor != Color.TRANSPARENT) {
237
- updateBackgroundColor(_backgroundColor, borderRadius, null)
337
+ updateBackgroundColor(_backgroundColor, null)
238
338
  }
239
339
  } else if (_backgroundColor == Color.TRANSPARENT && rippleColor == null) {
240
340
  background = selectable
241
341
  } else {
242
- updateBackgroundColor(_backgroundColor, borderRadius, selectable)
342
+ updateBackgroundColor(_backgroundColor, selectable)
243
343
  }
244
344
  }
245
345
 
@@ -6,8 +6,8 @@ import com.facebook.react.ReactRootView
6
6
 
7
7
  @Deprecated(message = "Use <GestureHandlerRootView /> component instead. Check gesture handler installation instructions in documentation for more information.")
8
8
  class RNGestureHandlerEnabledRootView : ReactRootView {
9
- constructor(context: Context?) : super(context) {}
10
- constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {}
9
+ constructor(context: Context?) : super(context)
10
+ constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
11
11
 
12
12
  init {
13
13
  throw UnsupportedOperationException("Your application is configured to use RNGestureHandlerEnabledRootView which is no longer supported. You can see how to migrate to <GestureHandlerRootView /> here: https://docs.swmansion.com/react-native-gesture-handler/docs/guides/migrating-off-rnghenabledroot")