update navigation for external sessions

This commit is contained in:
Fabian Freund
2026-02-11 21:26:53 +01:00
parent acb3789b07
commit 9f7637dd06
4 changed files with 28 additions and 25 deletions
@@ -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
@@ -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() {
@@ -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
}
}
@@ -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)