support for external download managers

This commit is contained in:
Fabian Freund
2026-02-04 07:46:50 +01:00
parent c8179c585e
commit 28907a62a7
15 changed files with 584 additions and 2 deletions
@@ -287,6 +287,9 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
onNeedToRequestPermissions = { permissions ->
requestDownloadPermissionsLauncher.launch(permissions)
},
shouldForwardToThirdParties = {
GlobalComponents.useExternalDownloadManager
},
),
owner = this,
view = view,
@@ -57,6 +57,9 @@ object GlobalComponents {
// Engine settings API for managing engine-specific settings
var engineSettingsApi: GeckoEngineSettingsApiImpl? = null
// External download manager setting
var useExternalDownloadManager: Boolean = false
fun shouldOpenLinksInApp(): Boolean {
return when (engineSettingsApi!!.getAppLinksMode()) {
eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> true
@@ -350,4 +350,12 @@ class GeckoEngineSettingsApiImpl : GeckoEngineSettingsApi {
else -> AppLinksMode.ASK
}
}
override fun setUseExternalDownloadManager(enabled: Boolean) {
GlobalComponents.useExternalDownloadManager = enabled
}
override fun getUseExternalDownloadManager(): Boolean {
return GlobalComponents.useExternalDownloadManager
}
}
@@ -3850,6 +3850,12 @@ interface GeckoEngineSettingsApi {
*/
fun setAppLinksMode(mode: AppLinksMode)
fun getAppLinksMode(): AppLinksMode
/**
* Sets whether to use external download managers for downloads.
* When enabled, downloads are forwarded to third-party apps like ADM, 1DM, AB DM.
*/
fun setUseExternalDownloadManager(enabled: Boolean)
fun getUseExternalDownloadManager(): Boolean
companion object {
/** The codec used by GeckoEngineSettingsApi. */
@@ -3947,6 +3953,39 @@ interface GeckoEngineSettingsApi {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setUseExternalDownloadManager$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val enabledArg = args[0] as Boolean
val wrapped: List<Any?> = try {
api.setUseExternalDownloadManager(enabledArg)
listOf(null)
} catch (exception: Throwable) {
GeckoPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.getUseExternalDownloadManager$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
listOf(api.getUseExternalDownloadManager())
} catch (exception: Throwable) {
GeckoPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
}
}
}