From c8aaf28be0c0123dd0f7bbb17509d5a0fc88ac8f Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 26 Nov 2025 22:21:06 -0500 Subject: [PATCH 1/2] fix: show error when no app can handle cryptocurrency address LinkAnnotation.Url was silently intercepting clicks and failing when no wallet app was installed. Remove it so our custom handler runs and can show an error message. --- .../donate/cryptocurrency/AddressInfoItem.kt | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/app/grapheneos/info/ui/donate/cryptocurrency/AddressInfoItem.kt b/app/src/main/kotlin/app/grapheneos/info/ui/donate/cryptocurrency/AddressInfoItem.kt index e9e1673..4d1b81f 100644 --- a/app/src/main/kotlin/app/grapheneos/info/ui/donate/cryptocurrency/AddressInfoItem.kt +++ b/app/src/main/kotlin/app/grapheneos/info/ui/donate/cryptocurrency/AddressInfoItem.kt @@ -34,12 +34,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withLink import androidx.compose.ui.unit.dp import androidx.core.app.ActivityOptionsCompat import app.grapheneos.info.R -import app.grapheneos.info.ui.reusablecomposables.ClickableText @Composable fun AddressInfoItem( @@ -95,31 +96,26 @@ fun AddressInfoItem( ) } - val annotatedString = buildAnnotatedString { - pushLink(LinkAnnotation.Url(addressUrl)) - pushStringAnnotation("URL", addressUrl) - pushStyle(SpanStyle(color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Bold)) - - append(address) - - pop() - pop() - pop() + val link = LinkAnnotation.Url( + url = addressUrl, + styles = TextLinkStyles( + style = SpanStyle( + color = MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.Bold + ) + ) + ) { + try { + localUriHandler.openUri(addressUrl) + } catch (e: IllegalArgumentException) { + showSnackbarError(activityNotFoundForDonationAddressSnackbarErrorMessage) + } } - ClickableText( - text = annotatedString, - onClick = { offset -> - annotatedString - .getStringAnnotations("URL", offset, offset).firstOrNull() - ?.let { annotation -> - try { - localUriHandler.openUri(annotation.item) - } catch (e: IllegalArgumentException) { - showSnackbarError(activityNotFoundForDonationAddressSnackbarErrorMessage) - } - } - }, + Text( + buildAnnotatedString { + withLink(link) { append(address) } + } ) IconButton( onClick = { From 398eb4100f669ebd34438cc9baf1e7fc122e66c5 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 26 Nov 2025 22:21:31 -0500 Subject: [PATCH 2/2] style: improve error message grammar for missing wallet app --- app/src/main/res/values/strings.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fb4e569..bd80c6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,9 +107,7 @@ Share OK %1$s (enlarged) - Couldn\'t find an app to open donation address - with! - + No wallet app installed to open this address Cardano can be used to make donations to the non-profit GrapheneOS Foundation. Cardano donation QR code