From 788e9c249b79e7ddba663a1214c165d65f9ce793 Mon Sep 17 00:00:00 2001 From: Rob Jacobson Date: Mon, 12 Oct 2026 18:40:55 -0700 Subject: [PATCH] fix(android): defer initial camera events until defaults are applied - Hold startup camera notifications until attachment callbacks finish applying the initial camera - Emit the current camera once after initialization and preserve subsequent camera events - Keep maps without a Camera and valid zero-coordinate camera positions working --- .../rnmbx/components/mapview/RNMBXMapView.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt index 7f92fe61b..6199cef2d 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt @@ -202,6 +202,8 @@ open class RNMBXMapView(private val mContext: Context, var mManager: RNMBXMapVie private var wasGestureActive = false private var isGestureActive = false + private var cameraEventsReady = false + private var hasPendingCameraChange = false var mapViewImpl: String? = null @@ -260,8 +262,7 @@ open class RNMBXMapView(private val mContext: Context, var mManager: RNMBXMapVie val _this = this map.addOnCameraChangeListener(OnCameraChangeListener { cameraChangedEventData -> - handleMapChangedEvent(EventTypes.REGION_IS_CHANGING) - handleMapChangedEvent(EventTypes.CAMERA_CHANGED) + sendCameraChangedEvents() }) map.addOnMapIdleListener(OnMapIdleListener { mapIdleEventData -> @@ -856,6 +857,16 @@ open class RNMBXMapView(private val mContext: Context, var mManager: RNMBXMapVie // region Events + private fun sendCameraChangedEvents() { + if (!cameraEventsReady) { + hasPendingCameraChange = true + return + } + hasPendingCameraChange = false + handleMapChangedEvent(EventTypes.REGION_IS_CHANGING) + handleMapChangedEvent(EventTypes.CAMERA_CHANGED) + } + fun sendRegionDidChangeEvent() { handleMapChangedEvent(EventTypes.REGION_DID_CHANGE) mCameraChangeTracker.setReason(CameraChangeReason.NONE) @@ -1622,6 +1633,13 @@ open class RNMBXMapView(private val mContext: Context, var mManager: RNMBXMapVie super.onAttachedToWindow() Handler(Looper.getMainLooper()).post { lifecycle.afterAttachFromLooper() + // Camera.addToMap applies defaultSettings in these attachment callbacks. + // Forward the current camera only after they finish, rather than the + // SDK's earlier startup positions. Maps without a Camera also become ready. + cameraEventsReady = true + if (hasPendingCameraChange) { + sendCameraChangedEvents() + } } }