react-native-gesture-handler 2.15.0 → 2.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. package/RNGestureHandler.podspec +2 -23
  2. package/android/build.gradle +1 -1
  3. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
  4. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
  5. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +11 -6
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +65 -24
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +86 -22
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +54 -29
  11. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
  12. package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +5 -1
  13. package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +5 -1
  14. package/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt +7 -3
  15. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +8 -5
  20. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +7 -4
  21. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  22. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
  23. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
  24. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/GestureHandlerEventDataBuilder.kt +3 -0
  25. package/android/src/main/jni/cpp-adapter.cpp +18 -22
  26. package/apple/Handlers/RNFlingHandler.m +5 -4
  27. package/apple/Handlers/RNForceTouchHandler.m +3 -1
  28. package/apple/Handlers/RNHoverHandler.m +2 -1
  29. package/apple/Handlers/RNLongPressHandler.m +8 -14
  30. package/apple/Handlers/RNManualHandler.m +1 -0
  31. package/apple/Handlers/RNNativeViewHandler.mm +9 -7
  32. package/apple/Handlers/RNPanHandler.m +7 -2
  33. package/apple/Handlers/RNPinchHandler.m +50 -26
  34. package/apple/Handlers/RNRotationHandler.m +43 -29
  35. package/apple/Handlers/RNTapHandler.m +6 -4
  36. package/apple/RNGestureHandler.h +9 -0
  37. package/apple/RNGestureHandler.m +41 -4
  38. package/apple/RNGestureHandlerEvents.h +18 -9
  39. package/apple/RNGestureHandlerEvents.m +29 -11
  40. package/apple/RNGestureHandlerManager.h +5 -0
  41. package/apple/RNGestureHandlerManager.mm +32 -6
  42. package/apple/RNGestureHandlerModule.h +5 -3
  43. package/apple/RNGestureHandlerModule.mm +33 -19
  44. package/apple/RNGestureHandlerPointerType.h +8 -0
  45. package/lib/commonjs/Directions.js +19 -6
  46. package/lib/commonjs/Directions.js.map +1 -1
  47. package/lib/commonjs/PointerType.js +16 -0
  48. package/lib/commonjs/PointerType.js.map +1 -0
  49. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -61
  50. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  51. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  52. package/lib/commonjs/components/GestureHandlerRootView.android.js +17 -2
  53. package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -1
  54. package/lib/commonjs/components/GestureHandlerRootView.js +15 -2
  55. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  56. package/lib/commonjs/components/GestureHandlerRootView.web.js +15 -2
  57. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -1
  58. package/lib/commonjs/components/Swipeable.js +3 -1
  59. package/lib/commonjs/components/Swipeable.js.map +1 -1
  60. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
  61. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  62. package/lib/commonjs/getShadowNodeFromRef.js +19 -2
  63. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  64. package/lib/commonjs/handlers/createHandler.js +5 -0
  65. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  66. package/lib/commonjs/handlers/customDirectEventTypes.js +14 -0
  67. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
  68. package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
  69. package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
  70. package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
  71. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  72. package/lib/commonjs/handlers/gestures/GestureDetector.js +10 -0
  73. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  74. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  75. package/lib/commonjs/index.js +11 -3
  76. package/lib/commonjs/index.js.map +1 -1
  77. package/lib/commonjs/mocks.js +2 -0
  78. package/lib/commonjs/mocks.js.map +1 -1
  79. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
  80. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  81. package/lib/commonjs/web/Gestures.js +66 -0
  82. package/lib/commonjs/web/Gestures.js.map +1 -0
  83. package/lib/commonjs/web/constants.js +3 -8
  84. package/lib/commonjs/web/constants.js.map +1 -1
  85. package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
  86. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  87. package/lib/commonjs/web/handlers/GestureHandler.js +10 -5
  88. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  89. package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
  90. package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
  91. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
  92. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  93. package/lib/commonjs/web/interfaces.js +1 -23
  94. package/lib/commonjs/web/interfaces.js.map +1 -1
  95. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  96. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +117 -118
  97. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  98. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
  99. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  100. package/lib/commonjs/web/tools/InteractionManager.js +12 -3
  101. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  102. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  103. package/lib/commonjs/web/tools/PointerEventManager.js +77 -27
  104. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  105. package/lib/commonjs/web/tools/TouchEventManager.js +29 -6
  106. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  107. package/lib/commonjs/web/tools/Vector.js +58 -0
  108. package/lib/commonjs/web/tools/Vector.js.map +1 -0
  109. package/lib/commonjs/web/utils.js +14 -0
  110. package/lib/commonjs/web/utils.js.map +1 -1
  111. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  112. package/lib/module/Directions.js +16 -4
  113. package/lib/module/Directions.js.map +1 -1
  114. package/lib/module/PointerType.js +9 -0
  115. package/lib/module/PointerType.js.map +1 -0
  116. package/lib/module/RNGestureHandlerModule.web.js +2 -39
  117. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  118. package/lib/module/components/DrawerLayout.js.map +1 -1
  119. package/lib/module/components/GestureHandlerRootView.android.js +15 -2
  120. package/lib/module/components/GestureHandlerRootView.android.js.map +1 -1
  121. package/lib/module/components/GestureHandlerRootView.js +15 -3
  122. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  123. package/lib/module/components/GestureHandlerRootView.web.js +15 -3
  124. package/lib/module/components/GestureHandlerRootView.web.js.map +1 -1
  125. package/lib/module/components/Swipeable.js +3 -1
  126. package/lib/module/components/Swipeable.js.map +1 -1
  127. package/lib/module/components/touchables/GenericTouchable.js +1 -0
  128. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  129. package/lib/module/getShadowNodeFromRef.js +19 -2
  130. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  131. package/lib/module/handlers/createHandler.js +5 -1
  132. package/lib/module/handlers/createHandler.js.map +1 -1
  133. package/lib/module/handlers/customDirectEventTypes.js +3 -0
  134. package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
  135. package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
  136. package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
  137. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  138. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  139. package/lib/module/handlers/gestures/GestureDetector.js +10 -0
  140. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  141. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  142. package/lib/module/index.js +2 -1
  143. package/lib/module/index.js.map +1 -1
  144. package/lib/module/mocks.js +2 -0
  145. package/lib/module/mocks.js.map +1 -1
  146. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
  147. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  148. package/lib/module/web/Gestures.js +39 -0
  149. package/lib/module/web/Gestures.js.map +1 -0
  150. package/lib/module/web/constants.js +1 -6
  151. package/lib/module/web/constants.js.map +1 -1
  152. package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
  153. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  154. package/lib/module/web/handlers/GestureHandler.js +7 -4
  155. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  156. package/lib/module/web/handlers/IGestureHandler.js +2 -0
  157. package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
  158. package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
  159. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  160. package/lib/module/web/interfaces.js +0 -20
  161. package/lib/module/web/interfaces.js.map +1 -1
  162. package/lib/module/web/tools/EventManager.js.map +1 -1
  163. package/lib/module/web/tools/GestureHandlerOrchestrator.js +116 -117
  164. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  165. package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
  166. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  167. package/lib/module/web/tools/InteractionManager.js +9 -3
  168. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  169. package/lib/module/web/tools/NodeManager.js.map +1 -1
  170. package/lib/module/web/tools/PointerEventManager.js +75 -27
  171. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  172. package/lib/module/web/tools/TouchEventManager.js +28 -6
  173. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  174. package/lib/module/web/tools/Vector.js +47 -0
  175. package/lib/module/web/tools/Vector.js.map +1 -0
  176. package/lib/module/web/utils.js +4 -0
  177. package/lib/module/web/utils.js.map +1 -1
  178. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  179. package/lib/typescript/Directions.d.ts +7 -0
  180. package/lib/typescript/PointerType.d.ts +6 -0
  181. package/lib/typescript/RNGestureHandlerModule.web.d.ts +4 -39
  182. package/lib/typescript/components/DrawerLayout.d.ts +1 -2
  183. package/lib/typescript/components/GestureHandlerRootView.android.d.ts +1 -1
  184. package/lib/typescript/components/GestureHandlerRootView.d.ts +1 -1
  185. package/lib/typescript/components/GestureHandlerRootView.web.d.ts +1 -1
  186. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
  187. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -1
  188. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  189. package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -0
  190. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
  191. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +13 -2
  192. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  193. package/lib/typescript/handlers/gestures/gesture.d.ts +1 -2
  194. package/lib/typescript/index.d.ts +2 -1
  195. package/lib/typescript/mocks.d.ts +1 -0
  196. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +6 -6
  197. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
  198. package/lib/typescript/web/Gestures.d.ts +36 -0
  199. package/lib/typescript/web/constants.d.ts +1 -6
  200. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
  201. package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -9
  202. package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
  203. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  204. package/lib/typescript/web/interfaces.d.ts +9 -16
  205. package/lib/typescript/web/tools/EventManager.d.ts +15 -12
  206. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
  207. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
  208. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
  209. package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
  210. package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
  211. package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
  212. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
  213. package/lib/typescript/web/tools/Vector.d.ts +15 -0
  214. package/lib/typescript/web/utils.d.ts +6 -4
  215. package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
  216. package/package.json +2 -1
  217. package/src/Directions.ts +21 -4
  218. package/src/PointerType.ts +6 -0
  219. package/src/RNGestureHandlerModule.web.ts +3 -44
  220. package/src/components/DrawerLayout.tsx +1 -1
  221. package/src/components/GestureHandlerRootView.android.tsx +13 -5
  222. package/src/components/GestureHandlerRootView.tsx +10 -5
  223. package/src/components/GestureHandlerRootView.web.tsx +10 -5
  224. package/src/components/Swipeable.tsx +2 -0
  225. package/src/components/touchables/GenericTouchable.tsx +3 -0
  226. package/src/getShadowNodeFromRef.ts +28 -6
  227. package/src/handlers/createHandler.tsx +14 -2
  228. package/src/handlers/customDirectEventTypes.ts +2 -0
  229. package/src/handlers/customDirectEventTypes.web.ts +5 -0
  230. package/src/handlers/gestureHandlerCommon.ts +30 -1
  231. package/src/handlers/gestures/GestureDetector.tsx +15 -0
  232. package/src/handlers/gestures/gesture.ts +1 -1
  233. package/src/index.ts +2 -1
  234. package/src/mocks.ts +2 -0
  235. package/src/specs/NativeRNGestureHandlerModule.ts +8 -8
  236. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
  237. package/src/web/Gestures.ts +41 -0
  238. package/src/web/constants.ts +1 -7
  239. package/src/web/handlers/FlingGestureHandler.ts +54 -24
  240. package/src/web/handlers/GestureHandler.ts +17 -12
  241. package/src/web/handlers/IGestureHandler.ts +50 -0
  242. package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
  243. package/src/web/interfaces.ts +15 -17
  244. package/src/web/tools/EventManager.ts +16 -14
  245. package/src/web/tools/GestureHandlerDelegate.ts +3 -4
  246. package/src/web/tools/GestureHandlerOrchestrator.ts +162 -147
  247. package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
  248. package/src/web/tools/InteractionManager.ts +18 -12
  249. package/src/web/tools/NodeManager.ts +4 -3
  250. package/src/web/tools/PointerEventManager.ts +189 -154
  251. package/src/web/tools/TouchEventManager.ts +128 -120
  252. package/src/web/tools/Vector.ts +60 -0
  253. package/src/web/utils.ts +16 -4
  254. package/src/web_hammer/NodeManager.ts +1 -1
@@ -208,6 +208,10 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
208
208
  }
209
209
 
210
210
  override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) {
211
+ if (!shouldActivateWithMouse(sourceEvent)) {
212
+ return
213
+ }
214
+
211
215
  val state = state
212
216
  val action = sourceEvent.actionMasked
213
217
  if (action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN) {
@@ -246,7 +250,7 @@ class PanGestureHandler(context: Context?) : GestureHandler<PanGestureHandler>()
246
250
  velocityX = velocityTracker!!.xVelocity
247
251
  velocityY = velocityTracker!!.yVelocity
248
252
  }
249
- if (action == MotionEvent.ACTION_UP) {
253
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_BUTTON_RELEASE) {
250
254
  if (state == STATE_ACTIVE) {
251
255
  end()
252
256
  } else {
@@ -105,6 +105,10 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
105
105
  }
106
106
 
107
107
  override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) {
108
+ if (!shouldActivateWithMouse(sourceEvent)) {
109
+ return
110
+ }
111
+
108
112
  val state = state
109
113
  val action = sourceEvent.actionMasked
110
114
  if (state == STATE_UNDETERMINED) {
@@ -130,14 +134,14 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
130
134
  if (shouldFail()) {
131
135
  fail()
132
136
  } else if (state == STATE_UNDETERMINED) {
133
- if (action == MotionEvent.ACTION_DOWN) {
137
+ if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_BUTTON_PRESS) {
134
138
  begin()
135
139
  }
136
140
  startTap()
137
141
  } else if (state == STATE_BEGAN) {
138
- if (action == MotionEvent.ACTION_UP) {
142
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_BUTTON_RELEASE) {
139
143
  endTap()
140
- } else if (action == MotionEvent.ACTION_DOWN) {
144
+ } else if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_BUTTON_PRESS) {
141
145
  startTap()
142
146
  }
143
147
  }
@@ -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")
@@ -10,7 +10,6 @@ import androidx.core.util.Pools
10
10
  import com.facebook.react.bridge.Arguments
11
11
  import com.facebook.react.bridge.WritableMap
12
12
  import com.facebook.react.uimanager.events.Event
13
- import com.facebook.react.uimanager.events.RCTEventEmitter
14
13
  import com.swmansion.gesturehandler.core.GestureHandler
15
14
  import com.swmansion.gesturehandler.react.eventbuilders.GestureHandlerEventDataBuilder
16
15
 
@@ -47,9 +46,7 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
47
46
 
48
47
  override fun getCoalescingKey() = coalescingKey
49
48
 
50
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
51
- rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, createEventData(dataBuilder!!))
52
- }
49
+ override fun getEventData(): WritableMap = createEventData(dataBuilder!!)
53
50
 
54
51
  companion object {
55
52
  const val EVENT_NAME = "onGestureHandlerEvent"
@@ -47,7 +47,7 @@ import com.swmansion.gesturehandler.react.eventbuilders.TapGestureHandlerEventDa
47
47
  // UIManagerModule.resolveRootTagFromReactTag() was deprecated and will be removed in the next RN release
48
48
  // ref: https://github.com/facebook/react-native/commit/acbf9e18ea666b07c1224a324602a41d0a66985e
49
49
  @Suppress("DEPRECATION")
50
- @ReactModule(name = RNGestureHandlerModule.MODULE_NAME)
50
+ @ReactModule(name = RNGestureHandlerModule.NAME)
51
51
  class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
52
52
  NativeRNGestureHandlerModuleSpec(reactContext), GestureHandlerStateManager {
53
53
  private abstract class HandlerFactory<T : GestureHandler<T>> {
@@ -71,6 +71,9 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
71
71
  if (config.hasKey(KEY_MANUAL_ACTIVATION)) {
72
72
  handler.setManualActivation(config.getBoolean(KEY_MANUAL_ACTIVATION))
73
73
  }
74
+ if (config.hasKey("mouseButton")) {
75
+ handler.setMouseButton(config.getInt("mouseButton"))
76
+ }
74
77
  }
75
78
 
76
79
  abstract fun createEventBuilder(handler: T): GestureHandlerEventDataBuilder<T>
@@ -331,7 +334,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
331
334
  private val interactionManager = RNGestureHandlerInteractionManager()
332
335
  private val roots: MutableList<RNGestureHandlerRootHelper> = ArrayList()
333
336
  private val reanimatedEventDispatcher = ReanimatedEventDispatcher()
334
- override fun getName() = MODULE_NAME
337
+ override fun getName() = NAME
335
338
 
336
339
  @Suppress("UNCHECKED_CAST")
337
340
  private fun <T : GestureHandler<T>> createGestureHandlerHelper(
@@ -476,7 +479,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
476
479
  )
477
480
  }
478
481
 
479
- override fun onCatalystInstanceDestroy() {
482
+ override fun invalidate() {
480
483
  registry.dropAllHandlers()
481
484
  interactionManager.reset()
482
485
  synchronized(roots) {
@@ -489,7 +492,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
489
492
  }
490
493
  }
491
494
  }
492
- super.onCatalystInstanceDestroy()
495
+ super.invalidate()
493
496
  }
494
497
 
495
498
  fun registerRootHelper(root: RNGestureHandlerRootHelper) {
@@ -645,7 +648,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
645
648
  }
646
649
 
647
650
  companion object {
648
- const val MODULE_NAME = "RNGestureHandlerModule"
651
+ const val NAME = "RNGestureHandlerModule"
649
652
  private const val KEY_SHOULD_CANCEL_WHEN_OUTSIDE = "shouldCancelWhenOutside"
650
653
  private const val KEY_ENABLED = "enabled"
651
654
  private const val KEY_NEEDS_POINTER_DATA = "needsPointerData"
@@ -10,6 +10,7 @@ import com.facebook.react.bridge.ReactContext
10
10
  import com.facebook.react.bridge.UiThreadUtil
11
11
  import com.facebook.react.common.ReactConstants
12
12
  import com.facebook.react.uimanager.RootView
13
+ import com.facebook.react.uimanager.ThemedReactContext
13
14
  import com.swmansion.gesturehandler.core.GestureHandler
14
15
  import com.swmansion.gesturehandler.core.GestureHandlerOrchestrator
15
16
 
@@ -24,7 +25,7 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
24
25
  UiThreadUtil.assertOnUiThread()
25
26
  val wrappedViewTag = wrappedView.id
26
27
  check(wrappedViewTag >= 1) { "Expect view tag to be set for $wrappedView" }
27
- val module = context.getNativeModule(RNGestureHandlerModule::class.java)!!
28
+ val module = (context as ThemedReactContext).reactApplicationContext.getNativeModule(RNGestureHandlerModule::class.java)!!
28
29
  val registry = module.registry
29
30
  rootView = findRootViewTag(wrappedView)
30
31
  Log.i(
@@ -49,7 +50,7 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
49
50
  ReactConstants.TAG,
50
51
  "[GESTURE HANDLER] Tearing down gesture handler registered for root view $rootView"
51
52
  )
52
- val module = context.getNativeModule(RNGestureHandlerModule::class.java)!!
53
+ val module = (context as ThemedReactContext).reactApplicationContext.getNativeModule(RNGestureHandlerModule::class.java)!!
53
54
  with(module) {
54
55
  registry.dropHandler(jsGestureHandler!!.tag)
55
56
  unregisterRootHelper(this@RNGestureHandlerRootHelper)
@@ -77,13 +78,13 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
77
78
  action = MotionEvent.ACTION_CANCEL
78
79
  }
79
80
  if (rootView is RootView) {
80
- rootView.onChildStartedNativeGesture(event)
81
+ rootView.onChildStartedNativeGesture(rootView, event)
81
82
  }
82
83
  event.recycle()
83
84
  }
84
85
  }
85
86
 
86
- fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
87
+ fun requestDisallowInterceptTouchEvent() {
87
88
  // If this method gets called it means that some native view is attempting to grab lock for
88
89
  // touch event delivery. In that case we cancel all gesture recognizers
89
90
  if (orchestrator != null && !passingTouch) {
@@ -115,6 +116,8 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
115
116
  }
116
117
 
117
118
  /*package*/
119
+ @Suppress("UNUSED_PARAMETER", "COMMENT_IN_SUPPRESSION")
120
+ // We want to keep order of parameters, so instead of removing viewTag we suppress the warning
118
121
  fun handleSetJSResponder(viewTag: Int, blockNativeResponder: Boolean) {
119
122
  if (blockNativeResponder) {
120
123
  UiThreadUtil.runOnUiThread { tryCancelAllHandlers() }
@@ -44,7 +44,7 @@ class RNGestureHandlerRootView(context: Context?) : ReactViewGroup(context) {
44
44
 
45
45
  override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
46
46
  if (_enabled) {
47
- rootHelper!!.requestDisallowInterceptTouchEvent(disallowIntercept)
47
+ rootHelper!!.requestDisallowInterceptTouchEvent()
48
48
  }
49
49
  super.requestDisallowInterceptTouchEvent(disallowIntercept)
50
50
  }
@@ -10,7 +10,6 @@ import androidx.core.util.Pools
10
10
  import com.facebook.react.bridge.Arguments
11
11
  import com.facebook.react.bridge.WritableMap
12
12
  import com.facebook.react.uimanager.events.Event
13
- import com.facebook.react.uimanager.events.RCTEventEmitter
14
13
  import com.swmansion.gesturehandler.core.GestureHandler
15
14
  import com.swmansion.gesturehandler.react.eventbuilders.GestureHandlerEventDataBuilder
16
15
 
@@ -46,9 +45,7 @@ class RNGestureHandlerStateChangeEvent private constructor() : Event<RNGestureHa
46
45
  // TODO: coalescing
47
46
  override fun getCoalescingKey(): Short = 0
48
47
 
49
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
50
- rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, createEventData(dataBuilder!!, newState, oldState))
51
- }
48
+ override fun getEventData(): WritableMap = createEventData(dataBuilder!!, newState, oldState)
52
49
 
53
50
  companion object {
54
51
  const val EVENT_NAME = "onGestureHandlerStateChange"
@@ -3,15 +3,15 @@ package com.swmansion.gesturehandler.react
3
3
  import androidx.core.util.Pools
4
4
  import com.facebook.react.bridge.Arguments
5
5
  import com.facebook.react.bridge.WritableMap
6
+ import com.facebook.react.uimanager.UIManagerHelper
6
7
  import com.facebook.react.uimanager.events.Event
7
- import com.facebook.react.uimanager.events.RCTEventEmitter
8
8
  import com.swmansion.gesturehandler.core.GestureHandler
9
9
 
10
10
  class RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerTouchEvent>() {
11
11
  private var extraData: WritableMap? = null
12
12
  private var coalescingKey: Short = 0
13
13
  private fun <T : GestureHandler<T>> init(handler: T) {
14
- super.init(handler.view!!.id)
14
+ super.init(UIManagerHelper.getSurfaceId(handler.view), handler.view!!.id)
15
15
  extraData = createEventData(handler)
16
16
  coalescingKey = handler.eventCoalescingKey
17
17
  }
@@ -26,10 +26,7 @@ class RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerT
26
26
  override fun canCoalesce() = true
27
27
 
28
28
  override fun getCoalescingKey() = coalescingKey
29
-
30
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
31
- rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData)
32
- }
29
+ override fun getEventData(): WritableMap? = extraData
33
30
 
34
31
  companion object {
35
32
  const val EVENT_UNDETERMINED = 0
@@ -47,7 +44,7 @@ class RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerT
47
44
  init(handler)
48
45
  }
49
46
 
50
- fun <T : GestureHandler<T>> createEventData(handler: T,): WritableMap = Arguments.createMap().apply {
47
+ fun <T : GestureHandler<T>> createEventData(handler: T): WritableMap = Arguments.createMap().apply {
51
48
  putInt("handlerTag", handler.tag)
52
49
  putInt("state", handler.state)
53
50
  putInt("numberOfTouches", handler.trackedPointersCount)
@@ -7,16 +7,19 @@ abstract class GestureHandlerEventDataBuilder<T : GestureHandler<T>>(handler: T)
7
7
  private val numberOfPointers: Int
8
8
  private val handlerTag: Int
9
9
  private val state: Int
10
+ private val pointerType: Int
10
11
 
11
12
  init {
12
13
  numberOfPointers = handler.numberOfPointers
13
14
  handlerTag = handler.tag
14
15
  state = handler.state
16
+ pointerType = handler.pointerType
15
17
  }
16
18
 
17
19
  open fun buildEventData(eventData: WritableMap) {
18
20
  eventData.putInt("numberOfPointers", numberOfPointers)
19
21
  eventData.putInt("handlerTag", handlerTag)
20
22
  eventData.putInt("state", state)
23
+ eventData.putInt("pointerType", pointerType)
21
24
  }
22
25
  }
@@ -7,29 +7,25 @@ using namespace facebook;
7
7
  using namespace react;
8
8
 
9
9
  void decorateRuntime(jsi::Runtime &runtime) {
10
- auto isFormsStackingContext = jsi::Function::createFromHostFunction(
11
- runtime,
12
- jsi::PropNameID::forAscii(runtime, "isFormsStackingContext"),
13
- 1,
14
- [](jsi::Runtime &runtime,
15
- const jsi::Value &thisValue,
16
- const jsi::Value *arguments,
17
- size_t count) -> jsi::Value {
18
- if (!arguments[0].isObject()) {
19
- return jsi::Value::null();
20
- }
10
+ auto isFormsStackingContext = jsi::Function::createFromHostFunction(
11
+ runtime,
12
+ jsi::PropNameID::forAscii(runtime, "isFormsStackingContext"),
13
+ 1,
14
+ [](jsi::Runtime &runtime,
15
+ const jsi::Value &thisValue,
16
+ const jsi::Value *arguments,
17
+ size_t count) -> jsi::Value {
18
+ if (!arguments[0].isObject()) {
19
+ return jsi::Value::null();
20
+ }
21
+ auto shadowNode = arguments[0]
22
+ .asObject(runtime).getNativeState<ShadowNode>(runtime);
23
+ bool isFormsStackingContext = shadowNode->getTraits().check(ShadowNodeTraits::FormsStackingContext);
21
24
 
22
- auto shadowNode = arguments[0]
23
- .asObject(runtime)
24
- .getHostObject<ShadowNodeWrapper>(runtime)
25
- ->shadowNode;
26
- bool isFormsStackingContext = shadowNode->getTraits().check(
27
- ShadowNodeTraits::FormsStackingContext);
28
-
29
- return jsi::Value(isFormsStackingContext);
30
- });
31
- runtime.global().setProperty(
32
- runtime, "isFormsStackingContext", std::move(isFormsStackingContext));
25
+ return jsi::Value(isFormsStackingContext);
26
+ });
27
+ runtime.global().setProperty(
28
+ runtime, "isFormsStackingContext", std::move(isFormsStackingContext));
33
29
  }
34
30
 
35
31
  extern "C" JNIEXPORT void JNICALL
@@ -26,6 +26,7 @@
26
26
 
27
27
  - (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
28
28
  {
29
+ [_gestureHandler setCurrentPointerType:event];
29
30
  _lastPoint = [[[touches allObjects] objectAtIndex:0] locationInView:_gestureHandler.recognizer.view];
30
31
  [_gestureHandler reset];
31
32
  [super touchesBegan:touches withEvent:event];
@@ -141,16 +142,16 @@
141
142
 
142
143
  RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
143
144
 
144
- CGPoint viewAbsolutePosition =
145
- [recognizer.view convertPoint:recognizer.view.bounds.origin
146
- toView:RCTKeyWindow().rootViewController.view];
145
+ CGPoint viewAbsolutePosition = [recognizer.view convertPoint:recognizer.view.bounds.origin
146
+ toView:RCTKeyWindow().rootViewController.view];
147
147
  CGPoint locationInView = [recognizer getLastLocation];
148
148
 
149
149
  return [RNGestureHandlerEventExtraData
150
150
  forPosition:locationInView
151
151
  withAbsolutePosition:CGPointMake(
152
152
  viewAbsolutePosition.x + locationInView.x, viewAbsolutePosition.y + locationInView.y)
153
- withNumberOfTouches:recognizer.numberOfTouches];
153
+ withNumberOfTouches:recognizer.numberOfTouches
154
+ withPointerType:_pointerType];
154
155
  }
155
156
  @end
156
157
 
@@ -40,6 +40,7 @@ static const BOOL defaultFeedbackOnActivation = NO;
40
40
 
41
41
  - (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
42
42
  {
43
+ [_gestureHandler setCurrentPointerType:event];
43
44
  if (_firstTouch) {
44
45
  // ignore rest of fingers
45
46
  return;
@@ -171,7 +172,8 @@ static const BOOL defaultFeedbackOnActivation = NO;
171
172
  return [RNGestureHandlerEventExtraData forForce:recognizer.force
172
173
  forPosition:[recognizer locationInView:recognizer.view]
173
174
  withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
174
- withNumberOfTouches:recognizer.numberOfTouches];
175
+ withNumberOfTouches:recognizer.numberOfTouches
176
+ withPointerType:_pointerType];
175
177
  }
176
178
 
177
179
  @end
@@ -155,7 +155,8 @@ API_AVAILABLE(ios(13.4))
155
155
  - (RNGestureHandlerEventExtraData *)eventExtraData:(UIGestureRecognizer *)recognizer
156
156
  {
157
157
  return [RNGestureHandlerEventExtraData forPosition:[recognizer locationInView:recognizer.view]
158
- withAbsolutePosition:[recognizer locationInView:recognizer.view.window]];
158
+ withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
159
+ withPointerType:UITouchTypePencil];
159
160
  }
160
161
 
161
162
  @end