Bug 1858439 - Refactor how addons icons are loaded #4065

(cherry picked from commit 7172b1e0a9773ccf9bcb92f6c859270438c7eadf)
fenix/120.0
Arturo Mejia 7 months ago committed by mergify[bot]
parent a6735d363a
commit 377f8cac2e

@ -103,7 +103,6 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
runIfFragmentIsAttached {
if (!shouldRefresh) {
adapter = AddonsManagerAdapter(
addonsProvider = requireContext().components.addonsProvider,
addonsManagerDelegate = managementView,
addons = addons,
style = createAddonStyle(requireContext()),

@ -18,7 +18,8 @@ import mozilla.components.browser.state.state.extension.WebExtensionPromptReques
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.webextension.WebExtensionInstallException
import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.toInstalledState
import mozilla.components.feature.addons.AddonManager
import mozilla.components.feature.addons.ui.AddonDialogFragment
import mozilla.components.feature.addons.ui.AddonInstallationDialogFragment
import mozilla.components.feature.addons.ui.PermissionsDialogFragment
import mozilla.components.lib.state.ext.flowScoped
@ -36,6 +37,7 @@ import java.lang.ref.WeakReference
class WebExtensionPromptFeature(
private val store: BrowserStore,
private val context: Context,
private val addonManager: AddonManager = context.components.addonManager,
private val fragmentManager: FragmentManager,
) : LifecycleAwareFeature {
@ -77,19 +79,23 @@ class WebExtensionPromptFeature(
tryToReAttachButtonHandlersToPreviousDialog()
}
private fun handleAfterInstallationRequest(promptRequest: WebExtensionPromptRequest.AfterInstallation) {
val addon = Addon.newFromWebExtension(promptRequest.extension)
@VisibleForTesting
internal fun handleAfterInstallationRequest(promptRequest: WebExtensionPromptRequest.AfterInstallation) {
val installedState = addonManager.toInstalledState(promptRequest.extension)
val addon = Addon.newFromWebExtension(promptRequest.extension, installedState)
when (promptRequest) {
is WebExtensionPromptRequest.AfterInstallation.Permissions.Required -> handleRequiredPermissionRequest(
addon,
promptRequest,
)
is WebExtensionPromptRequest.AfterInstallation.Permissions.Optional -> handleOptionalPermissionsRequest(
addon,
promptRequest,
)
is WebExtensionPromptRequest.AfterInstallation.PostInstallation -> handlePostInstallationRequest(
addon.copy(installedState = promptRequest.extension.toInstalledState()),
addon,
)
}
}
@ -221,18 +227,18 @@ class WebExtensionPromptFeature(
addon = addon,
forOptionalPermissions = forOptionalPermissions,
optionalPermissions = optionalPermissions,
promptsStyling = PermissionsDialogFragment.PromptsStyling(
promptsStyling = AddonDialogFragment.PromptsStyling(
gravity = Gravity.BOTTOM,
shouldWidthMatchParent = true,
positiveButtonBackgroundColor = ThemeManager.resolveAttribute(
confirmButtonBackgroundColor = ThemeManager.resolveAttribute(
R.attr.accent,
context,
),
positiveButtonTextColor = ThemeManager.resolveAttribute(
confirmButtonTextColor = ThemeManager.resolveAttribute(
R.attr.textOnColorPrimary,
context,
),
positiveButtonRadius =
confirmButtonRadius =
(context.resources.getDimensionPixelSize(R.dimen.tab_corner_radius)).toFloat(),
),
onPositiveButtonClicked = { handlePermissions(promptRequest, granted = true) },
@ -320,8 +326,6 @@ class WebExtensionPromptFeature(
private fun showPostInstallationDialog(addon: Addon) {
if (!isInstallationInProgress && !hasExistingAddonPostInstallationDialogFragment()) {
val addonsProvider = context.components.addonsProvider
// Fragment may not be attached to the context anymore during onConfirmButtonClicked handling,
// but we still want to be able to process user selection of the 'allowInPrivateBrowsing' pref.
// This is a best-effort attempt to do so - retain a weak reference to the application context
@ -331,8 +335,7 @@ class WebExtensionPromptFeature(
val dialog = AddonInstallationDialogFragment.newInstance(
addon = addon,
addonsProvider = addonsProvider,
promptsStyling = AddonInstallationDialogFragment.PromptsStyling(
promptsStyling = AddonDialogFragment.PromptsStyling(
gravity = Gravity.BOTTOM,
shouldWidthMatchParent = true,
confirmButtonBackgroundColor = ThemeManager.resolveAttribute(

@ -16,7 +16,6 @@ import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.webextension.WebExtensionInstallException
import mozilla.components.feature.addons.Addon
import mozilla.components.support.ktx.android.content.appVersionName
import mozilla.components.support.test.any
import mozilla.components.support.test.ext.joinBlocking
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule
@ -44,6 +43,7 @@ class WebExtensionPromptFeatureTest {
store = store,
context = testContext,
fragmentManager = mockk(relaxed = true),
addonManager = mockk(relaxed = true),
),
)
}
@ -220,10 +220,10 @@ class WebExtensionPromptFeatureTest {
}
@Test
fun `WHEN PermissionsOptional is dispatched THEN handleOptionalPermissionsRequest is called`() {
fun `WHEN AfterInstallation is dispatched THEN handleAfterInstallationRequest is called`() {
webExtensionPromptFeature.start()
every { webExtensionPromptFeature.handleOptionalPermissionsRequest(any(), any()) } just runs
every { webExtensionPromptFeature.handleAfterInstallationRequest(any()) } returns mockk()
store.dispatch(
UpdatePromptRequestWebExtensionAction(
@ -235,6 +235,16 @@ class WebExtensionPromptFeatureTest {
),
).joinBlocking()
verify { webExtensionPromptFeature.handleAfterInstallationRequest(any()) }
}
@Test
fun `GIVEN Optional Permissions WHEN handleAfterInstallationRequest is called THEN handleOptionalPermissionsRequest is called`() {
webExtensionPromptFeature.start()
val request = mockk<WebExtensionPromptRequest.AfterInstallation.Permissions.Optional>(relaxed = true)
webExtensionPromptFeature.handleAfterInstallationRequest(request)
verify { webExtensionPromptFeature.handleOptionalPermissionsRequest(any(), any()) }
}

Loading…
Cancel
Save