@rnmapbox/maps 10.2.8 → 10.2.9
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.
- package/android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt +2 -0
- package/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXCustomLocationProvider.kt +7 -0
- package/android/src/main/java/com/rnmapbox/rnmbx/events/MapSteadyEvent.kt +50 -0
- package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserver.kt +296 -0
- package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserverManager.kt +74 -0
- package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerDelegate.java +39 -0
- package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerInterface.java +18 -0
- package/ios/RNMBX/RNMBXCameraGestureObserver.swift +218 -0
- package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.h +15 -0
- package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.mm +119 -0
- package/ios/RNMBX/RNMBXCustomLocationProvider.swift +4 -0
- package/ios/RNMBX/RNMBXMapView.swift +50 -6
- package/ios/RNMBX/RNMBXRasterArraySourceComponentView.mm +4 -11
- package/ios/RNMBX/RNMBXRasterParticleLayerComponentView.mm +4 -15
- package/lib/module/Mapbox.native.js +2 -0
- package/lib/module/Mapbox.native.js.map +1 -1
- package/lib/module/components/CameraGestureObserver.js +17 -0
- package/lib/module/components/CameraGestureObserver.js.map +1 -0
- package/lib/module/specs/RNMBXCameraGestureObserverNativeComponent.ts +28 -0
- package/lib/typescript/src/Mapbox.native.d.ts +2 -0
- package/lib/typescript/src/Mapbox.native.d.ts.map +1 -1
- package/lib/typescript/src/components/CameraGestureObserver.d.ts +27 -0
- package/lib/typescript/src/components/CameraGestureObserver.d.ts.map +1 -0
- package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts +20 -0
- package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts.map +1 -0
- package/package.json +7 -2
- package/src/Mapbox.native.ts +2 -0
- package/src/components/CameraGestureObserver.tsx +37 -0
- 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))
|
package/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXCustomLocationProvider.kt
CHANGED
|
@@ -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
|
+
}
|