Skip to content

Commit

Permalink
AppControl: Show confirmation before enabling/disabling apps
Browse files Browse the repository at this point in the history
Closes #868
  • Loading branch information
d4rken committed Dec 16, 2023
1 parent aa8c81e commit 10bd575
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package eu.darken.sdmse.appcontrol.ui.list

import eu.darken.sdmse.appcleaner.core.AppJunk

sealed class AppControlListEvents {
data class ConfirmDeletion(val appJunk: AppJunk) : AppControlListEvents()
data class ConfirmDeletion(val items: List<AppControlListAdapter.Item>) : AppControlListEvents()
data class ExclusionsCreated(val count: Int) : AppControlListEvents()
data object ShowSizeSortCaveat : AppControlListEvents()
data class ConfirmToggle(val items: List<AppControlListAdapter.Item>) : AppControlListEvents()
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,27 +152,8 @@ class AppControlListFragment : Fragment3(R.layout.appcontrol_list_fragment) {
}

R.id.action_uninstall_selection -> {
MaterialAlertDialogBuilder(requireContext()).apply {
setTitle(eu.darken.sdmse.common.R.string.general_delete_confirmation_title)
setMessage(
if (selected.size > 1) {
getString(
eu.darken.sdmse.common.R.string.general_delete_confirmation_message_selected_x_items,
selected.size
)
} else {
getString(
eu.darken.sdmse.common.R.string.general_delete_confirmation_message_x,
selected.single().appInfo.label.get(requireContext())
)
}
)
setPositiveButton(eu.darken.sdmse.common.R.string.general_delete_action) { _, _ ->
vm.uninstall(selected)
tracker.clearSelection()
}
setNeutralButton(eu.darken.sdmse.common.R.string.general_cancel_action) { _, _ -> }
}.show()
vm.uninstall(selected)
tracker.clearSelection()
true
}

Expand Down Expand Up @@ -273,13 +254,34 @@ class AppControlListFragment : Fragment3(R.layout.appcontrol_list_fragment) {
}
}

vm.events.observe2(ui) {
when (it) {
is AppControlListEvents.ConfirmDeletion -> {}
vm.events.observe2(ui) { event ->
when (event) {
is AppControlListEvents.ConfirmDeletion -> MaterialAlertDialogBuilder(requireContext()).apply {
setTitle(eu.darken.sdmse.common.R.string.general_delete_confirmation_title)
setMessage(
if (event.items.size > 1) {
getString(
eu.darken.sdmse.common.R.string.general_delete_confirmation_message_selected_x_items,
event.items.size
)
} else {
getString(
eu.darken.sdmse.common.R.string.general_delete_confirmation_message_x,
event.items.single().appInfo.label.get(requireContext())
)
}
)
setPositiveButton(eu.darken.sdmse.common.R.string.general_delete_action) { _, _ ->
vm.uninstall(event.items, confirmed = true)
tracker.clearSelection()
}
setNeutralButton(eu.darken.sdmse.common.R.string.general_cancel_action) { _, _ -> }
}.show()

is AppControlListEvents.ExclusionsCreated -> Snackbar
.make(
requireView(),
getQuantityString2(R.plurals.exclusion_x_new_exclusions, it.count),
getQuantityString2(R.plurals.exclusion_x_new_exclusions, event.count),
Snackbar.LENGTH_LONG
)
.setAction(eu.darken.sdmse.common.R.string.general_view_action) {
Expand All @@ -293,6 +295,16 @@ class AppControlListFragment : Fragment3(R.layout.appcontrol_list_fragment) {
vm.ackSizeSortCaveat()
}
}.show()

is AppControlListEvents.ConfirmToggle -> MaterialAlertDialogBuilder(requireContext()).apply {
setTitle(R.string.appcontrol_toggle_confirmation_title)
setMessage(getQuantityString2(R.plurals.appcontrol_toggle_confirmation_message_x, event.items.size))
setPositiveButton(eu.darken.sdmse.common.R.string.general_continue) { _, _ ->
vm.toggle(event.items, confirmed = true)
tracker.clearSelection()
}
setNeutralButton(eu.darken.sdmse.common.R.string.general_cancel_action) { _, _ -> }
}.show()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,14 +309,22 @@ class AppControlListViewModel @Inject constructor(
events.postValue(AppControlListEvents.ExclusionsCreated(createdExclusions.size))
}

fun toggle(items: Collection<AppControlListAdapter.Item>) = launch {
log(TAG) { "toggle(${items.size})" }
fun toggle(items: Collection<AppControlListAdapter.Item>, confirmed: Boolean = false) = launch {
log(TAG) { "toggle(${items.size}, confirmed=$confirmed)" }
if (!confirmed) {
events.postValue(AppControlListEvents.ConfirmToggle(items.toList()))
return@launch
}
val targets = items.map { it.appInfo.installId }.toSet()
appControl.submit(AppControlToggleTask(targets = targets))
}

fun uninstall(items: Collection<AppControlListAdapter.Item>) = launch {
log(TAG) { "uninstall(${items.size})" }
fun uninstall(items: Collection<AppControlListAdapter.Item>, confirmed: Boolean = false) = launch {
log(TAG) { "uninstall(${items.size}, confirmed=$confirmed)" }
if (!confirmed) {
events.postValue(AppControlListEvents.ConfirmDeletion(items.toList()))
return@launch
}
val targets = items.map { it.appInfo.installId }.toSet()
appControl.submit(UninstallTask(targets = targets))
}
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,11 @@
<string name="appcontrol_app_sizes_apk_label">App</string>
<string name="appcontrol_app_sizes_data_label">Data</string>
<string name="appcontrol_app_sizes_cache_label">Cache</string>
<string name="appcontrol_toggle_confirmation_title">Confirm action</string>
<plurals name="appcontrol_toggle_confirmation_message_x">
<item quantity="one">Change enabled/disabled state of %d app?</item>
<item quantity="other">Change enabled/disabled states for %d apps?</item>
</plurals>

<string name="analyzer_tool_name">StorageAnalyzer</string>
<string name="analyzer_explanation_short">Find out what is taking up space on your device.</string>
Expand Down

0 comments on commit 10bd575

Please sign in to comment.