From b1f5da87da2e2b7629bfc2f61ee48de70f3982e0 Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Wed, 17 Dec 2025 18:21:34 +0200 Subject: [PATCH 1/2] Fix crash in custom tab when trying to open url in ddg app and no activity is found to handle the intent --- .../java/com/duckduckgo/app/browser/BrowserTabFragment.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 7832aa2c72b1..7d591b6af47c 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -1465,7 +1465,12 @@ class BrowserTabFragment : Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) } - startActivity(intent) + + if (requireActivity().packageManager.resolveActivity(intent, 0) != null) { + startActivity(intent) + } else { + showToast(R.string.unableToOpenLink) + } } private fun launchPopupMenu( From 7ed165050ea39e8f51da5c37d31d0944f88b978c Mon Sep 17 00:00:00 2001 From: catalinradoiu Date: Wed, 17 Dec 2025 19:07:37 +0200 Subject: [PATCH 2/2] Check if intent package is null before returning the unknown type for intent urls --- .../com/duckduckgo/app/browser/SpecialUrlDetector.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/SpecialUrlDetector.kt b/app/src/main/java/com/duckduckgo/app/browser/SpecialUrlDetector.kt index d778f0c81bc4..0ad813755928 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/SpecialUrlDetector.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/SpecialUrlDetector.kt @@ -61,6 +61,7 @@ class SpecialUrlDetectorImpl( ): UrlType { val uriString = uri.toString() + logcat(tag = "RadoiuC") { "Uri: $uri scheme: ${uri.scheme}" } return when (val scheme = uri.scheme) { TEL_SCHEME -> buildTelephone(uriString) TELPROMPT_SCHEME -> buildTelephonePrompt(uriString) @@ -91,7 +92,9 @@ class SpecialUrlDetectorImpl( } // if there's no redirects (initiatingUrl = null) then it's user initiated val userInitiated = initiatingUrl == null - checkForIntent(scheme, uriString, intentFlags, userInitiated) + checkForIntent(scheme, uriString, intentFlags, userInitiated).also { + logcat(tag = "RadoiuC") { "Check for intent result: $it" } + } } } } @@ -206,7 +209,7 @@ class SpecialUrlDetectorImpl( return try { val intent = Intent.parseUri(uriString, intentFlags) // only proceed if something can handle it - if (userInitiated && (intent == null || packageManager.resolveActivity(intent, 0) == null) && + if (userInitiated && invalidIntentWithNoPackage(intent) && androidBrowserConfigFeature.validateIntentResolution().isEnabled() ) { return UrlType.Unknown(uriString) @@ -234,6 +237,9 @@ class SpecialUrlDetectorImpl( return UrlType.SearchQuery(uriString) } + private fun invalidIntentWithNoPackage(intent: Intent?) = intent == null || + (packageManager.resolveActivity(intent, 0) == null && intent.`package` == null) + private fun buildFallbackIntent(fallbackUrl: String?): Intent? { if (determineType(fallbackUrl) is UrlType.NonHttpAppLink) { return Intent.parseUri(fallbackUrl, URI_ANDROID_APP_SCHEME)