From 1d3a74c67bb28ed4f8fa98f4feb932e7a73bf88d Mon Sep 17 00:00:00 2001 From: pinpong Date: Wed, 11 Feb 2026 18:44:48 +0700 Subject: [PATCH 1/2] feat: improve error reporting --- .../rngooglemapsplus/GoogleMapsViewImpl.kt | 8 ++--- .../com/rngooglemapsplus/MapErrorHandler.kt | 24 ++++++++++++++ .../java/com/rngooglemapsplus/MapHelper.kt | 13 -------- .../com/rngooglemapsplus/MapMarkerBuilder.kt | 19 +++++------ .../MapUrlTileOverlayBuilder.kt | 6 ++-- .../rngooglemapsplus/RNGoogleMapsPlusView.kt | 13 +++++--- .../extensions/BitmapExtension.kt | 6 ++-- example/src/hooks/useMapCallbacks.ts | 6 +++- ios/GoogleMapViewImpl.swift | 6 +++- ios/MapErrorHandler.swift | 21 ++++++++++++ ios/MapHelper.swift | 14 -------- ios/MapMarkerBuilder.swift | 20 ++++++------ ios/RNGoogleMapsPlusView.swift | 10 ++++-- ios/extensions/UIImage+Extension.swift | 5 +-- src/RNGoogleMapsPlusView.nitro.ts | 4 +-- src/types.ts | 32 +++++++++++++++---- 16 files changed, 133 insertions(+), 74 deletions(-) create mode 100644 android/src/main/java/com/rngooglemapsplus/MapErrorHandler.kt create mode 100644 ios/MapErrorHandler.swift diff --git a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt index 9bd6e0f..be049d0 100644 --- a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt +++ b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt @@ -61,6 +61,7 @@ class GoogleMapsViewImpl( val locationHandler: LocationHandler, val playServiceHandler: PlayServicesHandler, val markerBuilder: MapMarkerBuilder, + val mapErrorHandler: MapErrorHandler, ) : FrameLayout(reactContext), GoogleMap.OnCameraMoveStartedListener, GoogleMap.OnCameraMoveListener, @@ -135,7 +136,7 @@ class GoogleMapsViewImpl( val result = playServiceHandler.playServicesAvailability() val errorCode = result.toRNMapErrorCodeOrNull() if (errorCode != null) { - onMapError?.invoke(errorCode) + mapErrorHandler.report(errorCode, "play services unavailable") if (errorCode == RNMapErrorCode.PLAY_SERVICES_MISSING || errorCode == RNMapErrorCode.PLAY_SERVICES_INVALID ) { @@ -396,7 +397,6 @@ class GoogleMapsViewImpl( ) } - var onMapError: ((RNMapErrorCode) -> Unit)? = null var onMapReady: ((Boolean) -> Unit)? = null var onMapLoaded: ((RNRegion, RNCamera) -> Unit)? = null var onLocationUpdate: ((RNLocation) -> Unit)? = null @@ -505,7 +505,7 @@ class GoogleMapsViewImpl( onUi { googleMap?.snapshot { bitmap -> bitmap - ?.encode(context, size, format, compressFormat, quality, resultIsFile) + ?.encode(context, size, format, compressFormat, quality, resultIsFile, mapErrorHandler) ?.let(promise::resolve) ?: promise.resolve(null) } } @@ -754,7 +754,7 @@ class GoogleMapsViewImpl( kmlLayersById[id] = layer layer.addLayerToMap() } catch (_: Exception) { - mapsLog("kml layer parse failed: id=$id") + mapErrorHandler.report(RNMapErrorCode.KML_LAYER_FAILED, "kml layer parse failed: id=$id", null) } } diff --git a/android/src/main/java/com/rngooglemapsplus/MapErrorHandler.kt b/android/src/main/java/com/rngooglemapsplus/MapErrorHandler.kt new file mode 100644 index 0000000..943e987 --- /dev/null +++ b/android/src/main/java/com/rngooglemapsplus/MapErrorHandler.kt @@ -0,0 +1,24 @@ +package com.rngooglemapsplus + +private const val MAPS_LOG_TAG = "react-native-google-maps-plus" + +class MapErrorHandler { + @Volatile + var callback: ((RNMapErrorCode, String) -> Unit)? = null + + fun report( + code: RNMapErrorCode, + msg: String, + t: Throwable? = null, + ) { + if (t != null) { + android.util.Log.w(MAPS_LOG_TAG, msg, t) + } else { + android.util.Log.w(MAPS_LOG_TAG, msg) + } + + onUi { + callback?.invoke(code, msg) + } + } +} diff --git a/android/src/main/java/com/rngooglemapsplus/MapHelper.kt b/android/src/main/java/com/rngooglemapsplus/MapHelper.kt index ee0646a..446e9a6 100644 --- a/android/src/main/java/com/rngooglemapsplus/MapHelper.kt +++ b/android/src/main/java/com/rngooglemapsplus/MapHelper.kt @@ -20,16 +20,3 @@ inline fun onUiSync(crossinline block: () -> T): T { } return runBlocking { result.await() } } - -private const val MAPS_LOG_TAG = "react-native-google-maps-plus" - -fun mapsLog(msg: String) { - android.util.Log.w(MAPS_LOG_TAG, msg) -} - -fun mapsLog( - msg: String, - t: Throwable, -) { - android.util.Log.w(MAPS_LOG_TAG, msg, t) -} diff --git a/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt b/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt index cc3e3e8..778c369 100644 --- a/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt +++ b/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt @@ -43,6 +43,7 @@ import kotlin.coroutines.cancellation.CancellationException class MapMarkerBuilder( val context: ThemedReactContext, + private val mapErrorHandler: MapErrorHandler, private val scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default), ) { private val iconCache = @@ -121,7 +122,7 @@ class MapMarkerBuilder( } } }.onFailure { - mapsLog("external svg resolve failed") + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "external svg resolve failed", null) }.getOrNull() } @@ -145,7 +146,7 @@ class MapMarkerBuilder( try { return Typeface.createFromAsset(assetManager, path) } catch (_: Throwable) { - mapsLog("font resolve failed: $path") + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "font resolve failed: $path", null) } } @@ -292,14 +293,14 @@ class MapMarkerBuilder( onReady(desc) } } catch (_: OutOfMemoryError) { - mapsLog("markerId=${m.id} buildIconAsync out of memory") + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync out of memory", null) clearIconCache() withContext(Dispatchers.Main) { ensureActive() onReady(createFallbackDescriptor()) } } catch (_: Throwable) { - mapsLog("markerId=${m.id} buildIconAsync failed") + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync failed", null) withContext(Dispatchers.Main) { ensureActive() onReady(createFallbackDescriptor()) @@ -343,7 +344,7 @@ class MapMarkerBuilder( .toInt() if (wPx <= 0 || hPx <= 0) { - mapsLog("markerId=${markerTag.id} invalid svg size") + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=${markerTag.id} invalid svg size", null) return ImageView(context) } @@ -365,7 +366,7 @@ class MapMarkerBuilder( val drawable = PictureDrawable(svg.renderToPicture()) svgView.setImageDrawable(drawable) } catch (_: Exception) { - mapsLog("markerId=${markerTag.id} infoWindow: svg render failed") + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${markerTag.id} infoWindow: svg render failed", null) return ImageView(context) } @@ -403,7 +404,7 @@ class MapMarkerBuilder( .toInt() if (wPx <= 0 || hPx <= 0) { - mapsLog("markerId=$markerId invalid svg size") + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId invalid svg size", null) return RenderBitmapResult(createFallbackBitmap(), true) } @@ -416,10 +417,10 @@ class MapMarkerBuilder( documentHeight = hPx.toFloat() } } catch (_: SVGParseException) { - mapsLog("markerId=$markerId icon: svg parse failed") + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg parse failed", null) return RenderBitmapResult(createFallbackBitmap(), true) } catch (_: IllegalArgumentException) { - mapsLog("markerId=$markerId icon: svg invalid") + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg invalid", null) return RenderBitmapResult(createFallbackBitmap(), true) } diff --git a/android/src/main/java/com/rngooglemapsplus/MapUrlTileOverlayBuilder.kt b/android/src/main/java/com/rngooglemapsplus/MapUrlTileOverlayBuilder.kt index ebd6003..9e93ce2 100644 --- a/android/src/main/java/com/rngooglemapsplus/MapUrlTileOverlayBuilder.kt +++ b/android/src/main/java/com/rngooglemapsplus/MapUrlTileOverlayBuilder.kt @@ -4,7 +4,9 @@ import com.google.android.gms.maps.model.TileOverlayOptions import com.google.android.gms.maps.model.UrlTileProvider import java.net.URL -class MapUrlTileOverlayBuilder { +class MapUrlTileOverlayBuilder( + private val mapErrorHandler: MapErrorHandler, +) { fun build(t: RNUrlTileOverlay): TileOverlayOptions { val provider = object : UrlTileProvider( @@ -25,7 +27,7 @@ class MapUrlTileOverlayBuilder { return try { URL(url) } catch (e: Exception) { - mapsLog("tile url invalid: $url", e) + mapErrorHandler.report(RNMapErrorCode.TILE_OVERLAY_FAILED, "tile url invalid: $url", e) null } } diff --git a/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt b/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt index ecc0fbc..3c48d17 100644 --- a/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt +++ b/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt @@ -24,20 +24,22 @@ import com.rngooglemapsplus.extensions.toSize class RNGoogleMapsPlusView( val context: ThemedReactContext, ) : HybridRNGoogleMapsPlusViewSpec() { + private val mapErrorHandler = MapErrorHandler() + private var currentCustomMapStyle: String? = null private var permissionHandler = PermissionHandler(context) private var locationHandler = LocationHandler(context) private var playServiceHandler = PlayServicesHandler(context) - private val markerBuilder = MapMarkerBuilder(context) + private val markerBuilder = MapMarkerBuilder(context, mapErrorHandler) private val polylineBuilder = MapPolylineBuilder() private val polygonBuilder = MapPolygonBuilder() private val circleBuilder = MapCircleBuilder() private val heatmapBuilder = MapHeatmapBuilder() - private val urlTileOverlayBuilder = MapUrlTileOverlayBuilder() + private val urlTileOverlayBuilder = MapUrlTileOverlayBuilder(mapErrorHandler) override val view = - GoogleMapsViewImpl(context, locationHandler, playServiceHandler, markerBuilder) + GoogleMapsViewImpl(context, locationHandler, playServiceHandler, markerBuilder, mapErrorHandler) override var initialProps: RNInitialProps? = null set(value) { @@ -303,9 +305,10 @@ class RNGoogleMapsPlusView( view.locationConfig = value } - override var onMapError: ((RNMapErrorCode) -> Unit)? = null + override var onMapError: ((RNMapErrorCode, String) -> Unit)? = null set(cb) { - view.onMapError = cb + field = cb + mapErrorHandler.callback = cb } override var onMapReady: ((Boolean) -> Unit)? = null diff --git a/android/src/main/java/com/rngooglemapsplus/extensions/BitmapExtension.kt b/android/src/main/java/com/rngooglemapsplus/extensions/BitmapExtension.kt index 019f7ce..80e2671 100644 --- a/android/src/main/java/com/rngooglemapsplus/extensions/BitmapExtension.kt +++ b/android/src/main/java/com/rngooglemapsplus/extensions/BitmapExtension.kt @@ -5,7 +5,8 @@ import android.graphics.Bitmap import android.util.Base64 import android.util.Size import androidx.core.graphics.scale -import com.rngooglemapsplus.mapsLog +import com.rngooglemapsplus.MapErrorHandler +import com.rngooglemapsplus.RNMapErrorCode import java.io.ByteArrayOutputStream import java.io.File import java.io.FileOutputStream @@ -17,6 +18,7 @@ fun Bitmap.encode( compressFormat: Bitmap.CompressFormat, quality: Double, asFile: Boolean, + mapErrorHandler: MapErrorHandler, ): String? = try { targetSize?.let { scale(it.width, it.height) } @@ -32,6 +34,6 @@ fun Bitmap.encode( "data:image/$format;base64," + Base64.encodeToString(bytes, Base64.NO_WRAP) } } catch (e: Exception) { - mapsLog("snapshot export failed", e) + mapErrorHandler.report(RNMapErrorCode.SNAPSHOT_EXPORT_FAILED, "snapshot export failed", e) null } diff --git a/example/src/hooks/useMapCallbacks.ts b/example/src/hooks/useMapCallbacks.ts index 2fb3775..3d9c762 100644 --- a/example/src/hooks/useMapCallbacks.ts +++ b/example/src/hooks/useMapCallbacks.ts @@ -31,7 +31,11 @@ export function useMapCallbacks( const onMapError = useNitroCallback( props.onMapError, - useCallback((e: RNMapErrorCode) => console.log('Map error:', e), []) + useCallback( + (e: RNMapErrorCode, message: string) => + console.log('Map error:', RNMapErrorCode[e], message), + [] + ) ); const onMapReady = useNitroCallback( diff --git a/ios/GoogleMapViewImpl.swift b/ios/GoogleMapViewImpl.swift index 8720585..8f0b965 100644 --- a/ios/GoogleMapViewImpl.swift +++ b/ios/GoogleMapViewImpl.swift @@ -7,6 +7,7 @@ import UIKit final class GoogleMapsViewImpl: UIView, GMSMapViewDelegate, GMSIndoorDisplayDelegate { + private let mapErrorHandler: MapErrorHandler private let locationHandler: LocationHandler private let markerBuilder: MapMarkerBuilder private var mapView: GMSMapView? @@ -35,9 +36,11 @@ GMSIndoorDisplayDelegate { init( frame: CGRect = .zero, + mapErrorHandler: MapErrorHandler, locationHandler: LocationHandler, markerBuilder: MapMarkerBuilder ) { + self.mapErrorHandler = mapErrorHandler self.locationHandler = locationHandler self.markerBuilder = markerBuilder super.init(frame: frame) @@ -468,7 +471,8 @@ GMSIndoorDisplayDelegate { format: format, imageFormat: imageFormat, quality: quality, - resultIsFile: resultIsFile + resultIsFile: resultIsFile, + mapErrorHandler: self.mapErrorHandler ) { promise.resolve(withResult: result) } else { diff --git a/ios/MapErrorHandler.swift b/ios/MapErrorHandler.swift new file mode 100644 index 0000000..32d0638 --- /dev/null +++ b/ios/MapErrorHandler.swift @@ -0,0 +1,21 @@ +import Foundation + +private let mapsLogTag = "react-native-google-maps-plus" + +final class MapErrorHandler { + + var callback: ((RNMapErrorCode, String) -> Void)? + + func report(_ code: RNMapErrorCode, _ msg: String, _ error: Error? = nil) { + if let error { + NSLog("[%@] %@ | %@", mapsLogTag, msg, String(describing: error)) + } else { + NSLog("[%@] %@", mapsLogTag, msg) + } + + onMain { [weak self] in + guard let self else { return } + self.callback?(code, msg) + } + } +} diff --git a/ios/MapHelper.swift b/ios/MapHelper.swift index 5bd359f..11059db 100644 --- a/ios/MapHelper.swift +++ b/ios/MapHelper.swift @@ -33,17 +33,3 @@ func onMain( } } } - -@inline(__always) -func mapsLog(_ message: String) { - NSLog("[react-native-google-maps-plus] %@", message) -} - -@inline(__always) -func mapsLog(_ message: String, _ error: Error) { - NSLog( - "[react-native-google-maps-plus] %@ | %@", - message, - String(describing: error) - ) -} diff --git a/ios/MapMarkerBuilder.swift b/ios/MapMarkerBuilder.swift index 9e6d9f0..e6d950a 100644 --- a/ios/MapMarkerBuilder.swift +++ b/ios/MapMarkerBuilder.swift @@ -3,6 +3,8 @@ import SVGKit import UIKit final class MapMarkerBuilder { + private let mapErrorHandler: MapErrorHandler + private let iconCache: NSCache = { let c = NSCache() c.countLimit = 256 @@ -10,7 +12,8 @@ final class MapMarkerBuilder { }() private var tasks: [String: Task] = [:] - init() { + init(mapErrorHandler: MapErrorHandler) { + self.mapErrorHandler = mapErrorHandler warmupSVGKit() } @@ -225,14 +228,14 @@ final class MapMarkerBuilder { let h = CGFloat(iconSvg.height) if w <= 0 || h <= 0 { - mapsLog("markerId=\(markerTag.id) icon: invalid svg size") + mapErrorHandler.report(RNMapErrorCode.invalidArgument, "markerId=\(markerTag.id) icon: invalid svg size") return createFallbackImageView() } guard let data = iconSvg.svgString.data(using: .utf8), let svgImg = SVGKImage(data: data) else { - mapsLog("markerId=\(markerTag.id) infoWindow: svg utf8 decode failed") + mapErrorHandler.report(RNMapErrorCode.invalidArgument, "markerId=\(markerTag.id) infoWindow: svg utf8 decode failed") return createFallbackImageView() } @@ -241,9 +244,7 @@ final class MapMarkerBuilder { svgImg.size = size guard let finalImage = SVGKExporterUIImage.export(asUIImage: svgImg) else { - mapsLog( - "markerId=\(markerTag.id) infoWindow: svg export to UIImage failed" - ) + mapErrorHandler.report(RNMapErrorCode.markerIconBuildFailed, "markerId=\(markerTag.id) infoWindow: svg export to UIImage failed") svgImg.clear() return createFallbackImageView() } @@ -294,14 +295,14 @@ final class MapMarkerBuilder { let h = CGFloat(iconSvg.height) if w <= 0 || h <= 0 { - mapsLog("markerId=\(markerId) icon: invalid svg size") + mapErrorHandler.report(RNMapErrorCode.invalidArgument, "markerId=\(markerId) icon: invalid svg size") return (createFallbackUIImage(), true) } guard let data = iconSvg.svgString.data(using: .utf8) else { - mapsLog("markerId=\(markerId) icon: svg utf8 decode failed") + mapErrorHandler.report(RNMapErrorCode.invalidArgument, "markerId=\(markerId) icon: svg utf8 decode failed") return (createFallbackUIImage(), true) } @@ -311,7 +312,7 @@ final class MapMarkerBuilder { guard !Task.isCancelled else { return nil } guard let svgImg = SVGKImage(data: data) else { - mapsLog("markerId=\(markerId) icon: SVGKImage init failed") + mapErrorHandler.report(RNMapErrorCode.markerIconBuildFailed, "markerId=\(markerId) icon: SVGKImage init failed") return (createFallbackUIImage(), true) } @@ -330,6 +331,7 @@ final class MapMarkerBuilder { if let uiImage = uiImage { return (uiImage, false) } else { + mapErrorHandler.report(.markerIconBuildFailed, "markerId=\(markerId) icon: svg export to UIImage failed") return (createFallbackUIImage(), true) } } diff --git a/ios/RNGoogleMapsPlusView.swift b/ios/RNGoogleMapsPlusView.swift index a1e60c0..7a737e3 100644 --- a/ios/RNGoogleMapsPlusView.swift +++ b/ios/RNGoogleMapsPlusView.swift @@ -5,10 +5,11 @@ import NitroModules final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec { + private let mapErrorHandler: MapErrorHandler private let permissionHandler: PermissionHandler private let locationHandler: LocationHandler + private let markerBuilder: MapMarkerBuilder - private let markerBuilder = MapMarkerBuilder() private let polylineBuilder = MapPolylineBuilder() private let polygonBuilder = MapPolygonBuilder() private let circleBuilder = MapCircleBuilder() @@ -24,7 +25,10 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec { override init() { self.permissionHandler = PermissionHandler() self.locationHandler = LocationHandler() + self.mapErrorHandler = MapErrorHandler() + self.markerBuilder = MapMarkerBuilder(mapErrorHandler: mapErrorHandler) self.impl = GoogleMapsViewImpl( + mapErrorHandler: mapErrorHandler, locationHandler: locationHandler, markerBuilder: markerBuilder ) @@ -298,8 +302,8 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec { } } - var onMapError: ((RNMapErrorCode) -> Void)? { - didSet { impl.onMapError = onMapError } + var onMapError: ((RNMapErrorCode, String) -> Void)? { + didSet { mapErrorHandler.callback = onMapError } } var onMapReady: ((Bool) -> Void)? { didSet { impl.onMapReady = onMapReady } diff --git a/ios/extensions/UIImage+Extension.swift b/ios/extensions/UIImage+Extension.swift index 774e689..9536aba 100644 --- a/ios/extensions/UIImage+Extension.swift +++ b/ios/extensions/UIImage+Extension.swift @@ -6,7 +6,8 @@ extension UIImage { format: String = "png", imageFormat: ImageFormat = .png, quality: CGFloat = 1.0, - resultIsFile: Bool = false + resultIsFile: Bool = false, + mapErrorHandler: MapErrorHandler ) -> String? { var imageToEncode = self @@ -35,7 +36,7 @@ extension UIImage { try imageData.write(to: fileURL) return fileURL.path } catch { - mapsLog("snapshot write failed", error) + mapErrorHandler.report(RNMapErrorCode.snapshotExportFailed, "snapshot write failed", error) return nil } } else { diff --git a/src/RNGoogleMapsPlusView.nitro.ts b/src/RNGoogleMapsPlusView.nitro.ts index ef4375f..981cb1e 100644 --- a/src/RNGoogleMapsPlusView.nitro.ts +++ b/src/RNGoogleMapsPlusView.nitro.ts @@ -101,8 +101,8 @@ export interface RNGoogleMapsPlusViewProps extends HybridViewProps { /** Location subsystem config. See {@link RNLocationConfig}. */ locationConfig?: RNLocationConfig; - /** Map SDK error. */ - onMapError?: (error: RNMapErrorCode) => void; + /** Map errors. */ + onMapError?: (error: RNMapErrorCode, msg: string) => void; /** Native map instance created. */ onMapReady?: (ready: boolean) => void; diff --git a/src/types.ts b/src/types.ts index 945aed1..ffd0d0b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -868,24 +868,42 @@ export enum RNLocationErrorCode { /** Error codes related to Google Play Services Maps integration. */ export enum RNMapErrorCode { - /** Google Play Services are missing on the device. */ + /** Play Services not installed (Android). */ PLAY_SERVICES_MISSING = 0, - /** Google Play Services are present but invalid. */ + /** Play Services invalid or corrupted (Android). */ PLAY_SERVICES_INVALID = 1, - /** Google Play Services are disabled on the device. */ + /** Play Services disabled (Android). */ PLAY_SERVICES_DISABLED = 2, - /** Google Play Services are installed, but outdated. */ + /** Play Services version too old (Android). */ PLAY_SERVICES_OUTDATED = 3, - /** A newer version of Google Play Services is available. */ + /** Play Services update available (Android). */ PLAY_SERVICE_UPDATE_AVAILABLE = 4, - /** Google Play Services are currently updating. */ + /** Play Services currently updating (Android). */ PLAY_SERVICE_UPDATING = 5, - /** Unknown error. */ + /** Unknown Play Services error (Android). */ UNKNOWN = 6, + + /** Snapshot encoding or file write failed. */ + SNAPSHOT_EXPORT_FAILED = 7, + + /** Marker icon rendering failed. */ + MARKER_ICON_BUILD_FAILED = 8, + + /** Tile overlay load or parse failed. */ + TILE_OVERLAY_FAILED = 9, + + /** Invalid input provided to native layer. */ + INVALID_ARGUMENT = 10, + + /** Unexpected internal native exception. */ + INTERNAL_EXCEPTION = 11, + + /** KML layer failed to load or parse. */ + KML_LAYER_FAILED = 12, } From 680a67187c860fc211cd8505d115ce2b76fefa4d Mon Sep 17 00:00:00 2001 From: pinpong Date: Wed, 11 Feb 2026 21:29:17 +0700 Subject: [PATCH 2/2] refactor: remove redundant null param --- .../com/rngooglemapsplus/GoogleMapsViewImpl.kt | 2 +- .../com/rngooglemapsplus/MapMarkerBuilder.kt | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt index be049d0..f36f663 100644 --- a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt +++ b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt @@ -754,7 +754,7 @@ class GoogleMapsViewImpl( kmlLayersById[id] = layer layer.addLayerToMap() } catch (_: Exception) { - mapErrorHandler.report(RNMapErrorCode.KML_LAYER_FAILED, "kml layer parse failed: id=$id", null) + mapErrorHandler.report(RNMapErrorCode.KML_LAYER_FAILED, "kml layer parse failed: id=$id") } } diff --git a/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt b/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt index 778c369..0ef9870 100644 --- a/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt +++ b/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt @@ -122,7 +122,7 @@ class MapMarkerBuilder( } } }.onFailure { - mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "external svg resolve failed", null) + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "external svg resolve failed") }.getOrNull() } @@ -146,7 +146,7 @@ class MapMarkerBuilder( try { return Typeface.createFromAsset(assetManager, path) } catch (_: Throwable) { - mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "font resolve failed: $path", null) + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "font resolve failed: $path") } } @@ -293,14 +293,14 @@ class MapMarkerBuilder( onReady(desc) } } catch (_: OutOfMemoryError) { - mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync out of memory", null) + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync out of memory") clearIconCache() withContext(Dispatchers.Main) { ensureActive() onReady(createFallbackDescriptor()) } } catch (_: Throwable) { - mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync failed", null) + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${m.id} buildIconAsync failed") withContext(Dispatchers.Main) { ensureActive() onReady(createFallbackDescriptor()) @@ -344,7 +344,7 @@ class MapMarkerBuilder( .toInt() if (wPx <= 0 || hPx <= 0) { - mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=${markerTag.id} invalid svg size", null) + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=${markerTag.id} invalid svg size") return ImageView(context) } @@ -366,7 +366,7 @@ class MapMarkerBuilder( val drawable = PictureDrawable(svg.renderToPicture()) svgView.setImageDrawable(drawable) } catch (_: Exception) { - mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${markerTag.id} infoWindow: svg render failed", null) + mapErrorHandler.report(RNMapErrorCode.MARKER_ICON_BUILD_FAILED, "markerId=${markerTag.id} infoWindow: svg render failed") return ImageView(context) } @@ -404,7 +404,7 @@ class MapMarkerBuilder( .toInt() if (wPx <= 0 || hPx <= 0) { - mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId invalid svg size", null) + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId invalid svg size") return RenderBitmapResult(createFallbackBitmap(), true) } @@ -417,10 +417,10 @@ class MapMarkerBuilder( documentHeight = hPx.toFloat() } } catch (_: SVGParseException) { - mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg parse failed", null) + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg parse failed") return RenderBitmapResult(createFallbackBitmap(), true) } catch (_: IllegalArgumentException) { - mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg invalid", null) + mapErrorHandler.report(RNMapErrorCode.INVALID_ARGUMENT, "markerId=$markerId icon: svg invalid") return RenderBitmapResult(createFallbackBitmap(), true) }