react-native-gesture-handler 2.13.3 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. package/RNGestureHandler.podspec +19 -25
  2. package/android/build.gradle +3 -2
  3. package/android/gradle.properties +2 -2
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +36 -72
  5. package/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt +1 -1
  6. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +13 -9
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +12 -14
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +8 -1
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +34 -88
  10. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +18 -12
  12. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/FlingGestureHandlerEventDataBuilder.kt +30 -0
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/GestureHandlerEventDataBuilder.kt +22 -0
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +30 -0
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/LongPressGestureHandlerEventDataBuilder.kt +33 -0
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/ManualGestureHandlerEventDataBuilder.kt +5 -0
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/NativeGestureHandlerEventDataBuilder.kt +18 -0
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +42 -0
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PinchGestureHandlerEventDataBuilder.kt +30 -0
  20. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/RotationGestureHandlerEventDataBuilder.kt +30 -0
  21. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/TapGestureHandlerEventDataBuilder.kt +30 -0
  22. package/android/src/main/jni/CMakeLists.txt +14 -2
  23. package/ios/Handlers/RNHoverHandler.m +15 -14
  24. package/ios/RNGestureHandler.m +11 -0
  25. package/ios/RNGestureHandlerButtonComponentView.mm +2 -0
  26. package/lib/commonjs/components/touchables/TouchableNativeFeedback.android.js +1 -1
  27. package/lib/commonjs/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  28. package/lib/commonjs/getReactNativeVersion.js +22 -0
  29. package/lib/commonjs/getReactNativeVersion.js.map +1 -0
  30. package/lib/commonjs/getReactNativeVersion.web.js +11 -0
  31. package/lib/commonjs/getReactNativeVersion.web.js.map +1 -0
  32. package/lib/commonjs/handlers/gestureHandlerCommon.js +1 -1
  33. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  34. package/lib/commonjs/handlers/gestures/GestureDetector.js +13 -3
  35. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  36. package/lib/commonjs/handlers/gestures/gesture.js +8 -0
  37. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  38. package/lib/commonjs/utils.js +0 -13
  39. package/lib/commonjs/utils.js.map +1 -1
  40. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  41. package/lib/commonjs/web/interfaces.js.map +1 -1
  42. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +4 -15
  43. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  44. package/lib/commonjs/web/tools/InteractionManager.js +27 -29
  45. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  46. package/lib/commonjs/web/tools/PointerEventManager.js +11 -3
  47. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  48. package/lib/module/components/touchables/TouchableNativeFeedback.android.js +1 -1
  49. package/lib/module/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  50. package/lib/module/getReactNativeVersion.js +10 -0
  51. package/lib/module/getReactNativeVersion.js.map +1 -0
  52. package/lib/module/getReactNativeVersion.web.js +4 -0
  53. package/lib/module/getReactNativeVersion.web.js.map +1 -0
  54. package/lib/module/handlers/gestureHandlerCommon.js +1 -1
  55. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  56. package/lib/module/handlers/gestures/GestureDetector.js +12 -3
  57. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  58. package/lib/module/handlers/gestures/gesture.js +8 -0
  59. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  60. package/lib/module/utils.js +0 -6
  61. package/lib/module/utils.js.map +1 -1
  62. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  63. package/lib/module/web/interfaces.js.map +1 -1
  64. package/lib/module/web/tools/GestureHandlerOrchestrator.js +4 -15
  65. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  66. package/lib/module/web/tools/InteractionManager.js +27 -29
  67. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  68. package/lib/module/web/tools/PointerEventManager.js +11 -3
  69. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  70. package/lib/typescript/ActionType.d.ts +1 -1
  71. package/lib/typescript/Directions.d.ts +1 -1
  72. package/lib/typescript/PlatformConstants.d.ts +1 -1
  73. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
  74. package/lib/typescript/State.d.ts +1 -1
  75. package/lib/typescript/TouchEventType.d.ts +1 -1
  76. package/lib/typescript/components/DrawerLayout.d.ts +9 -9
  77. package/lib/typescript/components/GestureButtons.d.ts +3 -3
  78. package/lib/typescript/components/GestureComponents.d.ts +6 -6
  79. package/lib/typescript/components/GestureComponents.web.d.ts +1 -1
  80. package/lib/typescript/components/GestureHandlerRootView.android.d.ts +2 -1
  81. package/lib/typescript/components/GestureHandlerRootView.d.ts +2 -1
  82. package/lib/typescript/components/GestureHandlerRootView.web.d.ts +2 -1
  83. package/lib/typescript/components/Swipeable.d.ts +4 -4
  84. package/lib/typescript/components/touchables/GenericTouchable.d.ts +4 -3
  85. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +4 -3
  86. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +7 -6
  87. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +3 -2
  88. package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +1 -1
  89. package/lib/typescript/getReactNativeVersion.d.ts +4 -0
  90. package/lib/typescript/getReactNativeVersion.web.d.ts +1 -0
  91. package/lib/typescript/handlers/FlingGestureHandler.d.ts +2 -2
  92. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
  93. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +2 -2
  94. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +3 -3
  95. package/lib/typescript/handlers/PanGestureHandler.d.ts +2 -2
  96. package/lib/typescript/handlers/PinchGestureHandler.d.ts +2 -2
  97. package/lib/typescript/handlers/RotationGestureHandler.d.ts +2 -2
  98. package/lib/typescript/handlers/TapGestureHandler.d.ts +2 -2
  99. package/lib/typescript/handlers/createHandler.d.ts +1 -1
  100. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +11 -10
  101. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +32 -32
  102. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -2
  103. package/lib/typescript/handlers/gestures/flingGesture.d.ts +1 -1
  104. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +2 -2
  105. package/lib/typescript/handlers/gestures/gesture.d.ts +7 -5
  106. package/lib/typescript/handlers/gestures/gestureComposition.d.ts +4 -4
  107. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +3 -3
  108. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +1 -1
  109. package/lib/typescript/handlers/gestures/manualGesture.d.ts +1 -1
  110. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +1 -1
  111. package/lib/typescript/handlers/gestures/panGesture.d.ts +2 -2
  112. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +2 -2
  113. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +2 -2
  114. package/lib/typescript/handlers/gestures/tapGesture.d.ts +1 -1
  115. package/lib/typescript/jestUtils/jestUtils.d.ts +6 -6
  116. package/lib/typescript/typeUtils.d.ts +1 -1
  117. package/lib/typescript/utils.d.ts +1 -5
  118. package/lib/typescript/web/interfaces.d.ts +4 -3
  119. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +0 -1
  120. package/lib/typescript/web/tools/InteractionManager.d.ts +2 -1
  121. package/lib/typescript/web_hammer/GestureHandler.d.ts +2 -2
  122. package/package.json +7 -7
  123. package/src/components/touchables/TouchableNativeFeedback.android.tsx +2 -1
  124. package/src/getReactNativeVersion.ts +11 -0
  125. package/src/getReactNativeVersion.web.ts +3 -0
  126. package/src/handlers/gestureHandlerCommon.ts +6 -1
  127. package/src/handlers/gestures/GestureDetector.tsx +9 -6
  128. package/src/handlers/gestures/gesture.ts +9 -1
  129. package/src/utils.ts +0 -8
  130. package/src/web/handlers/GestureHandler.ts +1 -1
  131. package/src/web/interfaces.ts +1 -0
  132. package/src/web/tools/GestureHandlerOrchestrator.ts +4 -13
  133. package/src/web/tools/InteractionManager.ts +37 -30
  134. package/src/web/tools/PointerEventManager.ts +12 -3
  135. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +0 -8
  136. /package/android/{src/fabric → fabric/src/main}/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +0 -0
  137. /package/android/{src/fabric → fabric/src/main}/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +0 -0
  138. /package/android/{src/paper → paper/src/main}/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +0 -0
  139. /package/android/{src/paper → paper/src/main}/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +0 -0
  140. /package/android/{src/paper → paper/src/main}/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +0 -0
  141. /package/android/{src/paper → paper/src/main}/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +0 -0
  142. /package/android/{src/paper → paper/src/main}/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +0 -0
@@ -3,30 +3,6 @@ require "json"
3
3
  new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
4
4
  apple_platform = new_arch_enabled ? '11.0' : '9.0'
5
5
 
6
- # Utility function to install dependencies if React Native's
7
- # install_modules_dependencies is not defined
8
- def install_dependencies(s, new_arch_enabled)
9
- if new_arch_enabled
10
- folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
11
-
12
- s.pod_target_xcconfig = {
13
- 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"',
14
- 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
15
- }
16
- s.compiler_flags = folly_compiler_flags + ' -DRCT_NEW_ARCH_ENABLED'
17
-
18
- s.dependency "React"
19
- s.dependency "React-RCTFabric" # This is for fabric component
20
- s.dependency "React-Codegen"
21
- s.dependency "RCT-Folly"
22
- s.dependency "RCTRequired"
23
- s.dependency "RCTTypeSafety"
24
- s.dependency "ReactCommon/turbomodule/core"
25
- else
26
- s.dependency "React-Core"
27
- end
28
- end
29
-
30
6
  Pod::Spec.new do |s|
31
7
  # NPM package specification
32
8
  package = JSON.parse(File.read(File.join(File.dirname(__FILE__), "package.json")))
@@ -45,6 +21,24 @@ Pod::Spec.new do |s|
45
21
  if defined?(install_modules_dependencies()) != nil
46
22
  install_modules_dependencies(s);
47
23
  else
48
- install_dependencies(s, new_arch_enabled)
24
+ if new_arch_enabled
25
+ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
26
+
27
+ s.pod_target_xcconfig = {
28
+ 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"',
29
+ 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
30
+ }
31
+ s.compiler_flags = folly_compiler_flags + ' -DRCT_NEW_ARCH_ENABLED'
32
+
33
+ s.dependency "React"
34
+ s.dependency "React-RCTFabric" # This is for fabric component
35
+ s.dependency "React-Codegen"
36
+ s.dependency "RCT-Folly"
37
+ s.dependency "RCTRequired"
38
+ s.dependency "RCTTypeSafety"
39
+ s.dependency "ReactCommon/turbomodule/core"
40
+ else
41
+ s.dependency "React-Core"
42
+ end
49
43
  end
50
44
  end
@@ -139,6 +139,7 @@ android {
139
139
  cppFlags "-O2", "-frtti", "-fexceptions", "-Wall", "-Werror", "-std=c++17", "-DANDROID"
140
140
  arguments "-DAPP_BUILD_DIR=${appProject.buildDir}",
141
141
  "-DREACT_NATIVE_DIR=${REACT_NATIVE_DIR}",
142
+ "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
142
143
  "-DANDROID_STL=c++_shared"
143
144
  abiFilters (*reactNativeArchitectures())
144
145
  }
@@ -179,11 +180,11 @@ android {
179
180
  }
180
181
 
181
182
  if (isNewArchitectureEnabled()) {
182
- srcDirs += 'src/fabric/java'
183
+ srcDirs += 'fabric/src/main/java'
183
184
  } else {
184
185
  // this folder also includes files from codegen so the library can compile with
185
186
  // codegen turned off
186
- srcDirs += 'src/paper/java'
187
+ srcDirs += 'paper/src/main/java'
187
188
  }
188
189
  }
189
190
  }
@@ -9,8 +9,8 @@
9
9
 
10
10
  # Specifies the JVM arguments used for the daemon process.
11
11
  # The setting is particularly useful for tweaking memory settings.
12
- # Default value: -Xmx10248m -XX:MaxPermSize=256m
13
- org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
12
+ # Default value: -Xmx10248m -XX:MaxMetaspaceSize=256m
13
+ org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14
14
 
15
15
  # When configured, Gradle will run in incubating parallel mode.
16
16
  # This option should only be used with decoupled projects. More details, visit
@@ -19,13 +19,9 @@ class GestureHandlerOrchestrator(
19
19
  * traversing view hierarchy and looking for gesture handlers.
20
20
  */
21
21
  var minimumAlphaForTraversal = DEFAULT_MIN_ALPHA_FOR_TRAVERSAL
22
-
23
- private val gestureHandlers = arrayOfNulls<GestureHandler<*>?>(SIMULTANEOUS_GESTURE_HANDLER_LIMIT)
24
- private val awaitingHandlers = arrayOfNulls<GestureHandler<*>?>(SIMULTANEOUS_GESTURE_HANDLER_LIMIT)
25
- private val preparedHandlers = arrayOfNulls<GestureHandler<*>?>(SIMULTANEOUS_GESTURE_HANDLER_LIMIT)
26
- private val handlersToCancel = arrayOfNulls<GestureHandler<*>?>(SIMULTANEOUS_GESTURE_HANDLER_LIMIT)
27
- private var gestureHandlersCount = 0
28
- private var awaitingHandlersCount = 0
22
+ private val gestureHandlers = arrayListOf<GestureHandler<*>>()
23
+ private val awaitingHandlers = arrayListOf<GestureHandler<*>>()
24
+ private val preparedHandlers = arrayListOf<GestureHandler<*>>()
29
25
  private var isHandlingTouch = false
30
26
  private var handlingChangeSemaphore = 0
31
27
  private var finishedHandlersCleanupScheduled = false
@@ -60,23 +56,9 @@ class GestureHandlerOrchestrator(
60
56
  }
61
57
  }
62
58
 
63
- private inline fun compactHandlersIf(handlers: Array<GestureHandler<*>?>, count: Int, predicate: (handler: GestureHandler<*>?) -> Boolean): Int {
64
- var out = 0
65
- for (i in 0 until count) {
66
- if (predicate(handlers[i])) {
67
- handlers[out++] = handlers[i]
68
- }
69
- }
70
- return out
71
- }
72
-
73
59
  private fun cleanupFinishedHandlers() {
74
- var shouldCleanEmptyCells = false
75
- for (i in gestureHandlersCount - 1 downTo 0) {
76
- val handler = gestureHandlers[i]!!
60
+ for (handler in gestureHandlers.asReversed()) {
77
61
  if (isFinished(handler.state) && !handler.isAwaiting) {
78
- gestureHandlers[i] = null
79
- shouldCleanEmptyCells = true
80
62
  handler.reset()
81
63
  handler.apply {
82
64
  isActive = false
@@ -85,17 +67,14 @@ class GestureHandlerOrchestrator(
85
67
  }
86
68
  }
87
69
  }
88
- if (shouldCleanEmptyCells) {
89
- gestureHandlersCount = compactHandlersIf(gestureHandlers, gestureHandlersCount) { handler ->
90
- handler != null
91
- }
92
- }
70
+
71
+ gestureHandlers.removeAll { isFinished(it.state) && !it.isAwaiting }
72
+
93
73
  finishedHandlersCleanupScheduled = false
94
74
  }
95
75
 
96
76
  private fun hasOtherHandlerToWaitFor(handler: GestureHandler<*>): Boolean {
97
- for (i in 0 until gestureHandlersCount) {
98
- val otherHandler = gestureHandlers[i]!!
77
+ for (otherHandler in gestureHandlers) {
99
78
  if (!isFinished(otherHandler.state) && shouldHandlerWaitForOther(handler, otherHandler)) {
100
79
  return true
101
80
  }
@@ -115,9 +94,7 @@ class GestureHandlerOrchestrator(
115
94
  }
116
95
 
117
96
  private fun cleanupAwaitingHandlers() {
118
- awaitingHandlersCount = compactHandlersIf(awaitingHandlers, awaitingHandlersCount) { handler ->
119
- handler!!.isAwaiting
120
- }
97
+ awaitingHandlers.removeAll { !it.isAwaiting }
121
98
  }
122
99
 
123
100
  /*package*/
@@ -125,9 +102,8 @@ class GestureHandlerOrchestrator(
125
102
  handlingChangeSemaphore += 1
126
103
  if (isFinished(newState)) {
127
104
  // if there were handlers awaiting completion of this handler, we can trigger active state
128
- for (i in 0 until awaitingHandlersCount) {
129
- val otherHandler = awaitingHandlers[i]
130
- if (shouldHandlerWaitForOther(otherHandler!!, handler)) {
105
+ for (otherHandler in awaitingHandlers) {
106
+ if (shouldHandlerWaitForOther(otherHandler, handler)) {
131
107
  if (newState == GestureHandler.STATE_END) {
132
108
  // gesture has ended, we need to kill the awaiting handler
133
109
  otherHandler.cancel()
@@ -182,21 +158,15 @@ class GestureHandlerOrchestrator(
182
158
  shouldResetProgress = true
183
159
  activationIndex = this@GestureHandlerOrchestrator.activationIndex++
184
160
  }
185
- var toCancelCount = 0
186
- // Cancel all handlers that are required to be cancel upon current handler's activation
187
- for (i in 0 until gestureHandlersCount) {
188
- val otherHandler = gestureHandlers[i]!!
161
+
162
+ for (otherHandler in gestureHandlers.asReversed()) {
189
163
  if (shouldHandlerBeCancelledBy(otherHandler, handler)) {
190
- handlersToCancel[toCancelCount++] = otherHandler
164
+ otherHandler.cancel()
191
165
  }
192
166
  }
193
- for (i in toCancelCount - 1 downTo 0) {
194
- handlersToCancel[i]!!.cancel()
195
- }
196
167
 
197
168
  // Clear all awaiting handlers waiting for the current handler to fail
198
- for (i in awaitingHandlersCount - 1 downTo 0) {
199
- val otherHandler = awaitingHandlers[i]!!
169
+ for (otherHandler in awaitingHandlers.reversed()) {
200
170
  if (shouldHandlerBeCancelledBy(otherHandler, handler)) {
201
171
  otherHandler.cancel()
202
172
  otherHandler.isAwaiting = false
@@ -218,32 +188,31 @@ class GestureHandlerOrchestrator(
218
188
  private fun deliverEventToGestureHandlers(event: MotionEvent) {
219
189
  // Copy handlers to "prepared handlers" array, because the list of active handlers can change
220
190
  // as a result of state updates
221
- val handlersCount = gestureHandlersCount
191
+ preparedHandlers.clear()
192
+ preparedHandlers.addAll(gestureHandlers)
222
193
 
223
- gestureHandlers.copyInto(preparedHandlers, 0, 0, handlersCount)
224
194
  // We want to deliver events to active handlers first in order of their activation (handlers
225
195
  // that activated first will first get event delivered). Otherwise we deliver events in the
226
196
  // order in which handlers has been added ("most direct" children goes first). Therefore we rely
227
197
  // on Arrays.sort providing a stable sort (as children are registered in order in which they
228
198
  // should be tested)
229
- preparedHandlers.sortWith(handlersComparator, 0, handlersCount)
230
- for (i in 0 until handlersCount) {
231
- deliverEventToGestureHandler(preparedHandlers[i]!!, event)
199
+ preparedHandlers.sortWith(handlersComparator)
200
+ for (handler in preparedHandlers) {
201
+ deliverEventToGestureHandler(handler, event)
232
202
  }
233
203
  }
234
204
 
235
205
  private fun cancelAll() {
236
- for (i in awaitingHandlersCount - 1 downTo 0) {
237
- awaitingHandlers[i]!!.cancel()
206
+ for (handler in awaitingHandlers.reversed()) {
207
+ handler.cancel()
238
208
  }
239
209
  // Copy handlers to "prepared handlers" array, because the list of active handlers can change
240
210
  // as a result of state updates
241
- val handlersCount = gestureHandlersCount
242
- for (i in 0 until handlersCount) {
243
- preparedHandlers[i] = gestureHandlers[i]
244
- }
245
- for (i in handlersCount - 1 downTo 0) {
246
- preparedHandlers[i]!!.cancel()
211
+ preparedHandlers.clear()
212
+ preparedHandlers.addAll(gestureHandlers)
213
+
214
+ for (handler in gestureHandlers.reversed()) {
215
+ handler.cancel()
247
216
  }
248
217
  }
249
218
 
@@ -325,7 +294,7 @@ class GestureHandlerOrchestrator(
325
294
  return parent === wrapperView
326
295
  }
327
296
 
328
- fun isAnyHandlerActive() = gestureHandlers.any { it?.state == GestureHandler.STATE_ACTIVE }
297
+ fun isAnyHandlerActive() = gestureHandlers.any { it.state == GestureHandler.STATE_ACTIVE }
329
298
 
330
299
  /**
331
300
  * Transforms an event in the coordinates of wrapperView into the coordinate space of the received view.
@@ -399,13 +368,11 @@ class GestureHandlerOrchestrator(
399
368
  }
400
369
 
401
370
  private fun addAwaitingHandler(handler: GestureHandler<*>) {
402
- for (i in 0 until awaitingHandlersCount) {
403
- if (awaitingHandlers[i] === handler) {
404
- return
405
- }
371
+ if (awaitingHandlers.contains(handler)) {
372
+ return
406
373
  }
407
- check(awaitingHandlersCount < awaitingHandlers.size) { "Too many recognizers" }
408
- awaitingHandlers[awaitingHandlersCount++] = handler
374
+
375
+ awaitingHandlers.add(handler)
409
376
  with(handler) {
410
377
  isAwaiting = true
411
378
  activationIndex = this@GestureHandlerOrchestrator.activationIndex++
@@ -413,13 +380,11 @@ class GestureHandlerOrchestrator(
413
380
  }
414
381
 
415
382
  private fun recordHandlerIfNotPresent(handler: GestureHandler<*>, view: View) {
416
- for (i in 0 until gestureHandlersCount) {
417
- if (gestureHandlers[i] === handler) {
418
- return
419
- }
383
+ if (gestureHandlers.contains(handler)) {
384
+ return
420
385
  }
421
- check(gestureHandlersCount < gestureHandlers.size) { "Too many recognizers" }
422
- gestureHandlers[gestureHandlersCount++] = handler
386
+
387
+ gestureHandlers.add(handler)
423
388
  handler.isActive = false
424
389
  handler.isAwaiting = false
425
390
  handler.activationIndex = Int.MAX_VALUE
@@ -608,7 +573,6 @@ class GestureHandlerOrchestrator(
608
573
  companion object {
609
574
  // The limit doesn't necessarily need to exists, it was just simpler to implement it that way
610
575
  // it is also more allocation-wise efficient to have a fixed limit
611
- private const val SIMULTANEOUS_GESTURE_HANDLER_LIMIT = 20
612
576
 
613
577
  // Be default fully transparent views can receive touch
614
578
  private const val DEFAULT_MIN_ALPHA_FOR_TRAVERSAL = 0f
@@ -13,4 +13,4 @@ val ReactContext.UIManager: UIManagerModule
13
13
  get() = this.getNativeModule(UIManagerModule::class.java)!!
14
14
 
15
15
  fun Context.isScreenReaderOn() =
16
- (getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager).isEnabled
16
+ (getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager).isTouchExplorationEnabled
@@ -188,6 +188,17 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
188
188
  return false
189
189
  }
190
190
 
191
+ private fun updateBackgroundColor(backgroundColor: Int, borderRadius: Float, selectable: Drawable?) {
192
+ val colorDrawable = PaintDrawable(backgroundColor)
193
+
194
+ if (borderRadius != 0f) {
195
+ colorDrawable.setCornerRadius(borderRadius)
196
+ }
197
+
198
+ val layerDrawable = LayerDrawable(if (selectable != null) arrayOf(colorDrawable, selectable) else arrayOf(colorDrawable))
199
+ background = layerDrawable
200
+ }
201
+
191
202
  fun updateBackground() {
192
203
  if (!needBackgroundUpdate) {
193
204
  return
@@ -223,19 +234,12 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
223
234
  if (useDrawableOnForeground && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
224
235
  foreground = selectable
225
236
  if (_backgroundColor != Color.TRANSPARENT) {
226
- setBackgroundColor(_backgroundColor)
237
+ updateBackgroundColor(_backgroundColor, borderRadius, null)
227
238
  }
228
239
  } else if (_backgroundColor == Color.TRANSPARENT && rippleColor == null) {
229
240
  background = selectable
230
241
  } else {
231
- val colorDrawable = PaintDrawable(_backgroundColor)
232
-
233
- if (borderRadius != 0f) {
234
- colorDrawable.setCornerRadius(borderRadius)
235
- }
236
-
237
- val layerDrawable = LayerDrawable(if (selectable != null) arrayOf(colorDrawable, selectable) else arrayOf(colorDrawable))
238
- background = layerDrawable
242
+ updateBackgroundColor(_backgroundColor, borderRadius, selectable)
239
243
  }
240
244
  }
241
245
 
@@ -12,9 +12,10 @@ import com.facebook.react.bridge.WritableMap
12
12
  import com.facebook.react.uimanager.events.Event
13
13
  import com.facebook.react.uimanager.events.RCTEventEmitter
14
14
  import com.swmansion.gesturehandler.core.GestureHandler
15
+ import com.swmansion.gesturehandler.react.eventbuilders.GestureHandlerEventDataBuilder
15
16
 
16
17
  class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>() {
17
- private var extraData: WritableMap? = null
18
+ private var dataBuilder: GestureHandlerEventDataBuilder<*>? = null
18
19
  private var coalescingKey: Short = 0
19
20
 
20
21
  // On the new architecture, native animated expects event names prefixed with `top` instead of `on`,
@@ -26,17 +27,17 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
26
27
 
27
28
  private fun <T : GestureHandler<T>> init(
28
29
  handler: T,
29
- dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
30
+ dataBuilder: GestureHandlerEventDataBuilder<T>,
30
31
  useNativeAnimatedName: Boolean
31
32
  ) {
32
33
  super.init(handler.view!!.id)
33
- extraData = createEventData(handler, dataExtractor)
34
- coalescingKey = handler.eventCoalescingKey
34
+ this.dataBuilder = dataBuilder
35
35
  this.useTopPrefixedName = useNativeAnimatedName
36
+ coalescingKey = handler.eventCoalescingKey
36
37
  }
37
38
 
38
39
  override fun onDispose() {
39
- extraData = null
40
+ dataBuilder = null
40
41
  EVENTS_POOL.release(this)
41
42
  }
42
43
 
@@ -47,7 +48,7 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
47
48
  override fun getCoalescingKey() = coalescingKey
48
49
 
49
50
  override fun dispatch(rctEventEmitter: RCTEventEmitter) {
50
- rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, extraData)
51
+ rctEventEmitter.receiveEvent(viewTag, EVENT_NAME, createEventData(dataBuilder!!))
51
52
  }
52
53
 
53
54
  companion object {
@@ -58,20 +59,17 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
58
59
 
59
60
  fun <T : GestureHandler<T>> obtain(
60
61
  handler: T,
61
- dataExtractor: RNGestureHandlerEventDataExtractor<T>?,
62
+ dataBuilder: GestureHandlerEventDataBuilder<T>,
62
63
  useTopPrefixedName: Boolean = false
63
64
  ): RNGestureHandlerEvent =
64
65
  (EVENTS_POOL.acquire() ?: RNGestureHandlerEvent()).apply {
65
- init(handler, dataExtractor, useTopPrefixedName)
66
+ init(handler, dataBuilder, useTopPrefixedName)
66
67
  }
67
68
 
68
- fun <T : GestureHandler<T>> createEventData(
69
- handler: T,
70
- dataExtractor: RNGestureHandlerEventDataExtractor<T>?
69
+ fun createEventData(
70
+ dataBuilder: GestureHandlerEventDataBuilder<*>
71
71
  ): WritableMap = Arguments.createMap().apply {
72
- dataExtractor?.extractEventData(handler, this)
73
- putInt("handlerTag", handler.tag)
74
- putInt("state", handler.state)
72
+ dataBuilder.buildEventData(this)
75
73
  }
76
74
  }
77
75
  }
@@ -9,6 +9,8 @@ import com.swmansion.gesturehandler.core.NativeViewGestureHandler
9
9
  class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
10
10
  private val waitForRelations = SparseArray<IntArray>()
11
11
  private val simultaneousRelations = SparseArray<IntArray>()
12
+ private val blockingRelations = SparseArray<IntArray>()
13
+
12
14
  fun dropRelationsForHandlerWithTag(handlerTag: Int) {
13
15
  waitForRelations.remove(handlerTag)
14
16
  simultaneousRelations.remove(handlerTag)
@@ -33,6 +35,10 @@ class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
33
35
  val tags = convertHandlerTagsArray(config, KEY_SIMULTANEOUS_HANDLERS)
34
36
  simultaneousRelations.put(handler.tag, tags)
35
37
  }
38
+ if (config.hasKey(KEY_BLOCKS_HANDLERS)) {
39
+ val tags = convertHandlerTagsArray(config, KEY_BLOCKS_HANDLERS)
40
+ blockingRelations.put(handler.tag, tags)
41
+ }
36
42
  }
37
43
 
38
44
  override fun shouldWaitForHandlerFailure(handler: GestureHandler<*>, otherHandler: GestureHandler<*>) =
@@ -41,7 +47,7 @@ class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
41
47
  override fun shouldRequireHandlerToWaitForFailure(
42
48
  handler: GestureHandler<*>,
43
49
  otherHandler: GestureHandler<*>,
44
- ) = false
50
+ ) = blockingRelations[handler.tag]?.any { tag -> tag == otherHandler.tag } ?: false
45
51
 
46
52
  override fun shouldHandlerBeCancelledBy(handler: GestureHandler<*>, otherHandler: GestureHandler<*>): Boolean {
47
53
  if (otherHandler is NativeViewGestureHandler) {
@@ -63,5 +69,6 @@ class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
63
69
  companion object {
64
70
  private const val KEY_WAIT_FOR = "waitFor"
65
71
  private const val KEY_SIMULTANEOUS_HANDLERS = "simultaneousHandlers"
72
+ private const val KEY_BLOCKS_HANDLERS = "blocksHandlers"
66
73
  }
67
74
  }