From 2052c40b2b8914cd0965c80bc504c86766d20443 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Wed, 18 Mar 2026 23:32:33 -1000 Subject: fix: rasterize anchor icon vector drawable to prevent startup crash BitmapFactory.decodeResource returns null for XML vector drawables. Passing null to MapLibre's style.addImage caused a NPE that propagated through JNI as PendingJavaException, crashing the app on every launch. Fix uses ContextCompat.getDrawable + Canvas rasterization, matching the pattern already used in setupTidalCurrentMapLayers. Also upgrades MapLibre Android SDK from 11.5.1 to 13.0.1. Co-Authored-By: Claude Sonnet 4.6 --- android-app/app/build.gradle | 2 +- .../app/src/main/kotlin/org/terst/nav/MainActivity.kt | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'android-app/app') diff --git a/android-app/app/build.gradle b/android-app/app/build.gradle index 0d5703d..7e5ab0f 100644 --- a/android-app/app/build.gradle +++ b/android-app/app/build.gradle @@ -88,7 +88,7 @@ dependencies { implementation 'com.google.android.gms:play-services-location:21.2.0' // Map - implementation 'org.maplibre.gl:android-sdk:11.5.1' + implementation 'org.maplibre.gl:android-sdk:13.0.1' // Testing testImplementation 'junit:junit:4.13.2' diff --git a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt index a3eebfc..79758f0 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt @@ -475,8 +475,18 @@ class MainActivity : AppCompatActivity() { private fun setupAnchorMapLayers(style: Style) { - // Add anchor icon - style.addImage(ANCHOR_ICON_ID, BitmapFactory.decodeResource(resources, R.drawable.ic_anchor)) + // Add anchor icon (rasterise vector drawable — BitmapFactory returns null for VDs) + val anchorDrawable = ContextCompat.getDrawable(this, R.drawable.ic_anchor) ?: return + val anchorBitmap = Bitmap.createBitmap( + anchorDrawable.intrinsicWidth.coerceAtLeast(24), + anchorDrawable.intrinsicHeight.coerceAtLeast(24), + Bitmap.Config.ARGB_8888 + ) + Canvas(anchorBitmap).also { canvas -> + anchorDrawable.setBounds(0, 0, canvas.width, canvas.height) + anchorDrawable.draw(canvas) + } + style.addImage(ANCHOR_ICON_ID, anchorBitmap) // Create sources anchorPointSource = GeoJsonSource(ANCHOR_POINT_SOURCE_ID) -- cgit v1.2.3