Bug 1845823 - Display a better error message when a user installs a blocklisted add-on

fenix/118.0
William Durand 11 months ago committed by mergify[bot]
parent 1d89adb5da
commit db9cd91347

@ -22,6 +22,7 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import mozilla.components.concept.engine.webextension.WebExtensionInstallException
import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManager
import mozilla.components.feature.addons.AddonManagerException
import mozilla.components.feature.addons.ui.AddonsManagerAdapter
import mozilla.components.feature.addons.ui.translateName
@ -157,7 +158,10 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
lifecycleScope.launch(Dispatchers.Main) {
runIfFragmentIsAttached {
binding?.let {
showSnackBar(it.root, getString(R.string.mozac_feature_addons_failed_to_query_add_ons))
showSnackBar(
it.root,
getString(R.string.mozac_feature_addons_failed_to_query_add_ons),
)
}
isInstallationInProgress = false
binding?.addOnsProgressBar?.isVisible = false
@ -184,9 +188,9 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
}
@VisibleForTesting
internal fun showErrorSnackBar(text: String) {
internal fun showErrorSnackBar(text: String, anchorView: View? = this.view) {
runIfFragmentIsAttached {
view?.let {
anchorView?.let {
showSnackBar(it, text, FenixSnackbar.LENGTH_LONG)
}
}
@ -208,8 +212,13 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
)
}
@VisibleForTesting
internal fun provideAddonManger(): AddonManager {
return requireContext().components.addonManager
}
internal fun installAddon(addon: Addon) {
requireContext().components.addonManager.installAddon(
provideAddonManger().installAddon(
addon,
onSuccess = {
runIfFragmentIsAttached {
@ -222,13 +231,14 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
// No need to display an error message if installation was cancelled by the user.
if (e !is CancellationException && e !is WebExtensionInstallException.UserCancelled) {
val rootView = activity?.getRootView() ?: view
var messageId = R.string.mozac_feature_addons_failed_to_install
if (e is WebExtensionInstallException.Blocklisted) {
messageId = R.string.mozac_feature_addons_blocklisted
}
context?.let {
showSnackBar(
rootView,
getString(
R.string.mozac_feature_addons_failed_to_install,
addon.translateName(it),
),
showErrorSnackBar(
text = getString(messageId, addon.translateName(it)),
anchorView = rootView,
)
}
}

@ -6,11 +6,15 @@ package org.mozilla.fenix.addons
import android.content.Context
import androidx.coordinatorlayout.widget.CoordinatorLayout
import io.mockk.CapturingSlot
import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verify
import mozilla.components.concept.engine.webextension.WebExtensionInstallException
import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManager
import mozilla.components.feature.addons.ui.translateName
import org.junit.Before
import org.junit.Test
import org.mozilla.fenix.R
@ -34,6 +38,7 @@ class AddonsManagementFragmentTest {
every { fragment.showErrorSnackBar(any()) } returns Unit
every { fragment.getString(R.string.addon_not_supported_error) } returns addonNotSupportedErrorMessage
every { fragment.getString(R.string.addon_already_installed) } returns addonAlreadyInstalledErrorMessage
every { fragment.getString(R.string.mozac_feature_addons_blocklisted) } returns addonAlreadyInstalledErrorMessage
}
@Test
@ -56,4 +61,23 @@ class AddonsManagementFragmentTest {
fragment.installExternalAddon(supportedAddons, "d1")
verify { fragment.showErrorSnackBar(addonAlreadyInstalledErrorMessage) }
}
@Test
fun `GIVEN add-on is installed WHEN add-on is blocklisted THEN error is shown`() {
val addonManger = mockk<AddonManager>()
val addon = Addon("1")
val onError = CapturingSlot<((String, Throwable) -> Unit)>()
val expectedErrorMessage = fragment.getString(
R.string.mozac_feature_addons_blocklisted,
addon.translateName(context),
)
every { fragment.provideAddonManger() } returns addonManger
every { addonManger.installAddon(addon, any(), capture(onError)) } returns mockk()
fragment.installAddon(addon)
onError.captured("", WebExtensionInstallException.Blocklisted(mockk()))
verify { fragment.showErrorSnackBar(expectedErrorMessage) }
}
}

Loading…
Cancel
Save