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

Sign up to get free protection for your applications and to get access to all the features.
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")