Skip to content

Commit 486ed59

Browse files
authored
fix: Show selection warning also on patch option (#2643)
1 parent 789f9ec commit 486ed59

File tree

5 files changed

+69
-30
lines changed

5 files changed

+69
-30
lines changed

app/src/main/java/app/revanced/manager/ui/component/patches/OptionFields.kt

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.fillMaxHeight
1414
import androidx.compose.foundation.layout.fillMaxWidth
1515
import androidx.compose.foundation.layout.padding
1616
import androidx.compose.foundation.lazy.LazyColumn
17-
import androidx.compose.foundation.lazy.LazyListItemInfo
1817
import androidx.compose.foundation.lazy.items
1918
import androidx.compose.foundation.lazy.itemsIndexed
2019
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -74,13 +73,11 @@ import app.revanced.manager.util.saver.snapshotStateListSaver
7473
import app.revanced.manager.util.saver.snapshotStateSetSaver
7574
import app.revanced.manager.util.toast
7675
import app.revanced.manager.util.transparentListItemColors
77-
import kotlinx.coroutines.CoroutineScope
7876
import kotlinx.parcelize.Parcelize
7977
import org.koin.compose.koinInject
8078
import org.koin.core.component.KoinComponent
8179
import org.koin.core.component.get
8280
import sh.calvin.reorderable.ReorderableItem
83-
import sh.calvin.reorderable.rememberReorderableLazyColumnState
8481
import sh.calvin.reorderable.rememberReorderableLazyListState
8582
import java.io.Serializable
8683
import kotlin.random.Random
@@ -91,15 +88,28 @@ private class OptionEditorScope<T : Any>(
9188
val option: Option<T>,
9289
val openDialog: () -> Unit,
9390
val dismissDialog: () -> Unit,
91+
val selectionWarningEnabled: Boolean,
92+
val showSelectionWarning: () -> Unit,
9493
val value: T?,
95-
val setValue: (T?) -> Unit,
94+
val setValue: (T?) -> Unit
9695
) {
9796
fun submitDialog(value: T?) {
9897
setValue(value)
9998
dismissDialog()
10099
}
101100

102-
fun clickAction() = editor.clickAction(this)
101+
fun checkSafeguard(block: () -> Unit) {
102+
if (!option.required && selectionWarningEnabled)
103+
showSelectionWarning()
104+
else
105+
block()
106+
}
107+
108+
fun clickAction() {
109+
checkSafeguard {
110+
editor.clickAction(this)
111+
}
112+
}
103113

104114
@Composable
105115
fun ListItemTrailingContent() = editor.ListItemTrailingContent(this)
@@ -113,7 +123,7 @@ private interface OptionEditor<T : Any> {
113123

114124
@Composable
115125
fun ListItemTrailingContent(scope: OptionEditorScope<T>) {
116-
IconButton(onClick = { clickAction(scope) }) {
126+
IconButton(onClick = { scope.checkSafeguard { clickAction(scope) } }) {
117127
Icon(Icons.Outlined.Edit, stringResource(R.string.edit))
118128
}
119129
}
@@ -141,11 +151,14 @@ private inline fun <T : Any> WithOptionEditor(
141151
option: Option<T>,
142152
value: T?,
143153
noinline setValue: (T?) -> Unit,
154+
selectionWarningEnabled: Boolean,
144155
crossinline onDismissDialog: @DisallowComposableCalls () -> Unit = {},
145156
block: OptionEditorScope<T>.() -> Unit
146157
) {
147158
var showDialog by rememberSaveable { mutableStateOf(false) }
148-
val scope = remember(editor, option, value, setValue) {
159+
var showSelectionWarningDialog by rememberSaveable { mutableStateOf(false) }
160+
161+
val scope = remember(editor, option, value, setValue, selectionWarningEnabled) {
149162
OptionEditorScope(
150163
editor,
151164
option,
@@ -154,11 +167,18 @@ private inline fun <T : Any> WithOptionEditor(
154167
showDialog = false
155168
onDismissDialog()
156169
},
170+
selectionWarningEnabled,
171+
showSelectionWarning = { showSelectionWarningDialog = true },
157172
value,
158173
setValue
159174
)
160175
}
161176

177+
if (showSelectionWarningDialog)
178+
SelectionWarningDialog(
179+
onDismiss = { showSelectionWarningDialog = false }
180+
)
181+
162182
if (showDialog) scope.Dialog()
163183

164184
scope.block()
@@ -169,6 +189,7 @@ fun <T : Any> OptionItem(
169189
option: Option<T>,
170190
value: T?,
171191
setValue: (T?) -> Unit,
192+
selectionWarningEnabled: Boolean
172193
) {
173194
val editor = remember(option.type, option.presets) {
174195
@Suppress("UNCHECKED_CAST")
@@ -181,7 +202,7 @@ fun <T : Any> OptionItem(
181202
else baseOptionEditor
182203
}
183204

184-
WithOptionEditor(editor, option, value, setValue) {
205+
WithOptionEditor(editor, option, value, setValue, selectionWarningEnabled) {
185206
ListItem(
186207
modifier = Modifier.clickable(onClick = ::clickAction),
187208
headlineContent = { Text(option.title) },
@@ -300,7 +321,7 @@ private object StringOptionEditor : OptionEditor<String> {
300321

301322
private abstract class NumberOptionEditor<T : Number> : OptionEditor<T> {
302323
@Composable
303-
protected abstract fun NumberDialog(
324+
abstract fun NumberDialog(
304325
title: String,
305326
current: T?,
306327
validator: (T?) -> Boolean,
@@ -354,7 +375,14 @@ private object BooleanOptionEditor : OptionEditor<Boolean> {
354375

355376
@Composable
356377
override fun ListItemTrailingContent(scope: OptionEditorScope<Boolean>) {
357-
HapticSwitch(checked = scope.current, onCheckedChange = scope.setValue)
378+
HapticSwitch(
379+
checked = scope.current,
380+
onCheckedChange = { value ->
381+
scope.checkSafeguard {
382+
scope.setValue(value)
383+
}
384+
}
385+
)
358386
}
359387

360388
@Composable
@@ -393,6 +421,7 @@ private class PresetOptionEditor<T : Any>(private val innerEditor: OptionEditor<
393421
scope.option,
394422
scope.value,
395423
scope.setValue,
424+
scope.selectionWarningEnabled,
396425
onDismissDialog = scope.dismissDialog
397426
) inner@{
398427
var hidePresetsDialog by rememberSaveable {
@@ -614,7 +643,8 @@ private class ListOptionEditor<T : Serializable>(private val elementEditor: Opti
614643
elementEditor,
615644
elementOption,
616645
value = item.value,
617-
setValue = { items[index] = item.copy(value = it) }
646+
setValue = { items[index] = item.copy(value = it) },
647+
selectionWarningEnabled = scope.selectionWarningEnabled
618648
) {
619649
ListItem(
620650
modifier = Modifier.combinedClickable(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package app.revanced.manager.ui.component.patches
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.res.stringResource
5+
import app.revanced.manager.R
6+
import app.revanced.manager.ui.component.SafeguardDialog
7+
8+
@Composable
9+
fun SelectionWarningDialog(
10+
onDismiss: () -> Unit
11+
) {
12+
SafeguardDialog(
13+
onDismiss = onDismiss,
14+
title = R.string.warning,
15+
body = stringResource(R.string.selection_warning_description),
16+
)
17+
}

app/src/main/java/app/revanced/manager/ui/screen/PatchesSelectorScreen.kt

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import app.revanced.manager.ui.component.haptics.HapticCheckbox
7373
import app.revanced.manager.ui.component.haptics.HapticExtendedFloatingActionButton
7474
import app.revanced.manager.ui.component.haptics.HapticTab
7575
import app.revanced.manager.ui.component.patches.OptionItem
76+
import app.revanced.manager.ui.component.patches.SelectionWarningDialog
7677
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel
7778
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_INCOMPATIBLE
7879
import app.revanced.manager.ui.viewmodel.PatchesSelectorViewModel.Companion.SHOW_UNIVERSAL
@@ -181,7 +182,8 @@ fun PatchesSelectorScreen(
181182
patch = patch,
182183
values = viewModel.getOptions(bundle, patch),
183184
reset = { viewModel.resetOptions(bundle, patch) },
184-
set = { key, value -> viewModel.setOption(bundle, patch, key, value) }
185+
set = { key, value -> viewModel.setOption(bundle, patch, key, value) },
186+
selectionWarningEnabled = viewModel.selectionWarningEnabled
185187
)
186188
}
187189

@@ -215,9 +217,7 @@ fun PatchesSelectorScreen(
215217
) { patch ->
216218
PatchItem(
217219
patch = patch,
218-
onOptionsDialog = {
219-
viewModel.optionsDialog = uid to patch
220-
},
220+
onOptionsDialog = { viewModel.optionsDialog = uid to patch },
221221
selected = compatible && viewModel.isSelected(
222222
uid,
223223
patch
@@ -472,17 +472,6 @@ fun PatchesSelectorScreen(
472472
}
473473
}
474474

475-
@Composable
476-
private fun SelectionWarningDialog(
477-
onDismiss: () -> Unit
478-
) {
479-
SafeguardDialog(
480-
onDismiss = onDismiss,
481-
title = R.string.warning,
482-
body = stringResource(R.string.selection_warning_description),
483-
)
484-
}
485-
486475
@Composable
487476
private fun UniversalPatchWarningDialog(
488477
onDismiss: () -> Unit
@@ -612,6 +601,7 @@ private fun OptionsDialog(
612601
reset: () -> Unit,
613602
set: (String, Any?) -> Unit,
614603
onDismissRequest: () -> Unit,
604+
selectionWarningEnabled: Boolean
615605
) = FullscreenDialog(onDismissRequest = onDismissRequest) {
616606
Scaffold(
617607
topBar = {
@@ -642,7 +632,8 @@ private fun OptionsDialog(
642632
value = value,
643633
setValue = {
644634
set(key, it)
645-
}
635+
},
636+
selectionWarningEnabled = selectionWarningEnabled
646637
)
647638
}
648639
}

app/src/main/java/app/revanced/manager/ui/screen/RequiredOptionsScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ fun RequiredOptionsScreen(
154154
value = value,
155155
setValue = { new ->
156156
vm.setOption(bundle.uid, it, key, new)
157-
}
157+
},
158+
selectionWarningEnabled = vm.selectionWarningEnabled
158159
)
159160
}
160161
}

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@
9595
<string name="suggested_version_safeguard">Require suggested app version</string>
9696
<string name="suggested_version_safeguard_description">Enforce selection of the suggested app version</string>
9797
<string name="suggested_version_safeguard_confirmation">Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?</string>
98-
<string name="patch_selection_safeguard">Allow changing patch selection</string>
99-
<string name="patch_selection_safeguard_description">Do not prevent selecting or deselecting patches</string>
98+
<string name="patch_selection_safeguard">Allow changing patch selection and options</string>
99+
<string name="patch_selection_safeguard_description">Do not prevent selecting or deselecting patches and customization of options</string>
100100
<string name="patch_selection_safeguard_confirmation">Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?</string>
101101
<string name="universal_patches_safeguard">Allow using universal patches</string>
102102
<string name="universal_patches_safeguard_description">Do not prevent using universal patches</string>

0 commit comments

Comments
 (0)