From 6ec4127ca8876770e1b93a218af9be5f53fd75b7 Mon Sep 17 00:00:00 2001 From: Craig Martin Date: Mon, 5 Feb 2024 16:42:15 -0500 Subject: [PATCH] Fix android crash, fix android location puck images not updating properly --- .../rnmbx/components/camera/RNMBXCamera.kt | 6 +-- .../components/camera/RNMBXCameraManager.kt | 10 +++-- .../location/RNMBXNativeUserLocation.kt | 43 +++++++++---------- .../rnmbx/utils/extensions/Dynamic.kt | 16 +++++++ 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt index dbd6d0b54..0da0a301d 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt @@ -136,17 +136,17 @@ class RNMBXCamera(private val mContext: Context, private val mManager: RNMBXCame _updateViewportState() } - fun setFollowZoomLevel(zoomLevel: Double) { + fun setFollowZoomLevel(zoomLevel: Double?) { mFollowZoomLevel = zoomLevel _updateViewportState(); } - fun setFollowPitch(pitch: Double) { + fun setFollowPitch(pitch: Double?) { mFollowPitch = pitch _updateViewportState(); } - fun setFollowHeading(heading: Double) { + fun setFollowHeading(heading: Double?) { mFollowHeading = heading _updateViewportState(); } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt index d497ad9de..480c8c215 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt @@ -10,6 +10,8 @@ import com.rnmapbox.rnmbx.components.AbstractEventEmitter import com.rnmapbox.rnmbx.components.camera.CameraStop.Companion.fromReadableMap import com.rnmapbox.rnmbx.utils.GeoJSONUtils.toLatLngBounds import com.rnmapbox.rnmbx.utils.extensions.asBooleanOrNull +import com.rnmapbox.rnmbx.utils.extensions.asDoubleOrNull +import com.rnmapbox.rnmbx.utils.extensions.asStringOrNull class RNMBXCameraManager(private val mContext: ReactApplicationContext) : AbstractEventEmitter( @@ -71,22 +73,22 @@ class RNMBXCameraManager(private val mContext: ReactApplicationContext) : @ReactProp(name = "followUserMode") override fun setFollowUserMode(camera: RNMBXCamera, value: Dynamic) { - camera.setFollowUserMode(value.asString()) + camera.setFollowUserMode(value.asStringOrNull()) } @ReactProp(name = "followZoomLevel") override fun setFollowZoomLevel(camera: RNMBXCamera, value: Dynamic) { - camera.setFollowZoomLevel(value.asDouble()) + camera.setFollowZoomLevel(value.asDoubleOrNull()) } @ReactProp(name = "followPitch") override fun setFollowPitch(camera: RNMBXCamera, value: Dynamic) { - camera.setFollowPitch(value.asDouble()) + camera.setFollowPitch(value.asDoubleOrNull()) } @ReactProp(name = "followHeading") override fun setFollowHeading(camera: RNMBXCamera, value: Dynamic) { - camera.setFollowHeading(value.asDouble()) + camera.setFollowHeading(value.asDoubleOrNull()) } @ReactProp(name = "followPadding") diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXNativeUserLocation.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXNativeUserLocation.kt index 39153d60f..4c1ffd0fc 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXNativeUserLocation.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXNativeUserLocation.kt @@ -46,6 +46,7 @@ enum class RenderMode { class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), OnMapReadyCallback, Style.OnStyleLoaded { private var mEnabled = true private var mMap: MapboxMap? = null + private var mMBXMapView: RNMBXMapView? = null private var mRenderMode : RenderMode = RenderMode.NORMAL; private var mContext : Context = context @@ -63,7 +64,7 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O SHADOW } - private var imageNames = mutableMapOf() + private var imageNames = mutableMapOf() private var subscriptions = mutableMapOf() private var images = mutableMapOf() @@ -98,23 +99,10 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O } private fun imageNameUpdated(image: PuckImagePart, name: String?) { - if (name != null) { - imageNames[image] = name - } else { - imageNames.remove(image) - } - subscriptions[image]?.let { - it.cancel() - } - subscriptions.remove(image) - - if (name == null) { - imageUpdated(image, null) - return + imageNames[image] = name + mMBXMapView?.let { + _fetchImages(it) } - - imageManager?.let { subscribe(it, image, name) } - } private fun imageUpdated(image: PuckImagePart, imageHolder: ImageHolder?) { @@ -208,6 +196,7 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O mapView.getMapboxMap() mapView.getMapAsync(this) mMapView?.locationComponentManager?.showNativeUserLocation(true) + mMBXMapView = mapView _fetchImages(mapView) _apply() } @@ -216,6 +205,7 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O mEnabled = false mMapView?.locationComponentManager?.showNativeUserLocation(false) mMap?.getStyle(this) + mMBXMapView = null return super.removeFromMap(mapView, reason) } @@ -244,7 +234,6 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O subscriptions.remove(image) Logger.e("RNMBXNativeUserLocation", "subscribe: there is alread a subscription for image: $image") } - subscriptions[image] = imageManager.subscribe(name, Resolver { _, imageData -> imageUpdated(image, imageData.toImageHolder()) }) @@ -260,19 +249,27 @@ class RNMBXNativeUserLocation(context: Context) : AbstractMapFeature(context), O private fun _fetchImages(map: RNMBXMapView) { map.mapView?.getMapboxMap()?.getStyle()?.let { style -> imageNames.forEach { (part,name) -> - if (style.hasStyleImage(name)) { - style.getStyleImage(name)?.let { image -> - images[part] = image.toImageHolder() + if (name != null) { + if (style.hasStyleImage(name)) { + style.getStyleImage(name)?.let { image -> + images[part] = image.toImageHolder() + } + } else { + images.remove(part) } + } else { + images.remove(part) } } } - removeSubscriptions() val imageManager = map.imageManager this.imageManager = imageManager + _apply() imageNames.forEach { (part,name) -> - subscribe(imageManager, part, name) + if (name != null) { + subscribe(imageManager, part, name) + } } } // endregion diff --git a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt index 1bff990c9..a4966048e 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt @@ -62,4 +62,20 @@ fun Dynamic.asBooleanOrNull(): Boolean? { } else { asBoolean() } +} + +fun Dynamic.asDoubleOrNull(): Double? { + return if (isNull) { + null + } else { + asDouble() + } +} + +fun Dynamic.asStringOrNull(): String? { + return if (isNull) { + null + } else { + asString() + } } \ No newline at end of file