react-native-gesture-handler 2.3.0 → 2.4.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 (175) hide show
  1. package/RNGestureHandler.podspec +2 -1
  2. package/android/build.gradle +10 -2
  3. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +14 -2
  4. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +10 -0
  5. package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +17 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +11 -3
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +3 -41
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +6 -0
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +10 -54
  10. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +2 -0
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +6 -0
  12. package/ios/RNGHTouchEventType.h +9 -0
  13. package/ios/RNGestureHandler.h +2 -2
  14. package/ios/RNGestureHandler.m +21 -8
  15. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  17. package/ios/RNGestureHandlerButton.h +1 -0
  18. package/ios/RNGestureHandlerButton.m +9 -1
  19. package/ios/RNGestureHandlerButtonComponentView.mm +14 -1
  20. package/ios/RNGestureHandlerButtonManager.m +4 -1
  21. package/ios/RNGestureHandlerEvents.h +2 -2
  22. package/ios/RNGestureHandlerEvents.m +2 -2
  23. package/ios/RNGestureHandlerManager.h +2 -0
  24. package/ios/RNGestureHandlerManager.mm +30 -20
  25. package/ios/RNGestureHandlerModule.mm +18 -0
  26. package/ios/RNGestureHandlerPointerTracker.h +2 -2
  27. package/ios/RNGestureHandlerPointerTracker.m +9 -6
  28. package/ios/RNGestureHandlerRegistry.h +1 -0
  29. package/ios/RNGestureHandlerRegistry.m +10 -0
  30. package/jest-utils/package.json +6 -0
  31. package/lib/commonjs/GestureHandlerRootView.android.js +7 -1
  32. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  33. package/lib/commonjs/GestureHandlerRootView.js +6 -0
  34. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  35. package/lib/commonjs/GestureHandlerRootView.web.js +19 -0
  36. package/lib/commonjs/GestureHandlerRootView.web.js.map +1 -0
  37. package/lib/commonjs/RNGestureHandlerModule.js +5 -0
  38. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  39. package/lib/commonjs/RNGestureHandlerModule.web.js +4 -1
  40. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  41. package/lib/commonjs/{EventType.js → TouchEventType.js} +4 -4
  42. package/lib/commonjs/TouchEventType.js.map +1 -0
  43. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  44. package/lib/commonjs/components/GestureHandlerButton.js +1 -1
  45. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  46. package/lib/commonjs/components/touchables/GenericTouchable.js +2 -0
  47. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  48. package/lib/commonjs/components/touchables/TouchableOpacity.js +3 -1
  49. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  50. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +4 -6
  51. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  52. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +4 -6
  53. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  54. package/lib/commonjs/getShadowNodeFromRef.js +12 -9
  55. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  56. package/lib/commonjs/handlers/createHandler.js +10 -14
  57. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  58. package/lib/commonjs/handlers/gestureHandlerCommon.js +18 -1
  59. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  60. package/lib/commonjs/handlers/gestures/GestureDetector.js +41 -21
  61. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  62. package/lib/commonjs/handlers/gestures/eventReceiver.js +6 -5
  63. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  64. package/lib/commonjs/handlers/gestures/gesture.js +11 -2
  65. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  66. package/lib/commonjs/index.js +0 -14
  67. package/lib/commonjs/index.js.map +1 -1
  68. package/lib/commonjs/init.js +10 -1
  69. package/lib/commonjs/init.js.map +1 -1
  70. package/lib/commonjs/jestUtils/index.js +20 -0
  71. package/lib/commonjs/jestUtils/index.js.map +1 -0
  72. package/lib/commonjs/{jestUtils.js → jestUtils/jestUtils.js} +12 -12
  73. package/lib/commonjs/jestUtils/jestUtils.js.map +1 -0
  74. package/lib/commonjs/utils.js +23 -1
  75. package/lib/commonjs/utils.js.map +1 -1
  76. package/lib/commonjs/web/GestureHandler.js +4 -1
  77. package/lib/commonjs/web/GestureHandler.js.map +1 -1
  78. package/lib/module/GestureHandlerRootView.android.js +7 -2
  79. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  80. package/lib/module/GestureHandlerRootView.js +5 -0
  81. package/lib/module/GestureHandlerRootView.js.map +1 -1
  82. package/lib/module/GestureHandlerRootView.web.js +6 -0
  83. package/lib/module/GestureHandlerRootView.web.js.map +1 -0
  84. package/lib/module/RNGestureHandlerModule.js +5 -0
  85. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  86. package/lib/module/RNGestureHandlerModule.web.js +4 -1
  87. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  88. package/lib/module/{EventType.js → TouchEventType.js} +2 -2
  89. package/lib/module/TouchEventType.js.map +1 -0
  90. package/lib/module/components/GestureButtons.js.map +1 -1
  91. package/lib/module/components/GestureHandlerButton.js +2 -2
  92. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  93. package/lib/module/components/touchables/GenericTouchable.js +2 -0
  94. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  95. package/lib/module/components/touchables/TouchableOpacity.js +4 -2
  96. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  97. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +5 -7
  98. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  99. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +5 -8
  100. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  101. package/lib/module/getShadowNodeFromRef.js +11 -8
  102. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  103. package/lib/module/handlers/createHandler.js +10 -17
  104. package/lib/module/handlers/createHandler.js.map +1 -1
  105. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  106. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  107. package/lib/module/handlers/gestures/GestureDetector.js +41 -22
  108. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  109. package/lib/module/handlers/gestures/eventReceiver.js +6 -7
  110. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  111. package/lib/module/handlers/gestures/gesture.js +10 -2
  112. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  113. package/lib/module/index.js +0 -1
  114. package/lib/module/index.js.map +1 -1
  115. package/lib/module/init.js +6 -1
  116. package/lib/module/init.js.map +1 -1
  117. package/lib/module/jestUtils/index.js +2 -0
  118. package/lib/module/jestUtils/index.js.map +1 -0
  119. package/lib/module/{jestUtils.js → jestUtils/jestUtils.js} +12 -12
  120. package/lib/module/jestUtils/jestUtils.js.map +1 -0
  121. package/lib/module/utils.js +17 -1
  122. package/lib/module/utils.js.map +1 -1
  123. package/lib/module/web/GestureHandler.js +4 -1
  124. package/lib/module/web/GestureHandler.js.map +1 -1
  125. package/lib/typescript/GestureHandlerRootView.web.d.ts +5 -0
  126. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -0
  127. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -0
  128. package/lib/typescript/{EventType.d.ts → TouchEventType.d.ts} +2 -2
  129. package/lib/typescript/components/GestureButtons.d.ts +18 -6
  130. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +5 -1
  131. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +13 -0
  132. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +5 -0
  133. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  134. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +5 -3
  135. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +0 -3
  136. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
  137. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -0
  138. package/lib/typescript/index.d.ts +0 -1
  139. package/lib/typescript/init.d.ts +1 -0
  140. package/lib/typescript/jestUtils/index.d.ts +1 -0
  141. package/lib/typescript/{jestUtils.d.ts → jestUtils/jestUtils.d.ts} +18 -18
  142. package/lib/typescript/utils.d.ts +2 -0
  143. package/lib/typescript/web/GestureHandler.d.ts +1 -1
  144. package/package.json +5 -2
  145. package/src/GestureHandlerRootView.android.tsx +8 -2
  146. package/src/GestureHandlerRootView.tsx +6 -0
  147. package/src/GestureHandlerRootView.web.tsx +12 -0
  148. package/src/RNGestureHandlerModule.ts +7 -0
  149. package/src/RNGestureHandlerModule.web.ts +2 -0
  150. package/src/{EventType.ts → TouchEventType.ts} +2 -2
  151. package/src/components/GestureButtons.tsx +21 -7
  152. package/src/components/GestureHandlerButton.tsx +2 -2
  153. package/src/components/touchables/GenericTouchable.tsx +2 -0
  154. package/src/components/touchables/TouchableOpacity.tsx +6 -2
  155. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +27 -0
  156. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +12 -0
  157. package/src/getShadowNodeFromRef.ts +12 -9
  158. package/src/handlers/createHandler.ts +7 -17
  159. package/src/handlers/gestureHandlerCommon.ts +19 -2
  160. package/src/handlers/gestures/GestureDetector.tsx +64 -31
  161. package/src/handlers/gestures/eventReceiver.ts +6 -6
  162. package/src/handlers/gestures/gesture.ts +13 -2
  163. package/src/index.ts +0 -1
  164. package/src/init.ts +8 -1
  165. package/src/jestUtils/index.ts +1 -0
  166. package/src/{jestUtils.ts → jestUtils/jestUtils.ts} +21 -21
  167. package/src/utils.ts +20 -0
  168. package/src/web/GestureHandler.ts +7 -1
  169. package/ios/RNTouchEventType.h +0 -9
  170. package/lib/commonjs/EventType.js.map +0 -1
  171. package/lib/commonjs/jestUtils.js.map +0 -1
  172. package/lib/module/EventType.js.map +0 -1
  173. package/lib/module/jestUtils.js.map +0 -1
  174. package/src/fabric/RNGestureHandlerButtonNativeComponent.js +0 -27
  175. package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +0 -19
@@ -23,7 +23,8 @@ Pod::Spec.new do |s|
23
23
  folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
24
24
 
25
25
  s.pod_target_xcconfig = {
26
- 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"'
26
+ 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"',
27
+ 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
27
28
  }
28
29
  s.platforms = { ios: '11.0', tvos: '11.0' }
29
30
  s.compiler_flags = folly_compiler_flags + ' -DRN_FABRIC_ENABLED'
@@ -38,7 +38,7 @@ def shouldUseCommonInterfaceFromReanimated() {
38
38
  def json = new JsonSlurper().parseText(inputFile.text)
39
39
  def reanimatedVersion = json.version as String
40
40
  def (major, minor, patch) = reanimatedVersion.tokenize('.')
41
- return Integer.parseInt(major) == 2 && Integer.parseInt(minor) >= 3
41
+ return (Integer.parseInt(major) == 2 && Integer.parseInt(minor) >= 3) || Integer.parseInt(major) == 3
42
42
  } else {
43
43
  return false
44
44
  }
@@ -76,6 +76,11 @@ android {
76
76
  }
77
77
  }
78
78
 
79
+ compileOptions {
80
+ sourceCompatibility JavaVersion.VERSION_1_8
81
+ targetCompatibility JavaVersion.VERSION_1_8
82
+ }
83
+
79
84
  if (isNewArchitectureEnabled()) {
80
85
  externalNativeBuild {
81
86
  ndkBuild {
@@ -101,8 +106,11 @@ android {
101
106
 
102
107
  // Include "common/" only when it's not provided by Reanimated to mitigate
103
108
  // multiple definitions of the same class preventing build
104
- if (!shouldUseCommonInterfaceFromReanimated()) {
109
+ if (shouldUseCommonInterfaceFromReanimated()) {
110
+ srcDirs += 'reanimated/src/main/java'
111
+ } else {
105
112
  srcDirs += 'common/src/main/java'
113
+ srcDirs += 'noreanimated/src/main/java'
106
114
  }
107
115
 
108
116
  if (isNewArchitectureEnabled()) {
@@ -316,7 +316,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
316
316
  isEnabled: ${handler.isEnabled}
317
317
  isActive: ${handler.isActive}
318
318
  isAwaiting: ${handler.isAwaiting}
319
- trackedPointersCount: ${handler.trackedPointersCount}
319
+ trackedPointersCount: ${handler.trackedPointersIDsCount}
320
320
  trackedPointers: ${handler.trackedPointerIDs.joinToString(separator = ", ")}
321
321
  while handling event: $event
322
322
  """.trimIndent(), e) {}
@@ -329,7 +329,19 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
329
329
  || trackedPointersIDsCount < 1) {
330
330
  return
331
331
  }
332
- val event = adaptEvent(origEvent)
332
+
333
+ // a workaround for https://github.com/software-mansion/react-native-gesture-handler/issues/1188
334
+ val event = if (BuildConfig.DEBUG) {
335
+ adaptEvent(origEvent)
336
+ } else {
337
+ try {
338
+ adaptEvent(origEvent)
339
+ } catch (e: AdaptEventException) {
340
+ fail()
341
+ return
342
+ }
343
+ }
344
+
333
345
  x = event.x
334
346
  y = event.y
335
347
  numberOfPointers = event.pointerCount
@@ -0,0 +1,10 @@
1
+ package com.swmansion.gesturehandler
2
+
3
+ import com.facebook.react.bridge.ReactContext
4
+ import com.facebook.react.uimanager.events.Event
5
+
6
+ object ReanimatedEventDispatcher {
7
+ fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
8
+ // no-op
9
+ }
10
+ }
@@ -0,0 +1,17 @@
1
+ package com.swmansion.gesturehandler
2
+
3
+ import com.facebook.react.bridge.ReactContext
4
+ import com.facebook.react.uimanager.events.Event
5
+ import com.swmansion.reanimated.ReanimatedModule
6
+
7
+ object ReanimatedEventDispatcher {
8
+ private var reanimatedModule: ReanimatedModule? = null
9
+
10
+ fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
11
+ if (reanimatedModule == null) {
12
+ reanimatedModule = reactApplicationContext.getNativeModule(ReanimatedModule::class.java)
13
+ }
14
+
15
+ reanimatedModule?.nodesManager?.onEventDispatch(event)
16
+ }
17
+ }
@@ -134,10 +134,18 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
134
134
 
135
135
  private fun applyRippleEffectWhenNeeded(selectable: Drawable): Drawable {
136
136
  val rippleColor = rippleColor
137
- if (rippleColor != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && selectable is RippleDrawable) {
137
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && selectable is RippleDrawable) {
138
138
  val states = arrayOf(intArrayOf(android.R.attr.state_enabled))
139
- val colors = intArrayOf(rippleColor)
140
- val colorStateList = ColorStateList(states, colors)
139
+ val colorStateList = if (rippleColor != null) {
140
+ val colors = intArrayOf(rippleColor)
141
+ ColorStateList(states, colors)
142
+ } else {
143
+ // if rippleColor is null, reapply the default color
144
+ context.theme.resolveAttribute(android.R.attr.colorControlHighlight, resolveOutValue, true)
145
+ val colors = intArrayOf(resolveOutValue.data)
146
+ ColorStateList(states, colors)
147
+ }
148
+
141
149
  selectable.setColor(colorStateList)
142
150
  }
143
151
 
@@ -6,52 +6,14 @@ import android.util.AttributeSet
6
6
  import android.view.MotionEvent
7
7
  import com.facebook.react.ReactInstanceManager
8
8
  import com.facebook.react.ReactRootView
9
+ import java.lang.Exception
9
10
 
10
11
  @Deprecated(message = "Use <GestureHandlerRootView /> component instead. Check gesture handler installation instructions in documentation for more information.")
11
12
  class RNGestureHandlerEnabledRootView : ReactRootView {
12
- private lateinit var _reactInstanceManager: ReactInstanceManager
13
- private var gestureRootHelper: RNGestureHandlerRootHelper? = null
14
-
15
13
  constructor(context: Context?) : super(context) {}
16
14
  constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {}
17
15
 
18
- override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
19
- gestureRootHelper?.requestDisallowInterceptTouchEvent(disallowIntercept)
20
- super.requestDisallowInterceptTouchEvent(disallowIntercept)
21
- }
22
-
23
- override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
24
- return if (gestureRootHelper?.dispatchTouchEvent(ev) == true) {
25
- true
26
- } else super.dispatchTouchEvent(ev)
27
- }
28
-
29
- /**
30
- * This method is used to enable root view to start processing touch events through the gesture
31
- * handler library logic. Unless this method is called (which happens as a result of instantiating
32
- * new gesture handler from JS) the root view component will just proxy all touch related methods
33
- * to its superclass. Thus in the "disabled" state all touch related events will fallback to
34
- * default RN behavior.
35
- */
36
- fun initialize() {
37
- check(gestureRootHelper == null) { "GestureHandler already initialized for root view $this" }
38
- gestureRootHelper = RNGestureHandlerRootHelper(
39
- _reactInstanceManager.currentReactContext!!, this)
40
- }
41
-
42
- fun tearDown() {
43
- gestureRootHelper?.let {
44
- it.tearDown()
45
- gestureRootHelper = null
46
- }
47
- }
48
-
49
- override fun startReactApplication(
50
- reactInstanceManager: ReactInstanceManager,
51
- moduleName: String,
52
- initialProperties: Bundle?,
53
- ) {
54
- super.startReactApplication(reactInstanceManager, moduleName, initialProperties)
55
- _reactInstanceManager = reactInstanceManager
16
+ init {
17
+ 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")
56
18
  }
57
19
  }
@@ -1,3 +1,9 @@
1
+ // 1. RCTEventEmitter was deprecated in favor of RCTModernEventEmitter interface
2
+ // 2. Event#init() with only viewTag was deprecated in favor of two arg c-tor
3
+ // 3. Event#receiveEvent() with 3 args was deprecated in favor of 4 args version
4
+ // ref: https://github.com/facebook/react-native/commit/2fbbdbb2ce897e8da3f471b08b93f167d566db1d
5
+ @file:Suppress("DEPRECATION")
6
+
1
7
  package com.swmansion.gesturehandler.react
2
8
 
3
9
  import androidx.core.util.Pools
@@ -14,7 +14,12 @@ import com.facebook.soloader.SoLoader
14
14
  import com.swmansion.common.GestureHandlerStateManager
15
15
  import com.swmansion.gesturehandler.*
16
16
  import java.util.*
17
+ // NativeModule.onCatalystInstanceDestroy() was deprecated in favor of NativeModule.invalidate()
18
+ // ref: https://github.com/facebook/react-native/commit/18c8417290823e67e211bde241ae9dde27b72f17
17
19
 
20
+ // UIManagerModule.resolveRootTagFromReactTag() was deprecated and will be removed in the next RN release
21
+ // ref: https://github.com/facebook/react-native/commit/acbf9e18ea666b07c1224a324602a41d0a66985e
22
+ @Suppress("DEPRECATION")
18
23
  @ReactModule(name = RNGestureHandlerModule.MODULE_NAME)
19
24
  class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
20
25
  : ReactContextBaseJavaModule(reactContext), GestureHandlerStateManager {
@@ -314,7 +319,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
314
319
 
315
320
  private val eventListener = object : OnTouchEventListener {
316
321
  override fun <T : GestureHandler<T>> onHandlerUpdate(handler: T, event: MotionEvent) {
317
- this@RNGestureHandlerModule.onHandlerUpdate(handler, event)
322
+ this@RNGestureHandlerModule.onHandlerUpdate(handler)
318
323
  }
319
324
 
320
325
  override fun <T : GestureHandler<T>> onStateChange(handler: T, newState: Int, oldState: Int) {
@@ -363,10 +368,6 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
363
368
 
364
369
  @ReactMethod
365
370
  fun attachGestureHandler(handlerTag: Int, viewTag: Int, actionType: Int) {
366
- if (!BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
367
- tryInitializeHandlerForReactRootView(viewTag)
368
- }
369
-
370
371
  // We don't have to handle view flattening in any special way since handlers are stored as
371
372
  // a map: viewTag -> [handler]. If the view with attached handlers was to be flattened
372
373
  // then that viewTag simply wouldn't be visited when traversing the view hierarchy in the
@@ -459,12 +460,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
459
460
  while (roots.isNotEmpty()) {
460
461
  val sizeBefore: Int = roots.size
461
462
  val root: RNGestureHandlerRootHelper = roots[0]
462
- val reactRootView: ViewGroup = root.rootView
463
- if (reactRootView is RNGestureHandlerEnabledRootView) {
464
- reactRootView.tearDown()
465
- } else {
466
- root.tearDown()
467
- }
463
+ root.tearDown()
468
464
  if (roots.size >= sizeBefore) {
469
465
  throw IllegalStateException("Expected root helper to get unregistered while tearing down")
470
466
  }
@@ -473,44 +469,6 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
473
469
  super.onCatalystInstanceDestroy()
474
470
  }
475
471
 
476
- private fun tryInitializeHandlerForReactRootView(ancestorViewTag: Int) {
477
- val uiManager = reactApplicationContext.UIManager
478
- val rootViewTag = uiManager.resolveRootTagFromReactTag(ancestorViewTag)
479
- if (rootViewTag < 1) {
480
- throw JSApplicationIllegalArgumentException("Could find root view for a given ancestor with tag $ancestorViewTag")
481
- }
482
- synchronized(roots) {
483
- for (root in roots) {
484
- val rootView: ViewGroup = root.rootView
485
- if (rootView is ReactRootView && rootView.rootViewTag == rootViewTag) {
486
- // we have found root helper registered for a given react root, we don't need to
487
- // initialize a new one then
488
- return
489
- }
490
- }
491
- }
492
- synchronized(enqueuedRootViewInit) {
493
- if (rootViewTag in enqueuedRootViewInit) {
494
- // root view initialization already enqueued -> we skip
495
- return
496
- }
497
- enqueuedRootViewInit.add(rootViewTag)
498
- }
499
- // root helper for a given root tag has not been found, we may wat to check if the root view is
500
- // an instance of RNGestureHandlerEnabledRootView and then initialize gesture handler with it
501
- uiManager.addUIBlock(UIBlock { nativeViewHierarchyManager ->
502
- val view = nativeViewHierarchyManager.resolveView(rootViewTag)
503
- if (view is RNGestureHandlerEnabledRootView) {
504
- view.initialize()
505
- } else {
506
- // Seems like the root view is something else than RNGestureHandlerEnabledRootView, this
507
- // is fine though as long as gestureHandlerRootHOC is used in JS
508
- // FIXME: check and warn about gestureHandlerRootHOC
509
- }
510
- synchronized(enqueuedRootViewInit) { enqueuedRootViewInit.remove(rootViewTag) }
511
- })
512
- }
513
-
514
472
  fun registerRootHelper(root: RNGestureHandlerRootHelper) {
515
473
  synchronized(roots) {
516
474
  if (root in roots) {
@@ -542,7 +500,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
542
500
  private fun <T : GestureHandler<T>> findFactoryForHandler(handler: GestureHandler<T>): HandlerFactory<T>? =
543
501
  handlerFactories.firstOrNull { it.type == handler.javaClass } as HandlerFactory<T>?
544
502
 
545
- private fun <T : GestureHandler<T>> onHandlerUpdate(handler: T, motionEvent: MotionEvent) {
503
+ private fun <T : GestureHandler<T>> onHandlerUpdate(handler: T) {
546
504
  // triggers onUpdate and onChange callbacks on the JS side
547
505
 
548
506
  if (handler.tag < 0) {
@@ -631,10 +589,8 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
631
589
  private fun <T : Event<T>>sendEventForReanimated(event: T) {
632
590
  // Delivers the event to Reanimated.
633
591
  if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
634
- // TODO: send event directly to Reanimated
635
- // This is already supported in Reanimated with Fabric but let's wait until the official release.
636
- // val reanimatedModule = reactApplicationContext.getNativeModule(ReanimatedModule::class.java)
637
- // reanimatedModule?.nodesManager?.onEventDispatch(event)
592
+ // Send event directly to Reanimated
593
+ ReanimatedEventDispatcher.sendEvent(event, reactApplicationContext)
638
594
  } else {
639
595
  // In the old architecture, Reanimated subscribes for specific direct events.
640
596
  sendEventForDirectEvent(event)
@@ -51,6 +51,8 @@ class RNGestureHandlerRootView(context: Context?) : ReactViewGroup(context) {
51
51
 
52
52
  var parent = viewGroup.parent
53
53
  while (parent != null) {
54
+ // our own deprecated root view
55
+ @Suppress("DEPRECATION")
54
56
  if (parent is RNGestureHandlerEnabledRootView || parent is RNGestureHandlerRootView) {
55
57
  return true
56
58
  }
@@ -1,3 +1,9 @@
1
+ // 1. RCTEventEmitter was deprecated in favor of RCTModernEventEmitter interface
2
+ // 2. Event#init() with only viewTag was deprecated in favor of two arg c-tor
3
+ // 3. Event#receiveEvent() with 3 args was deprecated in favor of 4 args version
4
+ // ref: https://github.com/facebook/react-native/commit/2fbbdbb2ce897e8da3f471b08b93f167d566db1d
5
+ @file:Suppress("DEPRECATION")
6
+
1
7
  package com.swmansion.gesturehandler.react
2
8
 
3
9
  import androidx.core.util.Pools
@@ -0,0 +1,9 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ typedef NS_ENUM(NSInteger, RNGHTouchEventType) {
4
+ RNGHTouchEventTypeUndetermined = 0,
5
+ RNGHTouchEventTypePointerDown,
6
+ RNGHTouchEventTypePointerMove,
7
+ RNGHTouchEventTypePointerUp,
8
+ RNGHTouchEventTypeCancelled,
9
+ };
@@ -26,7 +26,7 @@ if (value != nil) { recognizer.prop = [RCTConvert type:value]; }\
26
26
 
27
27
  @protocol RNGestureHandlerEventEmitter
28
28
 
29
- - (void)sendStateChangeEvent:(nonnull RNGestureHandlerStateChange *)event withActionType:(RNGestureHandlerActionType)actionType;
29
+ - (void)sendEvent:(nonnull RNGestureHandlerStateChange *)event withActionType:(RNGestureHandlerActionType)actionType;
30
30
 
31
31
  @end
32
32
 
@@ -74,7 +74,7 @@ if (value != nil) { recognizer.prop = [RCTConvert type:value]; }\
74
74
  - (void)sendEventsInState:(RNGestureHandlerState)state
75
75
  forViewWithTag:(nonnull NSNumber *)reactTag
76
76
  withExtraData:(nonnull RNGestureHandlerEventExtraData *)extraData;
77
- - (void)sendStateChangeEvent:(nonnull RNGestureHandlerStateChange *)event;
77
+ - (void)sendEvent:(nonnull RNGestureHandlerStateChange *)event;
78
78
  - (void)sendTouchEventInState:(RNGestureHandlerState)state
79
79
  forViewWithTag:(nonnull NSNumber *)reactTag;
80
80
 
@@ -94,13 +94,14 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
94
94
  - (void)resetConfig
95
95
  {
96
96
  self.enabled = YES;
97
+ self.manualActivation = NO;
97
98
  _shouldCancelWhenOutside = NO;
98
99
  _handlersToWaitFor = nil;
99
100
  _simultaneousHandlers = nil;
100
101
  _hitSlop = RNGHHitSlopEmpty;
101
102
  _needsPointerData = NO;
102
-
103
- self.manualActivation = NO;
103
+
104
+ _recognizer.cancelsTouchesInView = YES;
104
105
  }
105
106
 
106
107
  - (void)configure:(NSDictionary *)config
@@ -119,6 +120,11 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
119
120
  _shouldCancelWhenOutside = [RCTConvert BOOL:prop];
120
121
  }
121
122
 
123
+ prop = config[@"cancelsTouchesInView"];
124
+ if (prop != nil) {
125
+ _recognizer.cancelsTouchesInView = [RCTConvert BOOL:prop];
126
+ }
127
+
122
128
  prop = config[@"needsPointerData"];
123
129
  if (prop != nil) {
124
130
  _needsPointerData = [RCTConvert BOOL:prop];
@@ -189,6 +195,13 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
189
195
 
190
196
  - (void)handleGesture:(UIGestureRecognizer *)recognizer
191
197
  {
198
+ // it may happen that the gesture recognizer is reset after it's been unbound from the view,
199
+ // it that recognizer tried to send event, the app would crash because the target of the event
200
+ // would be nil.
201
+ if (recognizer.view.reactTag == nil) {
202
+ return;
203
+ }
204
+
192
205
  _state = [self recognizerState];
193
206
  RNGestureHandlerEventExtraData *eventData = [self eventExtraData:recognizer];
194
207
  [self sendEventsInState:self.state forViewWithTag:recognizer.view.reactTag withExtraData:eventData];
@@ -212,7 +225,7 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
212
225
  state:RNGestureHandlerStateActive
213
226
  prevState:_lastState
214
227
  extraData:extraData];
215
- [self sendStateChangeEvent:event];
228
+ [self sendEvent:event];
216
229
  _lastState = RNGestureHandlerStateActive;
217
230
  }
218
231
  id stateEvent = [[RNGestureHandlerStateChange alloc] initWithReactTag:reactTag
@@ -220,7 +233,7 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
220
233
  state:state
221
234
  prevState:_lastState
222
235
  extraData:extraData];
223
- [self sendStateChangeEvent:stateEvent];
236
+ [self sendEvent:stateEvent];
224
237
  _lastState = state;
225
238
  }
226
239
 
@@ -230,13 +243,13 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
230
243
  state:state
231
244
  extraData:extraData
232
245
  coalescingKey:self->_eventCoalescingKey];
233
- [self sendStateChangeEvent:touchEvent];
246
+ [self sendEvent:touchEvent];
234
247
  }
235
248
  }
236
249
 
237
- - (void)sendStateChangeEvent:(RNGestureHandlerStateChange *)event
250
+ - (void)sendEvent:(RNGestureHandlerStateChange *)event
238
251
  {
239
- [self.emitter sendStateChangeEvent:event withActionType:self.actionType];
252
+ [self.emitter sendEvent:event withActionType:self.actionType];
240
253
  }
241
254
 
242
255
  - (void)sendTouchEventInState:(RNGestureHandlerState)state
@@ -248,7 +261,7 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
248
261
  withNumberOfTouches:_pointerTracker.trackedPointersCount];
249
262
  id event = [[RNGestureHandlerEvent alloc] initWithReactTag:reactTag handlerTag:_tag state:state extraData:extraData coalescingKey:[_tag intValue]];
250
263
 
251
- [self.emitter sendStateChangeEvent:event withActionType:self.actionType];
264
+ [self.emitter sendEvent:event withActionType:self.actionType];
252
265
  }
253
266
 
254
267
  - (RNGestureHandlerState)recognizerState
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>RNGestureHandler-tvOS.xcscheme_^#shared#^_</key>
8
+ <dict>
9
+ <key>orderHint</key>
10
+ <integer>1</integer>
11
+ </dict>
12
+ <key>RNGestureHandler.xcscheme_^#shared#^_</key>
13
+ <dict>
14
+ <key>orderHint</key>
15
+ <integer>0</integer>
16
+ </dict>
17
+ </dict>
18
+ </dict>
19
+ </plist>
@@ -14,5 +14,6 @@
14
14
  * Insets used when hit testing inside this view.
15
15
  */
16
16
  @property (nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;
17
+ @property (nonatomic) BOOL userEnabled;
17
18
 
18
19
  @end
@@ -38,6 +38,7 @@
38
38
  self = [super init];
39
39
  if (self) {
40
40
  _hitTestEdgeInsets = UIEdgeInsetsZero;
41
+ _userEnabled = YES;
41
42
  #if !TARGET_OS_TV
42
43
  [self setExclusiveTouch:YES];
43
44
  #endif
@@ -47,6 +48,11 @@
47
48
 
48
49
  - (BOOL)shouldHandleTouch:(UIView *)view
49
50
  {
51
+ if ([view isKindOfClass:[RNGestureHandlerButton class]]) {
52
+ RNGestureHandlerButton *button = (RNGestureHandlerButton *)view;
53
+ return button.userEnabled;
54
+ }
55
+
50
56
  return [view isKindOfClass:[UIControl class]] || [view.gestureRecognizers count] > 0;
51
57
  }
52
58
 
@@ -62,7 +68,9 @@
62
68
  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
63
69
  {
64
70
  UIView *inner = [super hitTest:point withEvent:event];
65
- while (inner && ![self shouldHandleTouch:inner]) inner = inner.superview;
71
+ while (inner && ![self shouldHandleTouch:inner]) {
72
+ inner = inner.superview;
73
+ }
66
74
  return inner;
67
75
  }
68
76
 
@@ -18,14 +18,18 @@ using namespace facebook::react;
18
18
  @end
19
19
 
20
20
  @implementation RNGestureHandlerButtonComponentView
21
+ {
22
+ RNGestureHandlerButton *_buttonView;
23
+ }
21
24
 
22
25
  - (instancetype)initWithFrame:(CGRect)frame
23
26
  {
24
27
  if (self = [super initWithFrame:frame]) {
25
28
  static const auto defaultProps = std::make_shared<const RNGestureHandlerButtonProps>();
26
29
  _props = defaultProps;
30
+ _buttonView = [[RNGestureHandlerButton alloc] initWithFrame:self.bounds];
27
31
 
28
- self.contentView = [[RNGestureHandlerButton alloc] initWithFrame:self.bounds];
32
+ self.contentView = _buttonView;
29
33
  }
30
34
 
31
35
  return self;
@@ -38,6 +42,15 @@ using namespace facebook::react;
38
42
  return concreteComponentDescriptorProvider<RNGestureHandlerButtonComponentDescriptor>();
39
43
  }
40
44
 
45
+ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
46
+ {
47
+ const auto &newProps = *std::static_pointer_cast<const RNGestureHandlerButtonProps>(props);
48
+
49
+ _buttonView.userEnabled = newProps.enabled;
50
+ _buttonView.exclusiveTouch = newProps.exclusive;
51
+
52
+ [super updateProps:props oldProps:oldProps];
53
+ }
41
54
  @end
42
55
 
43
56
  Class<RCTComponentViewProtocol> RNGestureHandlerButtonCls(void)
@@ -5,7 +5,10 @@
5
5
 
6
6
  RCT_EXPORT_MODULE(RNGestureHandlerButton)
7
7
 
8
- RCT_EXPORT_VIEW_PROPERTY(enabled, BOOL)
8
+ RCT_CUSTOM_VIEW_PROPERTY(enabled, BOOL, RNGestureHandlerButton)
9
+ {
10
+ view.userEnabled = json == nil ? YES : [RCTConvert BOOL: json];
11
+ }
9
12
  #if !TARGET_OS_TV
10
13
  RCT_CUSTOM_VIEW_PROPERTY(exclusive, BOOL, RNGestureHandlerButton)
11
14
  {
@@ -4,7 +4,7 @@
4
4
  #import <UIKit/UIKit.h>
5
5
 
6
6
  #import "RNGestureHandlerState.h"
7
- #import "RNTouchEventType.h"
7
+ #import "RNGHTouchEventType.h"
8
8
 
9
9
  @interface RNGestureHandlerEventExtraData : NSObject
10
10
 
@@ -36,7 +36,7 @@
36
36
  withAnchorPoint:(CGPoint)anchorPoint
37
37
  withVelocity:(CGFloat)velocity
38
38
  withNumberOfTouches:(NSUInteger)numberOfTouches;
39
- + (RNGestureHandlerEventExtraData *)forEventType:(RNTouchEventType)eventType
39
+ + (RNGestureHandlerEventExtraData *)forEventType:(RNGHTouchEventType)eventType
40
40
  withChangedPointers:(NSArray<NSDictionary *> *)changedPointers
41
41
  withAllPointers:(NSArray<NSDictionary *> *)allPointers
42
42
  withNumberOfTouches:(NSUInteger)numberOfTouches;
@@ -103,7 +103,7 @@
103
103
  @"numberOfPointers": @(numberOfTouches)}];
104
104
  }
105
105
 
106
- + (RNGestureHandlerEventExtraData *)forEventType:(RNTouchEventType)eventType
106
+ + (RNGestureHandlerEventExtraData *)forEventType:(RNGHTouchEventType)eventType
107
107
  withChangedPointers:(NSArray<NSDictionary *> *)changedPointers
108
108
  withAllPointers:(NSArray<NSDictionary *> *)allPointers
109
109
  withNumberOfTouches:(NSUInteger)numberOfTouches
@@ -111,7 +111,7 @@
111
111
  if (changedPointers == nil || allPointers == nil) {
112
112
  changedPointers = @[];
113
113
  allPointers = @[];
114
- eventType = RNTouchEventTypeUndetermined;
114
+ eventType = RNGHTouchEventTypeUndetermined;
115
115
  }
116
116
 
117
117
  return [[RNGestureHandlerEventExtraData alloc]
@@ -24,6 +24,8 @@
24
24
 
25
25
  - (void)dropGestureHandler:(nonnull NSNumber *)handlerTag;
26
26
 
27
+ - (void)dropAllGestureHandlers;
28
+
27
29
  - (void)handleSetJSResponder:(nonnull NSNumber *)viewTag
28
30
  blockNativeResponder:(nonnull NSNumber *)blockNativeResponder;
29
31