improve addon activities
This commit is contained in:
@@ -205,6 +205,12 @@
|
|||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:theme="@style/AppTheme" />
|
android:theme="@style/AppTheme" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="eu.weblibre.flutter_mozilla_components.addons.AddonInternalSettingsActivity"
|
||||||
|
android:label="@string/mozac_feature_addons_addons"
|
||||||
|
android:exported="false"
|
||||||
|
android:theme="@style/AppTheme" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="eu.weblibre.flutter_mozilla_components.addons.WebExtensionActionPopupActivity"
|
android:name="eu.weblibre.flutter_mozilla_components.addons.WebExtensionActionPopupActivity"
|
||||||
android:label="@string/mozac_feature_addons_addons"
|
android:label="@string/mozac_feature_addons_addons"
|
||||||
|
|||||||
+105
@@ -0,0 +1,105 @@
|
|||||||
|
/* 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.activity.OnBackPressedCallback
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import eu.weblibre.flutter_mozilla_components.GlobalComponents
|
||||||
|
import eu.weblibre.flutter_mozilla_components.R
|
||||||
|
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
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An activity to show the internal settings of an add-on with [EngineView].
|
||||||
|
*
|
||||||
|
* Used when the addon's manifest specifies `openOptionsPageInTab = false`,
|
||||||
|
* rendering the settings page inside an [AddonPopupBaseFragment] with proper
|
||||||
|
* prompt and download support.
|
||||||
|
*/
|
||||||
|
class AddonInternalSettingsActivity : 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.getParcelableExtra<Addon>("add_on"),
|
||||||
|
)
|
||||||
|
|
||||||
|
title = addon.translateName(this)
|
||||||
|
|
||||||
|
val fragment = AddonInternalSettingsFragment.create(addon)
|
||||||
|
|
||||||
|
supportFragmentManager
|
||||||
|
.beginTransaction()
|
||||||
|
.replace(R.id.addonSettingsContainer, fragment)
|
||||||
|
.commit()
|
||||||
|
|
||||||
|
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
||||||
|
override fun handleOnBackPressed() {
|
||||||
|
if (!fragment.onBackPressed()) {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
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 internal settings of an add-on with [EngineView].
|
||||||
|
*
|
||||||
|
* Creates a fresh engine session and loads the addon's options page URL into it.
|
||||||
|
*/
|
||||||
|
class AddonInternalSettingsFragment : AddonPopupBaseFragment() {
|
||||||
|
|
||||||
|
private val addonSettingsEngineView: EngineView
|
||||||
|
get() = requireView().findViewById<View>(R.id.addonSettingsEngineView) as EngineView
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
initializeSession()
|
||||||
|
return inflater.inflate(R.layout.fragment_add_on_settings, container, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
val optionsPageUrl = arguments?.getParcelableCompat("add_on", Addon::class.java)
|
||||||
|
?.installedState?.optionsPageUrl
|
||||||
|
|
||||||
|
if (optionsPageUrl != null) {
|
||||||
|
engineSession?.let { session ->
|
||||||
|
addonSettingsEngineView.render(session)
|
||||||
|
session.loadUrl(optionsPageUrl)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
activity?.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun create(addon: Addon) = AddonInternalSettingsFragment().apply {
|
||||||
|
arguments = Bundle().apply {
|
||||||
|
putParcelable("add_on", addon)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-1
@@ -137,10 +137,21 @@ class InstalledAddonDetailsActivity : AppCompatActivity() {
|
|||||||
view.isEnabled = shouldSettingsBeVisible(addon)
|
view.isEnabled = shouldSettingsBeVisible(addon)
|
||||||
view.setOnClickListener {
|
view.setOnClickListener {
|
||||||
val optionsPageUrl = addon.installedState?.optionsPageUrl ?: return@setOnClickListener
|
val optionsPageUrl = addon.installedState?.optionsPageUrl ?: return@setOnClickListener
|
||||||
components.useCases.tabsUseCases.addTab(optionsPageUrl, selectTab = true)
|
if (addon.installedState?.openOptionsPageInTab == true) {
|
||||||
|
// Open settings in a browser tab, reusing an existing tab if already open.
|
||||||
|
components.useCases.tabsUseCases.selectOrAddTab(
|
||||||
|
url = optionsPageUrl,
|
||||||
|
ignoreFragment = true,
|
||||||
|
)
|
||||||
val intent = packageManager.getLaunchIntentForPackage(packageName)
|
val intent = packageManager.getLaunchIntentForPackage(packageName)
|
||||||
intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
|
} else {
|
||||||
|
// Open settings in an internal view with proper extension API support.
|
||||||
|
val intent = Intent(this, AddonInternalSettingsActivity::class.java)
|
||||||
|
intent.putExtra("add_on", addon)
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -10,6 +10,7 @@ import android.util.AttributeSet
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import eu.weblibre.flutter_mozilla_components.GlobalComponents
|
import eu.weblibre.flutter_mozilla_components.GlobalComponents
|
||||||
import eu.weblibre.flutter_mozilla_components.R
|
import eu.weblibre.flutter_mozilla_components.R
|
||||||
@@ -37,10 +38,20 @@ class WebExtensionActionPopupActivity : AppCompatActivity() {
|
|||||||
title = it
|
title = it
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val fragment = WebExtensionActionPopupFragment.create(webExtensionId)
|
||||||
|
|
||||||
supportFragmentManager
|
supportFragmentManager
|
||||||
.beginTransaction()
|
.beginTransaction()
|
||||||
.replace(R.id.addonSettingsContainer, WebExtensionActionPopupFragment.create(webExtensionId))
|
.replace(R.id.addonSettingsContainer, fragment)
|
||||||
.commit()
|
.commit()
|
||||||
|
|
||||||
|
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
||||||
|
override fun handleOnBackPressed() {
|
||||||
|
if (!fragment.onBackPressed()) {
|
||||||
|
finishAndRemoveTask()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? =
|
override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? =
|
||||||
|
|||||||
@@ -91,6 +91,12 @@
|
|||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:theme="@style/Theme.AppCompat.Light" />
|
android:theme="@style/Theme.AppCompat.Light" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="eu.weblibre.flutter_mozilla_components.addons.AddonInternalSettingsActivity"
|
||||||
|
android:label="@string/mozac_feature_addons_addons"
|
||||||
|
android:exported="false"
|
||||||
|
android:theme="@style/Theme.AppCompat.Light" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="eu.weblibre.flutter_mozilla_components.addons.WebExtensionActionPopupActivity"
|
android:name="eu.weblibre.flutter_mozilla_components.addons.WebExtensionActionPopupActivity"
|
||||||
android:label="@string/mozac_feature_addons_addons"
|
android:label="@string/mozac_feature_addons_addons"
|
||||||
|
|||||||
Reference in New Issue
Block a user