react-native-gesture-handler 2.15.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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