1
0
Fork 0

Wire up UI to make add-on installation cancelable

master
Christian Sadilek 2020-06-10 10:52:45 -04:00 committed by Mihai Branescu
parent 8c73218822
commit d16c70d8be
2 changed files with 51 additions and 22 deletions

View File

@ -18,7 +18,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_add_ons_management.*
import kotlinx.android.synthetic.main.fragment_add_ons_management.view.*
import kotlinx.android.synthetic.main.overlay_add_on_progress.view.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
@ -35,6 +34,7 @@ import org.mozilla.fenix.ext.getRootView
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.theme.ThemeManager
import java.util.concurrent.CancellationException
/**
* Fragment use for managing add-ons.
@ -46,7 +46,6 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management),
* Whether or not an add-on installation is in progress.
*/
private var isInstallationInProgress = false
private var scope: CoroutineScope? = null
private var adapter: AddonsManagerAdapter? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -244,7 +243,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management),
isInstallationInProgress = true
requireContext().components.addonManager.installAddon(
val installOperation = requireContext().components.addonManager.installAddon(
addon,
onSuccess = {
runIfFragmentIsAttached {
@ -254,21 +253,33 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management),
showInstallationDialog(it)
}
},
onError = { _, _ ->
onError = { _, e ->
this@AddonsManagementFragment.view?.let { view ->
val rootView = activity?.getRootView() ?: view
showSnackBar(
rootView,
getString(
R.string.mozac_feature_addons_failed_to_install,
addon.translatedName
// No need to display an error message if installation was cancelled by the user.
if (e !is CancellationException) {
val rootView = activity?.getRootView() ?: view
showSnackBar(
rootView,
getString(
R.string.mozac_feature_addons_failed_to_install,
addon.translatedName
)
)
)
}
addonProgressOverlay?.visibility = View.GONE
isInstallationInProgress = false
}
}
)
addonProgressOverlay.cancel_button.setOnClickListener {
lifecycleScope.launch(Dispatchers.Main) {
// Hide the installation progress overlay once cancellation is successful.
if (installOperation.cancel().await()) {
addonProgressOverlay.visibility = View.GONE
}
}
}
}
private fun announceForAccessibility(announcementText: CharSequence) {

View File

@ -9,16 +9,34 @@
android:layout_height="wrap_content"
android:elevation="1dp">
<TextView
android:id="@+id/add_ons_overlay_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:drawablePadding="8dp"
android:gravity="start|center_vertical"
android:padding="16dp"
android:text="@string/mozac_add_on_install_progress_caption"
app:drawableStartCompat="@drawable/mozac_ic_extensions_black" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/add_ons_overlay_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:drawablePadding="8dp"
android:gravity="start|center_vertical"
android:padding="16dp"
android:text="@string/mozac_add_on_install_progress_caption"
app:drawableStartCompat="@drawable/mozac_ic_extensions_black" />
<Button
android:id="@+id/cancel_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/add_ons_overlay_text"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="@string/mozac_feature_addons_install_addon_dialog_cancel"
android:textAllCaps="false" />
</RelativeLayout>
</androidx.cardview.widget.CardView>