From 8a240f1da243bcc58ef1700795cbf7a9d46bebad Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 18 Jul 2025 17:19:28 -0300 Subject: [PATCH] Don't crash for ActivityNotFoundException --- .../main/java/org/fdroid/basic/ui/Utils.kt | 21 +++++++++++++++++++ .../java/org/fdroid/basic/ui/main/About.kt | 5 +++-- .../basic/ui/main/details/AppDetailsHeader.kt | 3 ++- .../basic/ui/main/details/AppDetailsLink.kt | 3 ++- .../ui/main/details/AppDetailsTopAppBar.kt | 3 ++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/basic/src/main/java/org/fdroid/basic/ui/Utils.kt b/basic/src/main/java/org/fdroid/basic/ui/Utils.kt index 2e0f56645..109c68aa2 100644 --- a/basic/src/main/java/org/fdroid/basic/ui/Utils.kt +++ b/basic/src/main/java/org/fdroid/basic/ui/Utils.kt @@ -1,6 +1,10 @@ package org.fdroid.basic.ui +import android.content.Context +import android.content.Intent import android.text.format.DateUtils +import android.util.Log +import androidx.compose.ui.platform.UriHandler import org.fdroid.index.v2.PackageManifest import org.fdroid.index.v2.PackageVersion import org.fdroid.index.v2.SignerV2 @@ -8,6 +12,23 @@ import java.security.MessageDigest import java.security.NoSuchAlgorithmException import java.util.concurrent.TimeUnit +fun Context.startActivitySafe(i: Intent?) { + if (i == null) return + try { + startActivity(i) + } catch (e: Exception) { + Log.e("Context", "Error opening $i ", e) + } +} + +fun UriHandler.openUriSafe(uri: String) { + try { + openUri(uri) + } catch (e: Exception) { + Log.e("UriHandler", "Error opening $uri ", e) + } +} + fun getPreviewVersion(versionName: String, size: Long? = null) = object : PackageVersion { override val versionCode: Long = 23 override val versionName: String = versionName diff --git a/basic/src/main/java/org/fdroid/basic/ui/main/About.kt b/basic/src/main/java/org/fdroid/basic/ui/main/About.kt index 5b03e7890..60ee5fc20 100644 --- a/basic/src/main/java/org/fdroid/basic/ui/main/About.kt +++ b/basic/src/main/java/org/fdroid/basic/ui/main/About.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.fdroid.basic.BuildConfig.VERSION_NAME import org.fdroid.basic.R +import org.fdroid.basic.ui.openUriSafe import org.fdroid.fdroid.ui.theme.FDroidContent @Composable @@ -78,7 +79,7 @@ fun About(onBackClicked: () -> Unit) { color = MaterialTheme.colorScheme.secondary, modifier = Modifier .padding(top = 4.dp) - .clickable { uriHandler.openUri("https://f-droid.org") } + .clickable { uriHandler.openUriSafe("https://f-droid.org") } ) Text( text = "Gitlab", @@ -86,7 +87,7 @@ fun About(onBackClicked: () -> Unit) { color = MaterialTheme.colorScheme.secondary, modifier = Modifier .padding(top = 4.dp) - .clickable { uriHandler.openUri("https://gitlab.com/fdroid") } + .clickable { uriHandler.openUriSafe("https://gitlab.com/fdroid") } ) } Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars)) diff --git a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsHeader.kt b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsHeader.kt index 40863c5c7..1e10a782b 100644 --- a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsHeader.kt +++ b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsHeader.kt @@ -44,6 +44,7 @@ import org.fdroid.basic.details.AppDetailsItem import org.fdroid.basic.details.MainButtonState import org.fdroid.basic.details.testApp import org.fdroid.basic.ui.asRelativeTimeString +import org.fdroid.basic.ui.startActivitySafe import org.fdroid.fdroid.ui.theme.FDroidContent @Composable @@ -158,7 +159,7 @@ fun AppDetailsHeader( val context = LocalContext.current OutlinedButton( onClick = { - context.startActivity(item.actions.launchIntent) + context.startActivitySafe(item.actions.launchIntent) }, modifier = Modifier.weight(1f) ) { diff --git a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsLink.kt b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsLink.kt index 9e1aaf822..07f55e505 100644 --- a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsLink.kt +++ b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsLink.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch +import org.fdroid.basic.ui.openUriSafe @Composable fun AppDetailsLink(icon: ImageVector, title: String, url: String, modifier: Modifier = Modifier) { @@ -34,7 +35,7 @@ fun AppDetailsLink(icon: ImageVector, title: String, url: String, modifier: Modi .heightIn(min = 48.dp) .fillMaxWidth() .combinedClickable( - onClick = { uriHandler.openUri(url) }, + onClick = { uriHandler.openUriSafe(url) }, onLongClick = { haptics.performHapticFeedback(HapticFeedbackType.LongPress) val entry = ClipEntry(ClipData.newPlainText("", url)) diff --git a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsTopAppBar.kt b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsTopAppBar.kt index b7052a146..7b9d9b595 100644 --- a/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsTopAppBar.kt +++ b/basic/src/main/java/org/fdroid/basic/ui/main/details/AppDetailsTopAppBar.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import org.fdroid.basic.R import org.fdroid.basic.details.AppDetailsItem +import org.fdroid.basic.ui.startActivitySafe @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -52,7 +53,7 @@ fun AppDetailsTopAppBar( actions = { val context = LocalContext.current item.actions.shareIntent?.let { shareIntent -> - IconButton(onClick = { context.startActivity(shareIntent) }) { + IconButton(onClick = { context.startActivitySafe(shareIntent) }) { Icon( imageVector = Icons.Filled.Share, contentDescription = stringResource(R.string.menu_share),