1
0
Fork 0

For issue #8097: Run add-ons callbacks only when the fragment is attached.

master
Arturo Mejia 2020-02-05 14:22:45 -05:00 committed by GitHub
parent 3f9ed2992c
commit be7bd527f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 39 deletions

View File

@ -9,12 +9,13 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.navigation.Navigation import androidx.navigation.Navigation
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_add_ons_management.* import kotlinx.android.synthetic.main.fragment_add_ons_management.*
import kotlinx.android.synthetic.main.fragment_add_ons_management.view.* import kotlinx.android.synthetic.main.fragment_add_ons_management.view.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.AddonManagerException
@ -31,7 +32,6 @@ import org.mozilla.fenix.ext.showToolbar
*/ */
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
class AddonsManagementFragment : Fragment(), AddonsManagerAdapterDelegate { class AddonsManagementFragment : Fragment(), AddonsManagerAdapterDelegate {
private val scope = CoroutineScope(Dispatchers.IO)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -77,11 +77,11 @@ class AddonsManagementFragment : Fragment(), AddonsManagerAdapterDelegate {
private fun bindRecyclerView(view: View) { private fun bindRecyclerView(view: View) {
val recyclerView = view.add_ons_list val recyclerView = view.add_ons_list
recyclerView.layoutManager = LinearLayoutManager(requireContext()) recyclerView.layoutManager = LinearLayoutManager(requireContext())
scope.launch { lifecycleScope.launch(IO) {
try { try {
val addons = requireContext().components.addonManager.getAddons() val addons = requireContext().components.addonManager.getAddons()
scope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
val adapter = AddonsManagerAdapter( val adapter = AddonsManagerAdapter(
requireContext().components.addonCollectionProvider, requireContext().components.addonCollectionProvider,
this@AddonsManagementFragment, this@AddonsManagementFragment,
@ -90,7 +90,7 @@ class AddonsManagementFragment : Fragment(), AddonsManagerAdapterDelegate {
recyclerView.adapter = adapter recyclerView.adapter = adapter
} }
} catch (e: AddonManagerException) { } catch (e: AddonManagerException) {
scope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
showSnackBar(view, getString(R.string.mozac_feature_addons_failed_to_query_add_ons)) showSnackBar(view, getString(R.string.mozac_feature_addons_failed_to_query_add_ons))
} }
} }
@ -153,15 +153,14 @@ class AddonsManagementFragment : Fragment(), AddonsManagerAdapterDelegate {
) )
) )
bindRecyclerView(view) bindRecyclerView(view)
addonProgressOverlay?.visibility = View.GONE
} }
addonProgressOverlay?.visibility = View.GONE
}, },
onError = { _, _ -> onError = { _, _ ->
this@AddonsManagementFragment.view?.let { view -> this@AddonsManagementFragment.view?.let { view ->
showSnackBar(view, getString(R.string.mozac_feature_addons_failed_to_install, addon.translatedName)) showSnackBar(view, getString(R.string.mozac_feature_addons_failed_to_install, addon.translatedName))
addonProgressOverlay?.visibility = View.GONE
} }
addonProgressOverlay?.visibility = View.GONE
} }
) )
} }

View File

@ -5,6 +5,7 @@
package org.mozilla.fenix.addons package org.mozilla.fenix.addons
import android.view.View import android.view.View
import androidx.fragment.app.Fragment
import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.FenixSnackbar
import java.text.NumberFormat import java.text.NumberFormat
import java.util.Locale import java.util.Locale
@ -29,3 +30,14 @@ internal fun showSnackBar(view: View, text: String) {
.setText(text) .setText(text)
.show() .show()
} }
/**
* Run the [block] only if the [Fragment] is attached.
*
* @param block A callback to be executed if the container [Fragment] is attached.
*/
internal inline fun Fragment.runIfFragmentIsAttached(block: () -> Unit) {
context?.let {
block()
}
}

View File

@ -62,36 +62,56 @@ class InstalledAddonDetailsFragment : Fragment() {
requireContext().components.addonManager.enableAddon( requireContext().components.addonManager.enableAddon(
addon, addon,
onSuccess = { onSuccess = {
switch.setState(true) runIfFragmentIsAttached {
this.addon = it switch.setState(true)
showSnackBar( this.addon = it
view, showSnackBar(
getString(R.string.mozac_feature_addons_successfully_enabled, addon.translatedName) view,
) getString(
R.string.mozac_feature_addons_successfully_enabled,
addon.translatedName
)
)
}
}, },
onError = { onError = {
showSnackBar( runIfFragmentIsAttached {
view, showSnackBar(
getString(R.string.mozac_feature_addons_failed_to_enable, addon.translatedName) view,
) getString(
R.string.mozac_feature_addons_failed_to_enable,
addon.translatedName
)
)
}
} }
) )
} else { } else {
requireContext().components.addonManager.disableAddon( requireContext().components.addonManager.disableAddon(
addon, addon,
onSuccess = { onSuccess = {
switch.setState(false) runIfFragmentIsAttached {
this.addon = it switch.setState(false)
showSnackBar( this.addon = it
view, showSnackBar(
getString(R.string.mozac_feature_addons_successfully_disabled, addon.translatedName) view,
) getString(
R.string.mozac_feature_addons_successfully_disabled,
addon.translatedName
)
)
}
}, },
onError = { onError = {
showSnackBar( runIfFragmentIsAttached {
view, showSnackBar(
getString(R.string.mozac_feature_addons_failed_to_disable, addon.translatedName) view,
) getString(
R.string.mozac_feature_addons_failed_to_disable,
addon.translatedName
)
)
}
} }
) )
} }
@ -136,20 +156,27 @@ class InstalledAddonDetailsFragment : Fragment() {
requireContext().components.addonManager.uninstallAddon( requireContext().components.addonManager.uninstallAddon(
addon, addon,
onSuccess = { onSuccess = {
showSnackBar( runIfFragmentIsAttached {
view, showSnackBar(
getString(R.string.mozac_feature_addons_successfully_uninstalled, addon.translatedName) view,
) getString(
view.findNavController().popBackStack() R.string.mozac_feature_addons_successfully_uninstalled,
addon.translatedName
)
)
view.findNavController().popBackStack()
}
}, },
onError = { _, _ -> onError = { _, _ ->
showSnackBar( runIfFragmentIsAttached {
view, showSnackBar(
getString( view,
R.string.mozac_feature_addons_failed_to_uninstall, getString(
addon.translatedName R.string.mozac_feature_addons_failed_to_uninstall,
addon.translatedName
)
) )
) }
} }
) )
} }