@rnmapbox/maps 10.2.8 → 10.2.10-rc.2

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 (29) hide show
  1. package/android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt +2 -0
  2. package/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXCustomLocationProvider.kt +7 -0
  3. package/android/src/main/java/com/rnmapbox/rnmbx/events/MapSteadyEvent.kt +50 -0
  4. package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserver.kt +296 -0
  5. package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserverManager.kt +74 -0
  6. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerDelegate.java +39 -0
  7. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerInterface.java +18 -0
  8. package/ios/RNMBX/RNMBXCameraGestureObserver.swift +218 -0
  9. package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.h +15 -0
  10. package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.mm +119 -0
  11. package/ios/RNMBX/RNMBXCustomLocationProvider.swift +4 -0
  12. package/ios/RNMBX/RNMBXMapView.swift +50 -6
  13. package/ios/RNMBX/RNMBXRasterArraySourceComponentView.mm +4 -11
  14. package/ios/RNMBX/RNMBXRasterParticleLayerComponentView.mm +4 -15
  15. package/lib/module/Mapbox.native.js +2 -0
  16. package/lib/module/Mapbox.native.js.map +1 -1
  17. package/lib/module/components/CameraGestureObserver.js +17 -0
  18. package/lib/module/components/CameraGestureObserver.js.map +1 -0
  19. package/lib/module/specs/RNMBXCameraGestureObserverNativeComponent.ts +28 -0
  20. package/lib/typescript/src/Mapbox.native.d.ts +2 -0
  21. package/lib/typescript/src/Mapbox.native.d.ts.map +1 -1
  22. package/lib/typescript/src/components/CameraGestureObserver.d.ts +27 -0
  23. package/lib/typescript/src/components/CameraGestureObserver.d.ts.map +1 -0
  24. package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts +20 -0
  25. package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts.map +1 -0
  26. package/package.json +7 -2
  27. package/src/Mapbox.native.ts +2 -0
  28. package/src/components/CameraGestureObserver.tsx +37 -0
  29. package/src/specs/RNMBXCameraGestureObserverNativeComponent.ts +28 -0
@@ -47,6 +47,7 @@ import com.rnmapbox.rnmbx.components.styles.sources.RNMBXShapeSourceManager
47
47
  import com.rnmapbox.rnmbx.components.styles.sources.RNMBXShapeSourceModule
48
48
  import com.rnmapbox.rnmbx.components.styles.sources.RNMBXVectorSourceManager
49
49
  import com.rnmapbox.rnmbx.components.styles.terrain.RNMBXTerrainManager
50
+ import com.rnmapbox.rnmbx.events.RNMBXCameraGestureObserverManager
50
51
  import com.rnmapbox.rnmbx.modules.RNMBXLocationModule
51
52
  import com.rnmapbox.rnmbx.modules.RNMBXLogging
52
53
  import com.rnmapbox.rnmbx.modules.RNMBXModule
@@ -125,6 +126,7 @@ class RNMBXPackage : TurboReactPackage() {
125
126
  managers.add(RNMBXMapViewManager(reactApplicationContext, getViewTagResolver(reactApplicationContext, "RNMBXMapViewManager")))
126
127
  managers.add(RNMBXStyleImportManager(reactApplicationContext))
127
128
  managers.add(RNMBXModelsManager(reactApplicationContext))
129
+ managers.add(RNMBXCameraGestureObserverManager(reactApplicationContext))
128
130
 
129
131
  // annotations
130
132
  managers.add(RNMBXMarkerViewManager(reactApplicationContext))
@@ -87,6 +87,13 @@ class RNMBXCustomLocationProvider(context: Context) : AbstractMapFeature(context
87
87
  if (customLocationProvider == null) {
88
88
  customLocationProvider = object : LocationProvider {
89
89
  override fun registerLocationConsumer(locationConsumer: LocationConsumer) {
90
+ heading?.let {
91
+ locationConsumer.onBearingUpdated(it)
92
+ }
93
+ coordinate?.let {
94
+ val point = Point.fromLngLat(it.first, it.second)
95
+ locationConsumer.onLocationUpdated(point)
96
+ }
90
97
  locationConsumers.add(locationConsumer)
91
98
  }
92
99
 
@@ -0,0 +1,50 @@
1
+ package com.rnmapbox.rnmbx.events
2
+
3
+ import android.view.View
4
+ import com.facebook.react.bridge.Arguments
5
+ import com.facebook.react.bridge.WritableMap
6
+
7
+ /**
8
+ * Direct event for CameraGestureObserver -> onMapSteady
9
+ * JS registrationName: onMapSteady
10
+ * Native event name (key): topOnMapSteady
11
+ */
12
+ class MapSteadyEvent(
13
+ view: View?,
14
+ private val reason: String,
15
+ private val idleDurationMs: Double?,
16
+ private val lastGestureType: String?
17
+ ) : AbstractEvent(view, "mapSteady") {
18
+ override val key: String
19
+ get() = "topOnMapSteady"
20
+
21
+ override val payload: WritableMap
22
+ get() = Arguments.createMap().apply {
23
+ putString("reason", reason)
24
+ if (idleDurationMs != null) {
25
+ putDouble("idleDurationMs", idleDurationMs)
26
+ } else {
27
+ putNull("idleDurationMs")
28
+ }
29
+ if (lastGestureType != null) {
30
+ putString("lastGestureType", lastGestureType)
31
+ } else {
32
+ putNull("lastGestureType")
33
+ }
34
+ putDouble("timestamp", System.currentTimeMillis().toDouble())
35
+ }
36
+
37
+ override fun canCoalesce(): Boolean {
38
+ // Do not coalesce - each steady/timeout event is significant
39
+ return false
40
+ }
41
+
42
+ companion object {
43
+ fun make(
44
+ view: View,
45
+ reason: String,
46
+ idleDurationMs: Double?,
47
+ lastGestureType: String?
48
+ ): MapSteadyEvent = MapSteadyEvent(view, reason, idleDurationMs, lastGestureType)
49
+ }
50
+ }
@@ -0,0 +1,296 @@
1
+ package com.rnmapbox.rnmbx.events
2
+
3
+ import android.animation.ValueAnimator
4
+ import android.content.Context
5
+ import android.os.Handler
6
+ import android.os.Looper
7
+ import android.util.Log
8
+ import com.mapbox.android.gestures.MoveGestureDetector
9
+ import com.mapbox.android.gestures.RotateGestureDetector
10
+ import com.mapbox.android.gestures.ShoveGestureDetector
11
+ import com.mapbox.android.gestures.StandardScaleGestureDetector
12
+ import com.mapbox.maps.plugin.animation.CameraAnimationsLifecycleListener
13
+ import com.mapbox.maps.plugin.animation.CameraAnimatorType
14
+ import com.mapbox.maps.plugin.gestures.OnMoveListener
15
+ import com.mapbox.maps.plugin.gestures.OnRotateListener
16
+ import com.mapbox.maps.plugin.gestures.OnScaleListener
17
+ import com.mapbox.maps.plugin.gestures.OnShoveListener
18
+ import com.rnmapbox.rnmbx.components.AbstractMapFeature
19
+ import com.rnmapbox.rnmbx.components.RemovalReason
20
+ import com.rnmapbox.rnmbx.components.mapview.RNMBXMapView
21
+
22
+ class RNMBXCameraGestureObserver(
23
+ private val mContext: Context,
24
+ private val mManager: RNMBXCameraGestureObserverManager
25
+ ) : AbstractMapFeature(mContext) {
26
+
27
+ var hasOnMapSteady: Boolean = false
28
+ var quietPeriodMs: Double? = null
29
+ var maxIntervalMs: Double? = null
30
+
31
+ override var requiresStyleLoad: Boolean = false
32
+
33
+ private val handler = Handler(Looper.getMainLooper())
34
+ private var activeAnimations: Int = 0
35
+ private var isGestureActive: Boolean = false
36
+ private var lastGestureType: String? = null
37
+ private var lastTransitionEndedAtMs: Double? = null
38
+ private var quietRunnable: Runnable? = null
39
+ private var timeoutRunnable: Runnable? = null
40
+ private var emittedForCurrentActivity: Boolean = false
41
+
42
+ private val quietMs: Double get() = quietPeriodMs ?: 200.0
43
+ private val maxMs: Double? get() = maxIntervalMs
44
+
45
+ private fun nowMs(): Double = System.currentTimeMillis().toDouble()
46
+ private fun timestamp(): Double = nowMs()
47
+
48
+ private val canEmitSteady: Boolean
49
+ get() = activeAnimations == 0 && !isGestureActive && lastTransitionEndedAtMs != null
50
+
51
+ private fun normalizeGestureType(type: String): String {
52
+ return when (type) {
53
+ "move" -> "pan"
54
+ "scale" -> "pinch"
55
+ "rotate" -> "rotate"
56
+ "shove" -> "pitch"
57
+ else -> type
58
+ }
59
+ }
60
+
61
+ private fun debugLog(message: String) {
62
+ Log.d(
63
+ LOG_TAG,
64
+ "$message; activeAnimations=$activeAnimations isGestureActive=$isGestureActive lastTransitionEnd=${lastTransitionEndedAtMs ?: -1}"
65
+ )
66
+ }
67
+
68
+ private fun scheduleTimer(delay: Double, task: Runnable): Runnable {
69
+ handler.removeCallbacks(task)
70
+ if (delay > 0) {
71
+ handler.postDelayed(task, delay.toLong())
72
+ }
73
+ return task
74
+ }
75
+
76
+ private fun cancelQuietTimer() {
77
+ quietRunnable?.let { handler.removeCallbacks(it) }
78
+ quietRunnable = null
79
+ }
80
+
81
+ private fun cancelTimeoutTimer() {
82
+ timeoutRunnable?.let { handler.removeCallbacks(it) }
83
+ timeoutRunnable = null
84
+ }
85
+
86
+ private fun scheduleQuietCheck() {
87
+ val delay = quietMs
88
+ if (delay <= 0) {
89
+ cancelQuietTimer()
90
+ maybeEmitSteady()
91
+ return
92
+ }
93
+ debugLog("scheduleQuietCheck in ${delay.toInt()}ms")
94
+ val runnable = Runnable {
95
+ debugLog("quiet timer fired")
96
+ maybeEmitSteady()
97
+ }
98
+ quietRunnable = scheduleTimer(delay, runnable)
99
+ }
100
+
101
+ private fun scheduleTimeout() {
102
+ val delay = maxMs ?: return
103
+ val runnable = Runnable {
104
+ emitTimeout()
105
+ }
106
+ timeoutRunnable = scheduleTimer(delay, runnable)
107
+ }
108
+
109
+ private fun markActivity(gestureType: String? = null) {
110
+ if (gestureType != null) lastGestureType = gestureType
111
+ emittedForCurrentActivity = false
112
+ scheduleQuietCheck()
113
+ scheduleTimeout()
114
+ }
115
+
116
+ private fun maybeEmitSteady() {
117
+ if (!canEmitSteady) return
118
+ val lastEnd = lastTransitionEndedAtMs ?: return
119
+ val sinceEnd = nowMs() - lastEnd
120
+ if (sinceEnd < quietMs) return
121
+ emitSteady(sinceEnd)
122
+ }
123
+
124
+ private fun emitSteady(idleDurationMs: Double) {
125
+ if (emittedForCurrentActivity) return
126
+ cancelQuietTimer()
127
+ cancelTimeoutTimer()
128
+ val gesture = lastGestureType
129
+ debugLog("EMIT steady idleDurationMs=$idleDurationMs lastGestureType=$gesture")
130
+ mManager.handleEvent(
131
+ MapSteadyEvent.make(this, "steady", idleDurationMs, gesture)
132
+ )
133
+ lastGestureType = null
134
+ emittedForCurrentActivity = true
135
+ }
136
+
137
+ private fun emitTimeout() {
138
+ cancelQuietTimer()
139
+ debugLog("EMIT timeout lastGestureType=$lastGestureType")
140
+ mManager.handleEvent(
141
+ MapSteadyEvent.make(this, "timeout", null, lastGestureType)
142
+ )
143
+ scheduleTimeout()
144
+ }
145
+
146
+ override fun addToMap(mapView: RNMBXMapView) {
147
+ super.addToMap(mapView)
148
+
149
+ if (!hasOnMapSteady) return
150
+
151
+ mapView.getMapAsync { mapboxMap ->
152
+ // Camera animations lifecycle
153
+ mapboxMap.cameraAnimationsPlugin {
154
+ this.addCameraAnimationsLifecycleListener(object : CameraAnimationsLifecycleListener {
155
+ override fun onAnimatorStarting(
156
+ type: CameraAnimatorType,
157
+ animator: ValueAnimator,
158
+ owner: String?
159
+ ) {
160
+ if (owner != "Maps-Gestures") return
161
+ activeAnimations++
162
+ lastTransitionEndedAtMs = null
163
+ markActivity()
164
+ debugLog("camera animator started")
165
+ }
166
+
167
+ override fun onAnimatorEnding(
168
+ type: CameraAnimatorType,
169
+ animator: ValueAnimator,
170
+ owner: String?
171
+ ) {
172
+ if (owner != "Maps-Gestures") return
173
+ handleAnimatorEnd()
174
+ }
175
+
176
+ override fun onAnimatorCancelling(
177
+ type: CameraAnimatorType,
178
+ animator: ValueAnimator,
179
+ owner: String?
180
+ ) {
181
+ if (owner != "Maps-Gestures") return
182
+ handleAnimatorEnd()
183
+ }
184
+
185
+ override fun onAnimatorInterrupting(
186
+ type: CameraAnimatorType,
187
+ runningAnimator: ValueAnimator,
188
+ runningAnimatorOwner: String?,
189
+ newAnimator: ValueAnimator,
190
+ newAnimatorOwner: String?
191
+ ) {
192
+ // Interruptions are handled by the ending/starting callbacks
193
+ }
194
+ })
195
+ }
196
+
197
+ // Gesture listeners
198
+ mapboxMap.gesturesPlugin {
199
+ this.addOnMoveListener(object : OnMoveListener {
200
+ override fun onMoveBegin(detector: MoveGestureDetector) {
201
+ handleGestureBegin("move")
202
+ }
203
+
204
+ override fun onMove(detector: MoveGestureDetector): Boolean {
205
+ return false
206
+ }
207
+
208
+ override fun onMoveEnd(detector: MoveGestureDetector) {
209
+ handleGestureEnd("move")
210
+ }
211
+ })
212
+
213
+ this.addOnScaleListener(object : OnScaleListener {
214
+ override fun onScaleBegin(detector: StandardScaleGestureDetector) {
215
+ handleGestureBegin("scale")
216
+ }
217
+
218
+ override fun onScale(detector: StandardScaleGestureDetector) {
219
+ }
220
+
221
+ override fun onScaleEnd(detector: StandardScaleGestureDetector) {
222
+ handleGestureEnd("scale")
223
+ }
224
+ })
225
+
226
+ this.addOnRotateListener(object : OnRotateListener {
227
+ override fun onRotateBegin(detector: RotateGestureDetector) {
228
+ handleGestureBegin("rotate")
229
+ }
230
+
231
+ override fun onRotate(detector: RotateGestureDetector) {
232
+ }
233
+
234
+ override fun onRotateEnd(detector: RotateGestureDetector) {
235
+ handleGestureEnd("rotate")
236
+ }
237
+ })
238
+
239
+ this.addOnShoveListener(object : OnShoveListener {
240
+ override fun onShoveBegin(detector: ShoveGestureDetector) {
241
+ handleGestureBegin("shove")
242
+ }
243
+
244
+ override fun onShove(detector: ShoveGestureDetector) {
245
+ }
246
+
247
+ override fun onShoveEnd(detector: ShoveGestureDetector) {
248
+ handleGestureEnd("shove")
249
+ }
250
+ })
251
+ }
252
+
253
+ debugLog("addToMap and subscribed to gestures")
254
+ }
255
+ }
256
+
257
+ override fun removeFromMap(mapView: RNMBXMapView, reason: RemovalReason): Boolean {
258
+ debugLog("removeFromMap and unsubscribed from gestures")
259
+ cancelQuietTimer()
260
+ cancelTimeoutTimer()
261
+ return super.removeFromMap(mapView, reason)
262
+ }
263
+
264
+ private fun handleAnimatorEnd() {
265
+ activeAnimations--
266
+ if (activeAnimations < 0) {
267
+ Log.w(LOG_TAG, "WARNING: activeAnimations went negative, resetting to 0")
268
+ activeAnimations = 0
269
+ }
270
+ lastTransitionEndedAtMs = nowMs()
271
+ scheduleQuietCheck()
272
+ debugLog("camera animator ended")
273
+ }
274
+
275
+ private fun handleGestureBegin(type: String) {
276
+ isGestureActive = true
277
+ lastGestureType = normalizeGestureType(type)
278
+ lastTransitionEndedAtMs = null
279
+ markActivity(lastGestureType)
280
+ debugLog("gesture didBegin type=$lastGestureType")
281
+ }
282
+
283
+ private fun handleGestureEnd(type: String) {
284
+ lastGestureType = normalizeGestureType(type)
285
+ // On Android, gesture end callbacks fire AFTER animations complete
286
+ // So we can mark the gesture as inactive and transition as ended
287
+ isGestureActive = false
288
+ lastTransitionEndedAtMs = nowMs()
289
+ markActivity(lastGestureType)
290
+ debugLog("gesture didEnd type=$lastGestureType -> isGestureActive=$isGestureActive")
291
+ }
292
+
293
+ companion object {
294
+ const val LOG_TAG = "RNMBXCameraGestureObserver"
295
+ }
296
+ }
@@ -0,0 +1,74 @@
1
+ package com.rnmapbox.rnmbx.events
2
+
3
+ import com.facebook.react.bridge.Dynamic
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.bridge.ReadableType
6
+ import com.facebook.react.module.annotations.ReactModule
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.ViewManagerDelegate
9
+ import com.facebook.react.uimanager.annotations.ReactProp
10
+ import com.facebook.react.viewmanagers.RNMBXCameraGestureObserverManagerDelegate
11
+ import com.facebook.react.viewmanagers.RNMBXCameraGestureObserverManagerInterface
12
+ import com.rnmapbox.rnmbx.components.AbstractEventEmitter
13
+ import com.rnmapbox.rnmbx.rncompat.dynamic.getType
14
+ import com.rnmapbox.rnmbx.utils.Logger
15
+
16
+ @ReactModule(name = RNMBXCameraGestureObserverManager.REACT_CLASS)
17
+ class RNMBXCameraGestureObserverManager(private val mContext: ReactApplicationContext) :
18
+ AbstractEventEmitter<RNMBXCameraGestureObserver>(mContext),
19
+ RNMBXCameraGestureObserverManagerInterface<RNMBXCameraGestureObserver> {
20
+
21
+ private val delegate: RNMBXCameraGestureObserverManagerDelegate<RNMBXCameraGestureObserver, RNMBXCameraGestureObserverManager> =
22
+ RNMBXCameraGestureObserverManagerDelegate(this)
23
+
24
+ override fun getName(): String = REACT_CLASS
25
+
26
+ override fun createViewInstance(reactContext: ThemedReactContext): RNMBXCameraGestureObserver =
27
+ RNMBXCameraGestureObserver(reactContext, this)
28
+
29
+ @ReactProp(name = "quietPeriodMs")
30
+ override fun setQuietPeriodMs(view: RNMBXCameraGestureObserver?, value: Dynamic?) {
31
+ value?.let {
32
+ when (it.getType()) {
33
+ ReadableType.Number -> view?.quietPeriodMs = it.asDouble()
34
+ ReadableType.Null -> view?.quietPeriodMs = null
35
+ else -> Logger.e(REACT_CLASS, "Expected Number or null for quietPeriodMs")
36
+ }
37
+ }
38
+ }
39
+
40
+ @ReactProp(name = "maxIntervalMs")
41
+ override fun setMaxIntervalMs(view: RNMBXCameraGestureObserver?, value: Dynamic?) {
42
+ value?.let {
43
+ when (it.getType()) {
44
+ ReadableType.Number -> view?.maxIntervalMs = it.asDouble()
45
+ ReadableType.Null -> view?.maxIntervalMs = null
46
+ else -> Logger.e(REACT_CLASS, "Expected Number or null for maxIntervalMs")
47
+ }
48
+ }
49
+ }
50
+
51
+ @ReactProp(name = "hasOnMapSteady")
52
+ override fun setHasOnMapSteady(view: RNMBXCameraGestureObserver?, value: Dynamic?) {
53
+ if (value?.getType()?.name == "Boolean") {
54
+ view?.hasOnMapSteady = value.asBoolean()
55
+ } else {
56
+ if (value == null) {
57
+ Logger.e(REACT_CLASS, "Expected Boolean value for hasOnMapSteady")
58
+ } else {
59
+ Logger.e(REACT_CLASS, "Expected Boolean value for hasOnMapSteady, got ${value.getType()?.name}")
60
+ }
61
+ }
62
+ }
63
+
64
+ override fun getDelegate(): ViewManagerDelegate<RNMBXCameraGestureObserver> = delegate
65
+
66
+ // Map the native event name to the JS registration name for direct events
67
+ override fun customEvents(): Map<String, String> = mapOf(
68
+ "topOnMapSteady" to "onMapSteady"
69
+ )
70
+
71
+ companion object {
72
+ const val REACT_CLASS = "RNMBXCameraGestureObserver"
73
+ }
74
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.bridge.DynamicFromObject;
15
+ import com.facebook.react.uimanager.BaseViewManager;
16
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
+ import com.facebook.react.uimanager.LayoutShadowNode;
18
+
19
+ public class RNMBXCameraGestureObserverManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNMBXCameraGestureObserverManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
+ public RNMBXCameraGestureObserverManagerDelegate(U viewManager) {
21
+ super(viewManager);
22
+ }
23
+ @Override
24
+ public void setProperty(T view, String propName, @Nullable Object value) {
25
+ switch (propName) {
26
+ case "quietPeriodMs":
27
+ mViewManager.setQuietPeriodMs(view, new DynamicFromObject(value));
28
+ break;
29
+ case "maxIntervalMs":
30
+ mViewManager.setMaxIntervalMs(view, new DynamicFromObject(value));
31
+ break;
32
+ case "hasOnMapSteady":
33
+ mViewManager.setHasOnMapSteady(view, new DynamicFromObject(value));
34
+ break;
35
+ default:
36
+ super.setProperty(view, propName, value);
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import com.facebook.react.bridge.Dynamic;
14
+ public interface RNMBXCameraGestureObserverManagerInterface<T extends View> {
15
+ void setQuietPeriodMs(T view, Dynamic value);
16
+ void setMaxIntervalMs(T view, Dynamic value);
17
+ void setHasOnMapSteady(T view, Dynamic value);
18
+ }