diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
index 24d5a69d..ee68f21f 100644
--- a/app/android/app/src/main/AndroidManifest.xml
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -172,17 +172,6 @@
android:exported="false"
android:theme="@style/AppTheme" />
-
-
-
-
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 87ef53db..7668220b 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
@@ -22,7 +22,6 @@ import androidx.annotation.CallSuper
import androidx.core.content.edit
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
-import eu.weblibre.flutter_mozilla_components.addons.WebExtensionActionPopupActivity
import eu.weblibre.flutter_mozilla_components.addons.WebExtensionPromptFeature
import eu.weblibre.flutter_mozilla_components.databinding.FragmentBrowserBinding
import eu.weblibre.flutter_mozilla_components.ext.getPreferenceKey
@@ -32,7 +31,12 @@ import eu.weblibre.flutter_mozilla_components.feature.WebExtensionToolbarFeature
import eu.weblibre.flutter_mozilla_components.integration.ReaderViewIntegration
import eu.weblibre.flutter_mozilla_components.services.DownloadService
import io.flutter.Log
+import mozilla.components.browser.state.action.TabListAction
+import mozilla.components.browser.state.action.WebExtensionAction
+import mozilla.components.browser.state.state.EngineState
+import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.WebExtensionState
+import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.thumbnails.BrowserThumbnails
import mozilla.components.concept.engine.EngineView
import mozilla.components.feature.app.links.AppLinksFeature
@@ -499,14 +503,16 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
}
private fun openPopup(webExtensionState: WebExtensionState) {
- val intent = Intent(
- components.profileApplicationContext,
- WebExtensionActionPopupActivity::class.java
+ val store = components.core.store
+ val popupSession = store.state.extensions[webExtensionState.id]?.popupSession ?: return
+
+ val tab = createTab(url = "", source = SessionState.Source.Internal.None)
+ .copy(engineState = EngineState(popupSession))
+ store.dispatch(TabListAction.AddTabAction(tab, select = true))
+
+ store.dispatch(
+ WebExtensionAction.UpdatePopupSessionAction(webExtensionState.id, popupSession = null)
)
- intent.putExtra("web_extension_id", webExtensionState.id)
- intent.putExtra("web_extension_name", webExtensionState.name)
- intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
- startActivity(intent)
}
@CallSuper
diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/AddonSettingsActivity.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/AddonSettingsActivity.kt
deleted file mode 100644
index 795f7d32..00000000
--- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/AddonSettingsActivity.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package eu.weblibre.flutter_mozilla_components.addons
-
-import android.content.Context
-import android.os.Bundle
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
-import androidx.fragment.app.Fragment
-import eu.weblibre.flutter_mozilla_components.Components
-import eu.weblibre.flutter_mozilla_components.GlobalComponents
-import mozilla.components.concept.engine.EngineSession
-import mozilla.components.concept.engine.EngineView
-import mozilla.components.feature.addons.Addon
-import mozilla.components.feature.addons.ui.translateName
-import mozilla.components.support.utils.ext.getParcelableCompat
-import mozilla.components.support.utils.ext.getParcelableExtraCompat
-import eu.weblibre.flutter_mozilla_components.R
-
-/**
- * An activity to show the settings of an add-on.
- */
-class AddonSettingsActivity : AppCompatActivity() {
- private val components by lazy {
- requireNotNull(GlobalComponents.components) { "Components not initialized" }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_add_on_settings)
-
- val addon = requireNotNull(
- intent.getParcelableExtraCompat("add_on", Addon::class.java),
- )
-
- title = addon.translateName(this)
-
- supportFragmentManager
- .beginTransaction()
- .replace(R.id.addonSettingsContainer, AddonSettingsFragment.create(addon))
- .commit()
- }
-
- override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? =
- when (name) {
- EngineView::class.java.name -> components.core.engine.createView(context, attrs).asView()
- else -> super.onCreateView(parent, name, context, attrs)
- }
-
- /**
- * A fragment to show the settings of an add-on with [EngineView].
- */
- class AddonSettingsFragment : Fragment() {
- private val components by lazy {
- requireNotNull(GlobalComponents.components) { "Components not initialized" }
- }
-
- private lateinit var optionsPageUrl: String
- private lateinit var engineSession: EngineSession
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- optionsPageUrl = requireNotNull(
- arguments?.getParcelableCompat(
- "add_on",
- Addon::class.java,
- )?.installedState?.optionsPageUrl,
- )
-
- engineSession = components.core.engine.createSession()
-
- return inflater.inflate(R.layout.fragment_add_on_settings, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- val addonSettingsEngineView = view.findViewById(R.id.addonSettingsEngineView) as EngineView
- addonSettingsEngineView.render(engineSession)
- engineSession.loadUrl(optionsPageUrl)
- }
-
- override fun onDestroyView() {
- engineSession.close()
- super.onDestroyView()
- }
-
- companion object {
- /**
- * Create an [AddonSettingsFragment] with add_on as a required parameter.
- */
- fun create(addon: Addon) = AddonSettingsFragment().apply {
- arguments = Bundle().apply {
- putParcelable("add_on", addon)
- }
- }
- }
- }
-}
diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/InstalledAddonDetailsActivity.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/InstalledAddonDetailsActivity.kt
index b850b29a..2181c91b 100644
--- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/InstalledAddonDetailsActivity.kt
+++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/InstalledAddonDetailsActivity.kt
@@ -136,9 +136,11 @@ class InstalledAddonDetailsActivity : AppCompatActivity() {
view.isVisible = shouldSettingsBeVisible(addon)
view.isEnabled = shouldSettingsBeVisible(addon)
view.setOnClickListener {
- val intent = Intent(this, AddonSettingsActivity::class.java)
- intent.putExtra("add_on", addon)
- this.startActivity(intent)
+ val optionsPageUrl = addon.installedState?.optionsPageUrl ?: return@setOnClickListener
+ components.useCases.tabsUseCases.addTab(optionsPageUrl, selectTab = true)
+ val intent = packageManager.getLaunchIntentForPackage(packageName)
+ intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
+ startActivity(intent)
}
}
diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/WebExtensionActionPopupActivity.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/WebExtensionActionPopupActivity.kt
deleted file mode 100644
index 73ff3375..00000000
--- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/addons/WebExtensionActionPopupActivity.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package eu.weblibre.flutter_mozilla_components.addons
-
-import android.content.Context
-import android.os.Bundle
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
-import androidx.fragment.app.Fragment
-import eu.weblibre.flutter_mozilla_components.Components
-import eu.weblibre.flutter_mozilla_components.GlobalComponents
-import mozilla.components.browser.state.action.WebExtensionAction
-import mozilla.components.concept.engine.EngineSession
-import mozilla.components.concept.engine.EngineView
-import mozilla.components.concept.engine.window.WindowRequest
-import mozilla.components.lib.state.ext.consumeFrom
-import eu.weblibre.flutter_mozilla_components.R
-
-/**
- * An activity to show the pop up action of a web extension.
- */
-class WebExtensionActionPopupActivity : AppCompatActivity() {
- private val components by lazy {
- requireNotNull(GlobalComponents.components) { "Components not initialized" }
- }
-
- private lateinit var webExtensionId: String
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_add_on_settings)
-
- webExtensionId = requireNotNull(intent.getStringExtra("web_extension_id"))
- intent.getStringExtra("web_extension_name")?.let {
- title = it
- }
-
- supportFragmentManager
- .beginTransaction()
- .replace(R.id.addonSettingsContainer, WebExtensionActionPopupFragment.create(webExtensionId))
- .commit()
- }
-
- override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? =
- when (name) {
- EngineView::class.java.name -> components.core.engine.createView(context, attrs).asView()
- else -> super.onCreateView(parent, name, context, attrs)
- }
-
- /**
- * A fragment to show the web extension action popup with [EngineView].
- */
- class WebExtensionActionPopupFragment : Fragment(), EngineSession.Observer {
- private val components by lazy {
- requireNotNull(GlobalComponents.components) { "Components not initialized" }
- }
-
- private var engineSession: EngineSession? = null
- private lateinit var webExtensionId: String
-
- private val addonSettingsEngineView: EngineView
- get() = requireView().findViewById(R.id.addonSettingsEngineView) as EngineView
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- webExtensionId = requireNotNull(arguments?.getString("web_extension_id"))
- engineSession = components.core.store.state.extensions[webExtensionId]?.popupSession
-
- return inflater.inflate(R.layout.fragment_add_on_settings, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- val session = engineSession
- if (session != null) {
- addonSettingsEngineView.render(session)
- consumePopupSession()
- } else {
- consumeFrom(components.core.store) { state ->
- state.extensions[webExtensionId]?.let { extState ->
- extState.popupSession?.let {
- if (engineSession == null) {
- addonSettingsEngineView.render(it)
- consumePopupSession()
- engineSession = it
- }
- }
- }
- }
- }
- }
-
- override fun onStart() {
- super.onStart()
- engineSession?.register(this)
- }
-
- override fun onStop() {
- super.onStop()
- engineSession?.unregister(this)
- }
-
- override fun onWindowRequest(windowRequest: WindowRequest) {
- if (windowRequest.type == WindowRequest.Type.CLOSE) {
- activity?.onBackPressedDispatcher?.onBackPressed()
- }
- }
-
- private fun consumePopupSession() {
- components.core.store.dispatch(
- WebExtensionAction.UpdatePopupSessionAction(webExtensionId, popupSession = null),
- )
- }
-
- companion object {
- /**
- * Create an [WebExtensionActionPopupFragment] with webExtensionId as a required parameter.
- */
- fun create(webExtensionId: String) = WebExtensionActionPopupFragment().apply {
- arguments = Bundle().apply {
- putString("web_extension_id", webExtensionId)
- }
- }
- }
- }
-}
diff --git a/packages/flutter_mozilla_components/android/src/main/res/layout/activity_add_on_settings.xml b/packages/flutter_mozilla_components/android/src/main/res/layout/activity_add_on_settings.xml
deleted file mode 100644
index f6d26ec8..00000000
--- a/packages/flutter_mozilla_components/android/src/main/res/layout/activity_add_on_settings.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/packages/flutter_mozilla_components/android/src/main/res/layout/fragment_add_on_settings.xml b/packages/flutter_mozilla_components/android/src/main/res/layout/fragment_add_on_settings.xml
deleted file mode 100644
index 6f5546b3..00000000
--- a/packages/flutter_mozilla_components/android/src/main/res/layout/fragment_add_on_settings.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/packages/flutter_mozilla_components/example/android/app/src/main/AndroidManifest.xml b/packages/flutter_mozilla_components/example/android/app/src/main/AndroidManifest.xml
index 8d3e74ce..c6a67197 100644
--- a/packages/flutter_mozilla_components/example/android/app/src/main/AndroidManifest.xml
+++ b/packages/flutter_mozilla_components/example/android/app/src/main/AndroidManifest.xml
@@ -91,17 +91,6 @@
android:exported="false"
android:theme="@style/Theme.AppCompat.Light" />
-
-
-
-