From 2df39b5e244e9566013a5d0acc8ce9eada52be65 Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Mon, 20 Mar 2023 19:18:41 +0300 Subject: [PATCH] android: catch exceptions while opening a URL (#2034) --- .../simplex/app/views/chatlist/ChatHelpView.kt | 3 ++- .../simplex/app/views/chatlist/ChatListView.kt | 2 +- .../java/chat/simplex/app/views/helpers/Util.kt | 11 ++++++++++- .../simplex/app/views/onboarding/HowItWorks.kt | 2 +- .../simplex/app/views/onboarding/WhatsNewView.kt | 2 +- .../simplex/app/views/usersettings/RTCServers.kt | 2 +- .../app/views/usersettings/SMPServersView.kt | 2 +- .../simplex/app/views/usersettings/SettingsView.kt | 14 +++++++------- 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatHelpView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatHelpView.kt index 7d36074a33..4807241cdd 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatHelpView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatHelpView.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.unit.sp import chat.simplex.app.R import chat.simplex.app.ui.theme.SimpleXTheme import chat.simplex.app.views.helpers.annotatedStringResource +import chat.simplex.app.views.helpers.openUriCatching import chat.simplex.app.views.usersettings.MarkdownHelpView import chat.simplex.app.views.usersettings.simplexTeamUri @@ -36,7 +37,7 @@ fun ChatHelpView(addContact: (() -> Unit)? = null) { Text( annotatedStringResource(R.string.you_can_connect_to_simplex_chat_founder), modifier = Modifier.clickable(onClick = { - uriHandler.openUri(simplexTeamUri) + uriHandler.openUriCatching(simplexTeamUri) }), lineHeight = 22.sp ) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt index 3e6ec6ae84..8f3d7e6851 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListView.kt @@ -132,7 +132,7 @@ private fun OnboardingButtons(openNewChatSheet: () -> Unit) { Column(Modifier.fillMaxSize().padding(DEFAULT_PADDING), horizontalAlignment = Alignment.End, verticalArrangement = Arrangement.Bottom) { val uriHandler = LocalUriHandler.current ConnectButton(generalGetString(R.string.chat_with_developers)) { - uriHandler.openUri(simplexTeamUri) + uriHandler.openUriCatching(simplexTeamUri) } Spacer(Modifier.height(DEFAULT_PADDING)) ConnectButton(generalGetString(R.string.tap_to_start_new_chat), openNewChatSheet) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Util.kt b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Util.kt index 9f089425a3..74eae06e09 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Util.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Util.kt @@ -3,6 +3,7 @@ package chat.simplex.app.views.helpers import android.app.Activity import android.app.Application import android.app.LocaleManager +import android.content.ActivityNotFoundException import android.content.Context import android.content.res.Configuration import android.content.res.Resources @@ -533,4 +534,12 @@ private fun Activity.applyLocale(locale: Locale) { SimplexApp.context.resources.updateConfiguration(appConf, resources.displayMetrics) @Suppress("DEPRECATION") resources.updateConfiguration(activityConf, resources.displayMetrics) -} \ No newline at end of file +} + +fun UriHandler.openUriCatching(uri: String) { + try { + openUri(uri) + } catch (e: ActivityNotFoundException) { + Log.e(TAG, e.stackTraceToString()) + } +} diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/HowItWorks.kt b/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/HowItWorks.kt index a00a7ae65c..3e13b7cf5f 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/HowItWorks.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/HowItWorks.kt @@ -36,7 +36,7 @@ fun HowItWorks(user: User?, onboardingStage: MutableState? = n val uriHandler = LocalUriHandler.current Text( annotatedStringResource(R.string.read_more_in_github_with_link), - modifier = Modifier.padding(bottom = 12.dp).clickable { uriHandler.openUri("https://github.com/simplex-chat/simplex-chat#readme") }, + modifier = Modifier.padding(bottom = 12.dp).clickable { uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat#readme") }, lineHeight = 22.sp ) } else { diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/WhatsNewView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/WhatsNewView.kt index b6c218effd..6f6d3350a4 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/WhatsNewView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/onboarding/WhatsNewView.kt @@ -35,7 +35,7 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) { Icon( Icons.Outlined.OpenInNew, stringResource(titleId), tint = MaterialTheme.colors.primary, modifier = Modifier - .clickable { uriHandler.openUri(link) } + .clickable { uriHandler.openUriCatching(link) } ) } diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/RTCServers.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/RTCServers.kt index fbcd5008e6..31a3dd58e8 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/RTCServers.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/RTCServers.kt @@ -198,7 +198,7 @@ private fun howToButton() { val uriHandler = LocalUriHandler.current Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { uriHandler.openUri("https://github.com/simplex-chat/simplex-chat/blob/stable/docs/WEBRTC.md#configure-mobile-apps") } + modifier = Modifier.clickable { uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat/blob/stable/docs/WEBRTC.md#configure-mobile-apps") } ) { Text(stringResource(R.string.how_to), color = MaterialTheme.colors.primary) Icon( diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SMPServersView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SMPServersView.kt index d8df8db83c..1543e12098 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SMPServersView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SMPServersView.kt @@ -247,7 +247,7 @@ private fun HowToButton() { SettingsActionItem( Icons.Outlined.OpenInNew, stringResource(R.string.how_to_use_your_servers), - { uriHandler.openUri("https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md") }, + { uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md") }, textColor = MaterialTheme.colors.primary, iconColor = MaterialTheme.colors.primary ) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt index a43524daaf..19c2e7cfcc 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt @@ -173,9 +173,9 @@ fun SettingsLayout( SectionDivider() SettingsActionItem(Icons.Outlined.Info, stringResource(R.string.about_simplex_chat), showModal { SimpleXInfo(it, onboarding = false) }) SectionDivider() - SettingsActionItem(Icons.Outlined.Tag, stringResource(R.string.chat_with_the_founder), { uriHandler.openUri(simplexTeamUri) }, textColor = MaterialTheme.colors.primary, disabled = stopped) + SettingsActionItem(Icons.Outlined.Tag, stringResource(R.string.chat_with_the_founder), { uriHandler.openUriCatching(simplexTeamUri) }, textColor = MaterialTheme.colors.primary, disabled = stopped) SectionDivider() - SettingsActionItem(Icons.Outlined.Email, stringResource(R.string.send_us_an_email), { uriHandler.openUri("mailto:chat@simplex.chat") }, textColor = MaterialTheme.colors.primary) + SettingsActionItem(Icons.Outlined.Email, stringResource(R.string.send_us_an_email), { uriHandler.openUriCatching("mailto:chat@simplex.chat") }, textColor = MaterialTheme.colors.primary) } SectionSpacer() @@ -313,7 +313,7 @@ fun MaintainIncognitoState(chatModel: ChatModel) { } @Composable private fun ContributeItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUri("https://github.com/simplex-chat/simplex-chat#contribute") }) { + SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat#contribute") }) { Icon( Icons.Outlined.Keyboard, contentDescription = "GitHub", @@ -326,8 +326,8 @@ fun MaintainIncognitoState(chatModel: ChatModel) { @Composable private fun RateAppItem(uriHandler: UriHandler) { SectionItemView({ - runCatching { uriHandler.openUri("market://details?id=chat.simplex.app") } - .onFailure { uriHandler.openUri("https://play.google.com/store/apps/details?id=chat.simplex.app") } + runCatching { uriHandler.openUriCatching("market://details?id=chat.simplex.app") } + .onFailure { uriHandler.openUriCatching("https://play.google.com/store/apps/details?id=chat.simplex.app") } } ) { Icon( @@ -341,7 +341,7 @@ fun MaintainIncognitoState(chatModel: ChatModel) { } @Composable private fun StarOnGithubItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUri("https://github.com/simplex-chat/simplex-chat") }) { + SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) { Icon( painter = painterResource(id = R.drawable.ic_github), contentDescription = "GitHub", @@ -365,7 +365,7 @@ fun MaintainIncognitoState(chatModel: ChatModel) { } @Composable private fun InstallTerminalAppItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUri("https://github.com/simplex-chat/simplex-chat") }) { + SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) { Icon( painter = painterResource(id = R.drawable.ic_github), contentDescription = "GitHub",