From 38332b346e8dd87ce17aad3101952dfbf8d50bda Mon Sep 17 00:00:00 2001
From: James Rich <2199651+jamesarich@users.noreply.github.com>
Date: Mon, 29 Sep 2025 15:55:08 -0500
Subject: [PATCH] fix(ui): handle ActivityNotFoundException when opening
firmware links (#3245)
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
---
.../com/geeksville/mesh/ui/node/NodeDetail.kt | 21 +++++++++++++++----
core/strings/src/main/res/values/strings.xml | 1 +
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
index d0ae1f6e6..864822a69 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
@@ -17,7 +17,9 @@
package com.geeksville.mesh.ui.node
+import android.content.ActivityNotFoundException
import android.content.Intent
+import android.widget.Toast
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.background
@@ -167,6 +169,7 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
import org.meshtastic.core.ui.theme.StatusColors.StatusOrange
import org.meshtastic.core.ui.theme.StatusColors.StatusRed
import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
+import timber.log.Timber
private data class VectorMetricInfo(
@StringRes val label: Int,
@@ -595,8 +598,13 @@ private fun FirmwareReleaseSheetContent(firmwareRelease: FirmwareRelease) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
Button(
onClick = {
- val intent = Intent(Intent.ACTION_VIEW, firmwareRelease.pageUrl.toUri())
- context.startActivity(intent)
+ try {
+ val intent = Intent(Intent.ACTION_VIEW, firmwareRelease.pageUrl.toUri())
+ context.startActivity(intent)
+ } catch (e: ActivityNotFoundException) {
+ Toast.makeText(context, R.string.error_no_app_to_handle_link, Toast.LENGTH_LONG).show()
+ Timber.e(e)
+ }
},
modifier = Modifier.weight(1f),
) {
@@ -606,8 +614,13 @@ private fun FirmwareReleaseSheetContent(firmwareRelease: FirmwareRelease) {
}
Button(
onClick = {
- val intent = Intent(Intent.ACTION_VIEW, firmwareRelease.zipUrl.toUri())
- context.startActivity(intent)
+ try {
+ val intent = Intent(Intent.ACTION_VIEW, firmwareRelease.zipUrl.toUri())
+ context.startActivity(intent)
+ } catch (e: ActivityNotFoundException) {
+ Toast.makeText(context, R.string.error_no_app_to_handle_link, Toast.LENGTH_LONG).show()
+ Timber.e(e)
+ }
},
modifier = Modifier.weight(1f),
) {
diff --git a/core/strings/src/main/res/values/strings.xml b/core/strings/src/main/res/values/strings.xml
index 38b0d30d4..cbbe4a4bd 100644
--- a/core/strings/src/main/res/values/strings.xml
+++ b/core/strings/src/main/res/values/strings.xml
@@ -922,4 +922,5 @@
48 Hours
Filter by Last Heard time: %s
%1$d dBm
+ No application available to handle link.