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.ReadabilityExtractFeature
import eu.weblibre.flutter_mozilla_components.feature.WebExtensionToolbarFeature import eu.weblibre.flutter_mozilla_components.feature.WebExtensionToolbarFeature
import eu.weblibre.flutter_mozilla_components.integration.ReaderViewIntegration 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 eu.weblibre.flutter_mozilla_components.services.DownloadService
import io.flutter.Log import io.flutter.Log
import mozilla.components.browser.state.action.TabListAction import mozilla.components.browser.state.action.TabListAction
@@ -307,8 +308,16 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
sessionId = sessionId, sessionId = sessionId,
fragmentManager = parentFragmentManager, fragmentManager = parentFragmentManager,
loadUrlUseCase = components.useCases.sessionUseCases.loadUrl, loadUrlUseCase = components.useCases.sessionUseCases.loadUrl,
launchInApp = { GlobalComponents.shouldOpenLinksInApp() }, launchInApp = {
shouldPrompt = { GlobalComponents.shouldPromptOpenLinksInApp() }, GlobalComponents.shouldOpenLinksInApp(
requireActivity() is ExternalAppBrowserActivity
)
},
shouldPrompt = {
GlobalComponents.shouldPromptOpenLinksInApp(
requireActivity() is ExternalAppBrowserActivity
)
},
alwaysOpenCheckboxAction = { alwaysOpenCheckboxAction = {
GlobalComponents.engineSettingsApi?.setAppLinksMode( GlobalComponents.engineSettingsApi?.setAppLinksMode(
eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS
@@ -333,16 +333,7 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler
} }
override fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
val sessionId = customTabSessionId ?: return super.onBackPressed() 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
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -73,19 +73,19 @@ object GlobalComponents {
// External download manager setting // External download manager setting
var useExternalDownloadManager: Boolean = false var useExternalDownloadManager: Boolean = false
fun shouldOpenLinksInApp(): Boolean { fun shouldOpenLinksInApp(isExternalSession: Boolean = false): Boolean {
return when (engineSettingsApi!!.getAppLinksMode()) { return when (engineSettingsApi!!.getAppLinksMode()) {
eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> true 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.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()) { return when (engineSettingsApi!!.getAppLinksMode()) {
eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> false 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.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.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.activity.addCallback
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import eu.weblibre.flutter_mozilla_components.ExternalAppBrowserFragment import eu.weblibre.flutter_mozilla_components.ExternalAppBrowserFragment
@@ -65,6 +66,17 @@ class ExternalAppBrowserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) 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 val sessionId = customTabSessionId
if (sessionId == null) { if (sessionId == null) {
Log.e(TAG, "No custom tab session ID provided") 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) { override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode) super.onPictureInPictureModeChanged(isInPictureInPictureMode)
val fragment = supportFragmentManager.findFragmentById(R.id.container) val fragment = supportFragmentManager.findFragmentById(R.id.container)