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

View File

@ -9,16 +9,34 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elevation="1dp"> android:elevation="1dp">
<TextView <RelativeLayout
android:id="@+id/add_ons_overlay_text" android:layout_width="match_parent"
android:layout_width="wrap_content" android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:layout_marginStart="8dp" <TextView
android:layout_marginEnd="8dp" android:id="@+id/add_ons_overlay_text"
android:drawablePadding="8dp" android:layout_width="wrap_content"
android:gravity="start|center_vertical" android:layout_height="wrap_content"
android:padding="16dp" android:layout_marginStart="8dp"
android:text="@string/mozac_add_on_install_progress_caption" android:layout_marginEnd="8dp"
app:drawableStartCompat="@drawable/mozac_ic_extensions_black" /> 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> </androidx.cardview.widget.CardView>