From 9f7637dd064ee6c89869f19c2ac10f6f58860d9a Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Wed, 11 Feb 2026 21:26:53 +0100 Subject: [PATCH] update navigation for external sessions --- .../BaseBrowserFragment.kt | 13 ++++++++++-- .../ExternalAppBrowserFragment.kt | 11 +--------- .../GlobalComponents.kt | 8 +++---- .../activities/ExternalAppBrowserActivity.kt | 21 +++++++++++-------- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/BaseBrowserFragment.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/BaseBrowserFragment.kt index c3eb0601..ec3846f2 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/BaseBrowserFragment.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/BaseBrowserFragment.kt @@ -29,6 +29,7 @@ import eu.weblibre.flutter_mozilla_components.feature.KeyboardVisibilityFeature import eu.weblibre.flutter_mozilla_components.feature.ReadabilityExtractFeature import eu.weblibre.flutter_mozilla_components.feature.WebExtensionToolbarFeature import eu.weblibre.flutter_mozilla_components.integration.ReaderViewIntegration +import eu.weblibre.flutter_mozilla_components.activities.ExternalAppBrowserActivity import eu.weblibre.flutter_mozilla_components.services.DownloadService import io.flutter.Log import mozilla.components.browser.state.action.TabListAction @@ -307,8 +308,16 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit sessionId = sessionId, fragmentManager = parentFragmentManager, loadUrlUseCase = components.useCases.sessionUseCases.loadUrl, - launchInApp = { GlobalComponents.shouldOpenLinksInApp() }, - shouldPrompt = { GlobalComponents.shouldPromptOpenLinksInApp() }, + launchInApp = { + GlobalComponents.shouldOpenLinksInApp( + requireActivity() is ExternalAppBrowserActivity + ) + }, + shouldPrompt = { + GlobalComponents.shouldPromptOpenLinksInApp( + requireActivity() is ExternalAppBrowserActivity + ) + }, alwaysOpenCheckboxAction = { GlobalComponents.engineSettingsApi?.setAppLinksMode( eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/ExternalAppBrowserFragment.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/ExternalAppBrowserFragment.kt index d6e99066..17a57fbe 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/ExternalAppBrowserFragment.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/ExternalAppBrowserFragment.kt @@ -333,16 +333,7 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler } override fun onBackPressed(): Boolean { - val sessionId = customTabSessionId ?: return super.onBackPressed() - - val tab = components.core.store.state.findCustomTab(sessionId) - if (tab?.content?.canGoBack == true) { - components.useCases.sessionUseCases.goBack(sessionId) - return true - } - - requireActivity().finishAndRemoveTask() - return true + return super.onBackPressed() } override fun onDestroyView() { diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/GlobalComponents.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/GlobalComponents.kt index 5e955e3a..49519a6c 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/GlobalComponents.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/GlobalComponents.kt @@ -73,19 +73,19 @@ object GlobalComponents { // External download manager setting var useExternalDownloadManager: Boolean = false - fun shouldOpenLinksInApp(): Boolean { + fun shouldOpenLinksInApp(isExternalSession: Boolean = false): Boolean { return when (engineSettingsApi!!.getAppLinksMode()) { eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> true eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ASK -> true - eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.NEVER -> false + eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.NEVER -> isExternalSession } } - fun shouldPromptOpenLinksInApp(): Boolean { + fun shouldPromptOpenLinksInApp(isExternalSession: Boolean = false): Boolean { return when (engineSettingsApi!!.getAppLinksMode()) { eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> false eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ASK -> true - eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.NEVER -> false + eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.NEVER -> isExternalSession } } diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/activities/ExternalAppBrowserActivity.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/activities/ExternalAppBrowserActivity.kt index 93a8db4d..e49d9e65 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/activities/ExternalAppBrowserActivity.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/activities/ExternalAppBrowserActivity.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import eu.weblibre.flutter_mozilla_components.ExternalAppBrowserFragment @@ -65,6 +66,17 @@ class ExternalAppBrowserActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + onBackPressedDispatcher.addCallback(this) { + val fragment = supportFragmentManager.findFragmentById(R.id.container) + if (fragment is UserInteractionHandler && fragment.onBackPressed()) { + return@addCallback + } + + isEnabled = false + onBackPressedDispatcher.onBackPressed() + isEnabled = true + } + val sessionId = customTabSessionId if (sessionId == null) { Log.e(TAG, "No custom tab session ID provided") @@ -187,15 +199,6 @@ class ExternalAppBrowserActivity : AppCompatActivity() { } } - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - val fragment = supportFragmentManager.findFragmentById(R.id.container) - if (fragment is UserInteractionHandler && fragment.onBackPressed()) { - return - } - super.onBackPressed() - } - override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { super.onPictureInPictureModeChanged(isInPictureInPictureMode) val fragment = supportFragmentManager.findFragmentById(R.id.container)