From 486ed5967f20941aa7e89fe93f299973be392e74 Mon Sep 17 00:00:00 2001 From: brosssh <44944126+brosssh@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:32:49 +0200 Subject: [PATCH] fix: Show selection warning also on patch option (#2643) --- .../ui/component/patches/OptionFields.kt | 52 +++++++++++++++---- .../patches/SelectionWarningDialog.kt | 17 ++++++ .../ui/screen/PatchesSelectorScreen.kt | 23 +++----- .../ui/screen/RequiredOptionsScreen.kt | 3 +- app/src/main/res/values/strings.xml | 4 +- 5 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/component/patches/SelectionWarningDialog.kt diff --git a/app/src/main/java/app/revanced/manager/ui/component/patches/OptionFields.kt b/app/src/main/java/app/revanced/manager/ui/component/patches/OptionFields.kt index eaacc38c..2511dda2 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/patches/OptionFields.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/patches/OptionFields.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListItemInfo import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState @@ -74,13 +73,11 @@ import app.revanced.manager.util.saver.snapshotStateListSaver import app.revanced.manager.util.saver.snapshotStateSetSaver import app.revanced.manager.util.toast import app.revanced.manager.util.transparentListItemColors -import kotlinx.coroutines.CoroutineScope import kotlinx.parcelize.Parcelize import org.koin.compose.koinInject import org.koin.core.component.KoinComponent import org.koin.core.component.get import sh.calvin.reorderable.ReorderableItem -import sh.calvin.reorderable.rememberReorderableLazyColumnState import sh.calvin.reorderable.rememberReorderableLazyListState import java.io.Serializable import kotlin.random.Random @@ -91,15 +88,28 @@ private class OptionEditorScope( val option: Option, val openDialog: () -> Unit, val dismissDialog: () -> Unit, + val selectionWarningEnabled: Boolean, + val showSelectionWarning: () -> Unit, val value: T?, - val setValue: (T?) -> Unit, + val setValue: (T?) -> Unit ) { fun submitDialog(value: T?) { setValue(value) dismissDialog() } - fun clickAction() = editor.clickAction(this) + fun checkSafeguard(block: () -> Unit) { + if (!option.required && selectionWarningEnabled) + showSelectionWarning() + else + block() + } + + fun clickAction() { + checkSafeguard { + editor.clickAction(this) + } + } @Composable fun ListItemTrailingContent() = editor.ListItemTrailingContent(this) @@ -113,7 +123,7 @@ private interface OptionEditor { @Composable fun ListItemTrailingContent(scope: OptionEditorScope) { - IconButton(onClick = { clickAction(scope) }) { + IconButton(onClick = { scope.checkSafeguard { clickAction(scope) } }) { Icon(Icons.Outlined.Edit, stringResource(R.string.edit)) } } @@ -141,11 +151,14 @@ private inline fun WithOptionEditor( option: Option, value: T?, noinline setValue: (T?) -> Unit, + selectionWarningEnabled: Boolean, crossinline onDismissDialog: @DisallowComposableCalls () -> Unit = {}, block: OptionEditorScope.() -> Unit ) { var showDialog by rememberSaveable { mutableStateOf(false) } - val scope = remember(editor, option, value, setValue) { + var showSelectionWarningDialog by rememberSaveable { mutableStateOf(false) } + + val scope = remember(editor, option, value, setValue, selectionWarningEnabled) { OptionEditorScope( editor, option, @@ -154,11 +167,18 @@ private inline fun WithOptionEditor( showDialog = false onDismissDialog() }, + selectionWarningEnabled, + showSelectionWarning = { showSelectionWarningDialog = true }, value, setValue ) } + if (showSelectionWarningDialog) + SelectionWarningDialog( + onDismiss = { showSelectionWarningDialog = false } + ) + if (showDialog) scope.Dialog() scope.block() @@ -169,6 +189,7 @@ fun OptionItem( option: Option, value: T?, setValue: (T?) -> Unit, + selectionWarningEnabled: Boolean ) { val editor = remember(option.type, option.presets) { @Suppress("UNCHECKED_CAST") @@ -181,7 +202,7 @@ fun OptionItem( else baseOptionEditor } - WithOptionEditor(editor, option, value, setValue) { + WithOptionEditor(editor, option, value, setValue, selectionWarningEnabled) { ListItem( modifier = Modifier.clickable(onClick = ::clickAction), headlineContent = { Text(option.title) }, @@ -300,7 +321,7 @@ private object StringOptionEditor : OptionEditor { private abstract class NumberOptionEditor : OptionEditor { @Composable - protected abstract fun NumberDialog( + abstract fun NumberDialog( title: String, current: T?, validator: (T?) -> Boolean, @@ -354,7 +375,14 @@ private object BooleanOptionEditor : OptionEditor { @Composable override fun ListItemTrailingContent(scope: OptionEditorScope) { - HapticSwitch(checked = scope.current, onCheckedChange = scope.setValue) + HapticSwitch( + checked = scope.current, + onCheckedChange = { value -> + scope.checkSafeguard { + scope.setValue(value) + } + } + ) } @Composable @@ -393,6 +421,7 @@ private class PresetOptionEditor(private val innerEditor: OptionEditor< scope.option, scope.value, scope.setValue, + scope.selectionWarningEnabled, onDismissDialog = scope.dismissDialog ) inner@{ var hidePresetsDialog by rememberSaveable { @@ -614,7 +643,8 @@ private class ListOptionEditor(private val elementEditor: Opti elementEditor, elementOption, value = item.value, - setValue = { items[index] = item.copy(value = it) } + setValue = { items[index] = item.copy(value = it) }, + selectionWarningEnabled = scope.selectionWarningEnabled ) { ListItem( modifier = Modifier.combinedClickable( diff --git a/app/src/main/java/app/revanced/manager/ui/component/patches/SelectionWarningDialog.kt b/app/src/main/java/app/revanced/manager/ui/component/patches/SelectionWarningDialog.kt new file mode 100644 index 00000000..4ec4d415 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/component/patches/SelectionWarningDialog.kt @@ -0,0 +1,17 @@ +package app.revanced.manager.ui.component.patches + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import app.revanced.manager.R +import app.revanced.manager.ui.component.SafeguardDialog + +@Composable +fun SelectionWarningDialog( + onDismiss: () -> Unit +) { + SafeguardDialog( + onDismiss = onDismiss, + title = R.string.warning, + body = stringResource(R.string.selection_warning_description), + ) +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt index db0667a0..035c862e 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt @@ -73,6 +73,7 @@ import app.revanced.manager.ui.component.haptics.HapticCheckbox import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton import app.revanced.manager.ui.component.haptics.HapticTab import app.revanced.manager.ui.component.patches.OptionItem +import app.revanced.manager.ui.component.patches.SelectionWarningDialog import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_INCOMPATIBLE import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_UNIVERSAL @@ -181,7 +182,8 @@ fun PatchesSelectorScreen( patch = patch, values = viewModel.getOptions(bundle, patch), reset = { viewModel.resetOptions(bundle, patch) }, - set = { key, value -> viewModel.setOption(bundle, patch, key, value) } + set = { key, value -> viewModel.setOption(bundle, patch, key, value) }, + selectionWarningEnabled = viewModel.selectionWarningEnabled ) } @@ -215,9 +217,7 @@ fun PatchesSelectorScreen( ) { patch -> PatchItem( patch = patch, - onOptionsDialog = { - viewModel.optionsDialog = uid to patch - }, + onOptionsDialog = { viewModel.optionsDialog = uid to patch }, selected = compatible && viewModel.isSelected( uid, patch @@ -472,17 +472,6 @@ fun PatchesSelectorScreen( } } -@Composable -private fun SelectionWarningDialog( - onDismiss: () -> Unit -) { - SafeguardDialog( - onDismiss = onDismiss, - title = R.string.warning, - body = stringResource(R.string.selection_warning_description), - ) -} - @Composable private fun UniversalPatchWarningDialog( onDismiss: () -> Unit @@ -612,6 +601,7 @@ private fun OptionsDialog( reset: () -> Unit, set: (String, Any?) -> Unit, onDismissRequest: () -> Unit, + selectionWarningEnabled: Boolean ) = FullscreenDialog(onDismissRequest = onDismissRequest) { Scaffold( topBar = { @@ -642,7 +632,8 @@ private fun OptionsDialog( value = value, setValue = { set(key, it) - } + }, + selectionWarningEnabled = selectionWarningEnabled ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt index 4f054589..459e61ea 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt @@ -154,7 +154,8 @@ fun RequiredOptionsScreen( value = value, setValue = { new -> vm.setOption(bundle.uid, it, key, new) - } + }, + selectionWarningEnabled = vm.selectionWarningEnabled ) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79f9daee..1117b5e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,8 +95,8 @@ Require suggested app version Enforce selection of the suggested app version Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways? - Allow changing patch selection - Do not prevent selecting or deselecting patches + Allow changing patch selection and options + Do not prevent selecting or deselecting patches and customization of options Changing the selection of patches may cause unexpected issues.\n\nEnable anyways? Allow using universal patches Do not prevent using universal patches