From 389d4413fe2104ef41196e50894d09bdde36caf2 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Mon, 29 Jun 2026 12:00:01 -0400 Subject: [PATCH] fix: catch ActivityNotFoundException when opening email app Devices without a default email app crash when the user taps 'Open Mail' during email verification. Catches the exception and shows a toast instead. Fixes Bugsnag 6a3f422fd7a912dd24962554 Signed-off-by: Brandon McAnsh --- .../com/flipcash/app/core/android/IntentUtils.kt | 4 ++-- apps/flipcash/core/src/main/res/values/strings.xml | 3 ++- .../verification/email/EmailMagicLinkScreen.kt | 14 +++++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/android/IntentUtils.kt b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/android/IntentUtils.kt index df54d80a4..d405fbbe7 100644 --- a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/android/IntentUtils.kt +++ b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/android/IntentUtils.kt @@ -24,7 +24,7 @@ object IntentUtils { fun tweet(message: String) = Intent(Intent.ACTION_VIEW).apply { val url = Linkify.tweet(message) - setData(url.toUri()) + data = url.toUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK } @@ -57,7 +57,7 @@ object IntentUtils { } fun appStoreListing(packageName: String) = Intent(Intent.ACTION_VIEW).apply { - setData(Uri.parse("https://play.google.com/store/apps/details?id=$packageName")) + data = "https://play.google.com/store/apps/details?id=$packageName".toUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK } diff --git a/apps/flipcash/core/src/main/res/values/strings.xml b/apps/flipcash/core/src/main/res/values/strings.xml index 6c02ab334..6ef05b575 100644 --- a/apps/flipcash/core/src/main/res/values/strings.xml +++ b/apps/flipcash/core/src/main/res/values/strings.xml @@ -367,10 +367,11 @@ Verify Your Phone Number And Email To Continue This will allow you to add funds from your debit card - " Email Open Mail + No email app found on this device + Please install an email app to receive your verification email Check your inbox Tap the link we sent to Didn\'t get an email? diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt index 8b1a8de36..e992600e1 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt @@ -12,11 +12,15 @@ import com.flipcash.app.analytics.Analytics import com.flipcash.app.analytics.rememberAnalytics import com.flipcash.app.contact.verification.internal.email.EmailMagicLinkScreen import com.flipcash.app.contact.verification.internal.email.EmailVerificationViewModel +import android.content.ActivityNotFoundException +import android.widget.Toast +import androidx.compose.ui.platform.LocalResources import com.flipcash.app.core.android.IntentUtils import com.flipcash.app.core.verification.VerificationResult import com.flipcash.app.core.verification.VerificationStep import com.flipcash.app.core.verification.email.EmailDeeplinkOrigin import com.flipcash.features.contact.verification.R +import com.getcode.manager.BottomBarManager import com.getcode.navigation.flow.flowSharedViewModel import com.getcode.navigation.flow.rememberFlowNavigator import com.getcode.ui.components.AppBarWithTitle @@ -59,12 +63,20 @@ fun EmailMagicLinkContent( viewModel.dispatchEvent(EmailVerificationViewModel.Event.OnDataProvided(email, code)) } + val resources = LocalResources.current val context = LocalContext.current LaunchedEffect(viewModel) { viewModel.eventFlow .filterIsInstance() .onEach { - context.startActivity(IntentUtils.emailApp()) + try { + context.startActivity(IntentUtils.emailApp()) + } catch (_: ActivityNotFoundException) { + BottomBarManager.showError( + title = resources.getString(R.string.error_title_noEmailAppFound), + message = resources.getString(R.string.error_description_noEmailAppFound), + ) + } }.launchIn(this) }