From 3b700acb1d7363f06454cd4a8cf6519da4d0972f Mon Sep 17 00:00:00 2001 From: Shahil Mangroliya Date: Fri, 28 Mar 2025 17:06:40 +0530 Subject: [PATCH 1/5] fix(android): add null safety checks in various components to prevent potential crashes --- .../rnmbx/components/images/RNMBXImagesManager.kt | 14 +++++++++----- .../rnmbx/components/mapview/RNMBXMapView.kt | 9 ++++----- .../components/mapview/RNMBXMapViewManager.kt | 4 ++-- .../rnmbx/components/styles/RNMBXStyleValue.kt | 12 ++++++++---- .../styles/sources/RNMBXShapeSourceManager.kt | 2 +- .../styles/sources/RNMBXTileSourceManager.kt | 2 +- .../RNMBXChangeLineOffsetsShapeAnimatorModule.kt | 7 +++++-- .../com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt | 13 ++++++++----- .../rnmbx/utils/extensions/ReadableArray.kt | 4 ++-- .../rnmapbox/rnmbx/utils/extensions/ReadableMap.kt | 2 +- .../com/rnmapbox/rnmbx/rncompat/ReadableMap.kt | 2 +- 11 files changed, 42 insertions(+), 29 deletions(-) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt index fb2147f944..327860e9a4 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt @@ -6,7 +6,7 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.view.View import com.facebook.react.bridge.* -import com.facebook.react.common.MapBuilder +//import com.facebook.react.common.MapBuilder import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.annotations.ReactProp import com.facebook.react.viewmanagers.RNMBXImagesManagerInterface @@ -15,7 +15,7 @@ import com.mapbox.maps.ImageStretches import com.rnmapbox.rnmbx.components.AbstractEventEmitter import com.rnmapbox.rnmbx.events.constants.EventKeys import com.rnmapbox.rnmbx.events.constants.eventMapOf -import com.rnmapbox.rnmbx.rncompat.dynamic.* +//import com.rnmapbox.rnmbx.rncompat.dynamic.* import com.rnmapbox.rnmbx.utils.ImageEntry import com.rnmapbox.rnmbx.utils.Logger import com.rnmapbox.rnmbx.utils.ResourceUtils @@ -249,10 +249,14 @@ class RNMBXImagesManager(private val mContext: ReactApplicationContext) : Logger.e("RNMBXImages", "each element of strech should be an array but was: ${array.getDynamic(i)}") } else { val pair = array.getArray(i) - if (pair.size() != 2 || pair.getType(0) != ReadableType.Number || pair.getType(1) != ReadableType.Number) { - Logger.e("RNMBXImages", "each element of stretch should be pair of 2 integers but was ${pair}") + if (pair != null) { + if (pair.size() != 2 || pair.getType(0) != ReadableType.Number || pair.getType(1) != ReadableType.Number) { + Logger.e("RNMBXImages", "each element of stretch should be pair of 2 integers but was ${pair}") + } + } + if (pair != null) { + result.add(ImageStretches(pair.getDouble(0).toFloat(), pair.getDouble(1).toFloat())) } - result.add(ImageStretches(pair.getDouble(0).toFloat(), pair.getDouble(1).toFloat())) } } return result; 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 688f3a6377..4714f24808 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 @@ -15,7 +15,6 @@ import android.widget.FrameLayout import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.ViewTreeLifecycleOwner import com.facebook.react.bridge.* import com.mapbox.android.gestures.* import com.mapbox.bindgen.Value @@ -76,6 +75,7 @@ import com.rnmapbox.rnmbx.v11compat.ornamentsettings.* import org.json.JSONException import org.json.JSONObject + fun MutableList.removeIf21(predicate: (T) -> Boolean): Boolean { var removed = false val iterator = this.iterator() @@ -131,11 +131,10 @@ class RNMBXLifeCycle { } } - override fun getLifecycle(): Lifecycle { - return lifecycleRegistry - } + override val lifecycle: Lifecycle + get() = lifecycleRegistry + } - ViewTreeLifecycleOwner.set(view, lifecycleOwner); } lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_START) } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt index 220cf54486..f972caa635 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt @@ -34,13 +34,13 @@ import java.util.HashMap fun ReadableArray.forEachString(action: (String) -> Unit) { for (i in 0 until size()) { - action(getString(i)) + getString(i)?.let { action(it) } } } fun ReadableArray.asArrayString(): Array { val result = Array(size()) { - getString(it) + getString(it).toString() } return result } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt index db13128f38..b2dc6078f4 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt @@ -82,7 +82,9 @@ class RNMBXStyleValue(config: ReadableMap) { val result = ArrayList(arr!!.size()) for (i in 0 until arr.size()) { val item = arr.getMap(i) - result.add(item.getDouble("value")) + if (item != null) { + result.add(item.getDouble("value")) + } } return result } @@ -104,7 +106,7 @@ class RNMBXStyleValue(config: ReadableMap) { val result = ArrayList(arr!!.size()) for (i in 0 until arr.size()) { val item = arr.getMap(i) - val value = item.getString("value") + val value = item?.getString("value") if (value != null) { result.add(value) } else { @@ -121,9 +123,11 @@ class RNMBXStyleValue(config: ReadableMap) { val result = WritableNativeMap() for (i in 0 until keyValues!!.size()) { val keyValue = keyValues.getArray(i) - val stringKey = keyValue.getMap(0).getString("value") + val stringKey = keyValue?.getMap(0)?.getString("value") val value = WritableNativeMap() - value.merge(keyValue.getMap(1)) + if (keyValue != null) { + keyValue.getMap(1)?.let { value.merge(it) } + } result.putMap(stringKey!!, value) } return result diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXShapeSourceManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXShapeSourceManager.kt index 637372d081..2b45f07823 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXShapeSourceManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXShapeSourceManager.kt @@ -119,7 +119,7 @@ class RNMBXShapeSourceManager(private val mContext: ReactApplicationContext, val ) ReadableType.Boolean -> Expression.literal(expressions.getBoolean(iExp)) ReadableType.Number -> Expression.literal(expressions.getDouble(iExp)) - else -> Expression.literal(expressions.getString(iExp)) + else -> expressions.getString(iExp)?.let { Expression.literal(it) }!! } builder.add(argument) } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt index 3b0a072f3c..6c77f5acf4 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt @@ -41,7 +41,7 @@ abstract class RNMBXTileSourceManager> internal construct val urls: MutableList = ArrayList() for (i in 0 until tileUrlTemplates.asArray().size()) { if (tileUrlTemplates.asArray().getType(0) == ReadableType.String) { - urls.add(tileUrlTemplates.asArray().getString(i)) + tileUrlTemplates.asArray().getString(i)?.let { urls.add(it) } } } source!!.tileUrlTemplates = urls diff --git a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt index 28d1020925..cd34fba085 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt @@ -210,8 +210,11 @@ private fun buildLineString(_coordinates: ReadableArray): LineString { for (i in 0 until _coordinates.size()) { val arr = _coordinates.getArray(i) - val coord = Point.fromLngLat(arr.getDouble(0), arr.getDouble(1)) - coordinates = coordinates.plus(coord) + + val coord = arr?.let { Point.fromLngLat(arr.getDouble(0), it.getDouble(1)) } + if(coord != null) { + coordinates = coordinates.plus(coord) + } } return LineString.fromLngLats(coordinates) 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 d52fa211d6..d604b0d8c6 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 @@ -33,15 +33,18 @@ fun ReadableArray.toValue(): Value { var result = ArrayList(size()) for (i in 0 until size()) { - result.add( when (getType(i)) { ReadableType.Null -> Value.nullValue() ReadableType.Boolean -> Value.valueOf(getBoolean(i)) ReadableType.Number -> Value.valueOf(getDouble(i)) - ReadableType.String -> Value.valueOf(getString(i)) - ReadableType.Array -> getArray(i).toValue() - ReadableType.Map -> getMap(i).toValue() - }) + ReadableType.String -> getString(i)?.let { Value.valueOf(it) } + ReadableType.Array -> getArray(i)?.toValue() + ReadableType.Map -> getMap(i)?.toValue() + }?.let { + result.add( + it + ) + } } return Value.valueOf(result) } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableArray.kt b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableArray.kt index 83a78bcf5d..b27dce1a35 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableArray.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableArray.kt @@ -46,8 +46,8 @@ fun ReadableArray.toJsonArray() : JsonArray { val result = JsonArray(size()) for (i in 0 until size()) { when (getType(i)) { - ReadableType.Map -> result.add(getMap(i).toJsonObject()) - ReadableType.Array -> result.add(getArray(i).toJsonArray()) + ReadableType.Map -> result.add(getMap(i)?.toJsonObject()) + ReadableType.Array -> result.add(getArray(i)?.toJsonArray()) ReadableType.Null -> result.add(null as JsonElement?) ReadableType.Number -> result.add(getDouble(i)) ReadableType.String -> result.add(getString(i)) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt index c69ef8c222..d2e99cdcf3 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt @@ -25,7 +25,7 @@ fun ReadableMap.forEach(action: (String, Any) -> Unit) { val iterator = this.entryIterator while (iterator.hasNext()) { val next = iterator.next() - action(next.key, next.value) + next.value?.let { action(next.key, it) } } } fun ReadableMap.getIfDouble(key: String): Double? { diff --git a/android/src/main/rn-compat/rn75/com/rnmapbox/rnmbx/rncompat/ReadableMap.kt b/android/src/main/rn-compat/rn75/com/rnmapbox/rnmbx/rncompat/ReadableMap.kt index fee7f2218c..194e630eec 100644 --- a/android/src/main/rn-compat/rn75/com/rnmapbox/rnmbx/rncompat/ReadableMap.kt +++ b/android/src/main/rn-compat/rn75/com/rnmapbox/rnmbx/rncompat/ReadableMap.kt @@ -1,7 +1,7 @@ package com.rnmapbox.rnmbx.rncompat.readable_map import com.facebook.react.bridge.ReadableMap -fun ReadableMap.getEntryIterator(): Iterator> +fun ReadableMap.getEntryIterator(): Iterator> { return this.entryIterator } \ No newline at end of file From 5956963d3d25a0952f21927dacc1db77b9067404 Mon Sep 17 00:00:00 2001 From: Shahil Mangroliya Date: Sat, 29 Mar 2025 11:21:14 +0530 Subject: [PATCH 2/5] fix(android): set view tree lifecycle owner in RNMBXMapView to fix lifecycle management --- .../java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt | 2 ++ 1 file changed, 2 insertions(+) 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 4714f24808..7a1af1b7da 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 @@ -15,6 +15,7 @@ import android.widget.FrameLayout import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry +import androidx.lifecycle.setViewTreeLifecycleOwner import com.facebook.react.bridge.* import com.mapbox.android.gestures.* import com.mapbox.bindgen.Value @@ -135,6 +136,7 @@ class RNMBXLifeCycle { get() = lifecycleRegistry } + view.setViewTreeLifecycleOwner(lifecycleOwner) } lifecycleOwner?.handleLifecycleEvent(Lifecycle.Event.ON_START) } From 5cf6d01869854230c9d4464512fb5fb1d71c210f Mon Sep 17 00:00:00 2001 From: Shahil Mangroliya Date: Sat, 29 Mar 2025 11:36:53 +0530 Subject: [PATCH 3/5] fix(android): enhance null safety checks in image and style components to improve error logging --- .../rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt | 6 +++--- .../com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt | 2 ++ .../RNMBXChangeLineOffsetsShapeAnimatorModule.kt | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt index 327860e9a4..60d2b2181a 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt @@ -252,10 +252,10 @@ class RNMBXImagesManager(private val mContext: ReactApplicationContext) : if (pair != null) { if (pair.size() != 2 || pair.getType(0) != ReadableType.Number || pair.getType(1) != ReadableType.Number) { Logger.e("RNMBXImages", "each element of stretch should be pair of 2 integers but was ${pair}") - } - } - if (pair != null) { + } result.add(ImageStretches(pair.getDouble(0).toFloat(), pair.getDouble(1).toFloat())) + } else { + Logger.e("RNMBXImages", "each element of stretch should be an array but was null") } } } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt index b2dc6078f4..8710d284c1 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt @@ -84,6 +84,8 @@ class RNMBXStyleValue(config: ReadableMap) { val item = arr.getMap(i) if (item != null) { result.add(item.getDouble("value")) + } else { + Logger.e("RNMBXStyleValue", "getFloatArray: null value for item: $i") } } return result diff --git a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt index cd34fba085..e18267c10a 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt @@ -214,6 +214,8 @@ private fun buildLineString(_coordinates: ReadableArray): LineString { val coord = arr?.let { Point.fromLngLat(arr.getDouble(0), it.getDouble(1)) } if(coord != null) { coordinates = coordinates.plus(coord) + } else { + Logger.e("RNMBXChangeLineOffsetsShapeAnimatorModule", "buildLineString: null coordinate for item: $i") } } From 41ed721de20c31f19c33094625fa4cf34b1bf677 Mon Sep 17 00:00:00 2001 From: Shahil Mangroliya Date: Mon, 31 Mar 2025 09:40:14 +0530 Subject: [PATCH 4/5] fix(android): add logger import to ChangeLineOffsetsShapeAnimatorModule for improved debugging --- .../shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt index e18267c10a..17fa1b261d 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/shapeAnimators/RNMBXChangeLineOffsetsShapeAnimatorModule.kt @@ -12,6 +12,7 @@ import com.mapbox.turf.TurfMeasurement import com.mapbox.turf.TurfMisc import com.rnmapbox.rnmbx.NativeRNMBXChangeLineOffsetsShapeAnimatorModuleSpec import com.rnmapbox.rnmbx.utils.ViewRefTag +import com.rnmapbox.rnmbx.utils.Logger class ChangeLineOffsetsShapeAnimator(tag: Tag, _lineString: LineString, startOffset: Double, endOffset: Double): ShapeAnimatorCommon(tag) { private var lineString = _lineString From fdc2a25d4b3f9dc86bb3aa6547da41b575ff6d46 Mon Sep 17 00:00:00 2001 From: Shahil Mangroliya Date: Fri, 11 Apr 2025 15:46:53 +0530 Subject: [PATCH 5/5] fix(android): improve null value handling in ReadableArray and ReadableMap with logging for better debugging --- .../rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt | 2 +- .../components/styles/sources/RNMBXTileSourceManager.kt | 3 ++- .../main/java/com/rnmapbox/rnmbx/utils/extensions/Dynamic.kt | 5 +++-- .../java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt index f972caa635..aba6e351a2 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapViewManager.kt @@ -34,7 +34,7 @@ import java.util.HashMap fun ReadableArray.forEachString(action: (String) -> Unit) { for (i in 0 until size()) { - getString(i)?.let { action(it) } + getString(i)?.let { action(it) } ?: Logger.d("RNMBXMapViewManager", "Skipping null string at index $i") } } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt index 6c77f5acf4..96e068889c 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/sources/RNMBXTileSourceManager.kt @@ -6,6 +6,7 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReadableType import com.facebook.react.uimanager.annotations.ReactProp import com.rnmapbox.rnmbx.components.AbstractEventEmitter +import com.rnmapbox.rnmbx.utils.Logger abstract class RNMBXTileSourceManager> internal constructor( reactApplicationContext: ReactApplicationContext @@ -41,7 +42,7 @@ abstract class RNMBXTileSourceManager> internal construct val urls: MutableList = ArrayList() for (i in 0 until tileUrlTemplates.asArray().size()) { if (tileUrlTemplates.asArray().getType(0) == ReadableType.String) { - tileUrlTemplates.asArray().getString(i)?.let { urls.add(it) } + tileUrlTemplates.asArray().getString(i)?.let { urls.add(it) } ?: Logger.d("RNMBXTileSource", "Skipping null URL template at index $i") } } source!!.tileUrlTemplates = urls 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 d604b0d8c6..36a4a0bcdd 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 @@ -6,6 +6,7 @@ import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.ReadableType import com.mapbox.bindgen.Value import com.rnmapbox.rnmbx.rncompat.dynamic.* +import com.rnmapbox.rnmbx.utils.Logger fun ReadableMap.toValueHashMap(): HashMap { var result = hashMapOf() @@ -37,12 +38,12 @@ fun ReadableArray.toValue(): Value { ReadableType.Null -> Value.nullValue() ReadableType.Boolean -> Value.valueOf(getBoolean(i)) ReadableType.Number -> Value.valueOf(getDouble(i)) - ReadableType.String -> getString(i)?.let { Value.valueOf(it) } + ReadableType.String -> getString(i)?.let { Value.valueOf(it) } ?: Logger.d("ReadableArray", "Skipping null string at index $i") ReadableType.Array -> getArray(i)?.toValue() ReadableType.Map -> getMap(i)?.toValue() }?.let { result.add( - it + it as Value ) } } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt index d2e99cdcf3..8a79c0a5a4 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/utils/extensions/ReadableMap.kt @@ -25,7 +25,7 @@ fun ReadableMap.forEach(action: (String, Any) -> Unit) { val iterator = this.entryIterator while (iterator.hasNext()) { val next = iterator.next() - next.value?.let { action(next.key, it) } + next.value?.let { action(next.key, it) } ?: Logger.d("ReadableMap", "Skipping null value for key: ${next.key}") } } fun ReadableMap.getIfDouble(key: String): Double? {