mirror of
https://github.com/revanced/revanced-manager.git
synced 2025-04-29 21:44:26 +02:00
feat: Add confirm dialogs when toggling dangerous settings (#2072)
Co-authored-by: Ax333l <main@axelen.xyz>
This commit is contained in:
parent
b81bd17fbc
commit
9db3bd5b3f
@ -0,0 +1,54 @@
|
|||||||
|
package app.revanced.manager.ui.component.settings
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import app.revanced.manager.domain.manager.base.Preference
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SafeguardBooleanItem(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
preference: Preference<Boolean>,
|
||||||
|
coroutineScope: CoroutineScope = rememberCoroutineScope(),
|
||||||
|
@StringRes headline: Int,
|
||||||
|
@StringRes description: Int,
|
||||||
|
@StringRes confirmationText: Int
|
||||||
|
) {
|
||||||
|
val value by preference.getAsState()
|
||||||
|
var showSafeguardWarning by rememberSaveable {
|
||||||
|
mutableStateOf(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showSafeguardWarning) {
|
||||||
|
SafeguardConfirmationDialog(
|
||||||
|
onDismiss = { showSafeguardWarning = false },
|
||||||
|
onConfirm = {
|
||||||
|
coroutineScope.launch { preference.update(!value) }
|
||||||
|
showSafeguardWarning = false
|
||||||
|
},
|
||||||
|
body = stringResource(confirmationText)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
BooleanItem(
|
||||||
|
modifier = modifier,
|
||||||
|
value = value,
|
||||||
|
onValueChange = {
|
||||||
|
if (it != preference.default) {
|
||||||
|
showSafeguardWarning = true
|
||||||
|
} else {
|
||||||
|
coroutineScope.launch { preference.update(it) }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headline = headline,
|
||||||
|
description = description
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package app.revanced.manager.ui.component.settings
|
||||||
|
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.outlined.WarningAmber
|
||||||
|
import androidx.compose.material3.AlertDialog
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextButton
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import app.revanced.manager.R
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SafeguardConfirmationDialog(
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
onConfirm: () -> Unit,
|
||||||
|
body: String,
|
||||||
|
) {
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = onDismiss,
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = onConfirm) {
|
||||||
|
Text(stringResource(R.string.yes))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
TextButton(onClick = onDismiss) {
|
||||||
|
Text(stringResource(R.string.no))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
icon = {
|
||||||
|
Icon(Icons.Outlined.WarningAmber, null)
|
||||||
|
},
|
||||||
|
title = {
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.warning),
|
||||||
|
style = MaterialTheme.typography.headlineSmall.copy(textAlign = TextAlign.Center)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
text = {
|
||||||
|
Text(body)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
@ -31,6 +31,7 @@ import app.revanced.manager.ui.component.ColumnWithScrollbar
|
|||||||
import app.revanced.manager.ui.component.GroupHeader
|
import app.revanced.manager.ui.component.GroupHeader
|
||||||
import app.revanced.manager.ui.component.settings.BooleanItem
|
import app.revanced.manager.ui.component.settings.BooleanItem
|
||||||
import app.revanced.manager.ui.component.settings.IntegerItem
|
import app.revanced.manager.ui.component.settings.IntegerItem
|
||||||
|
import app.revanced.manager.ui.component.settings.SafeguardBooleanItem
|
||||||
import app.revanced.manager.ui.component.settings.SettingsListItem
|
import app.revanced.manager.ui.component.settings.SettingsListItem
|
||||||
import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel
|
import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel
|
||||||
import app.revanced.manager.util.toast
|
import app.revanced.manager.util.toast
|
||||||
@ -104,29 +105,33 @@ fun AdvancedSettingsScreen(
|
|||||||
)
|
)
|
||||||
|
|
||||||
GroupHeader(stringResource(R.string.safeguards))
|
GroupHeader(stringResource(R.string.safeguards))
|
||||||
BooleanItem(
|
SafeguardBooleanItem(
|
||||||
preference = vm.prefs.disablePatchVersionCompatCheck,
|
preference = vm.prefs.disablePatchVersionCompatCheck,
|
||||||
coroutineScope = vm.viewModelScope,
|
coroutineScope = vm.viewModelScope,
|
||||||
headline = R.string.patch_compat_check,
|
headline = R.string.patch_compat_check,
|
||||||
description = R.string.patch_compat_check_description
|
description = R.string.patch_compat_check_description,
|
||||||
|
confirmationText = R.string.patch_compat_check_confirmation
|
||||||
)
|
)
|
||||||
BooleanItem(
|
SafeguardBooleanItem(
|
||||||
preference = vm.prefs.disableUniversalPatchWarning,
|
preference = vm.prefs.disableUniversalPatchWarning,
|
||||||
coroutineScope = vm.viewModelScope,
|
coroutineScope = vm.viewModelScope,
|
||||||
headline = R.string.universal_patches_safeguard,
|
headline = R.string.universal_patches_safeguard,
|
||||||
description = R.string.universal_patches_safeguard_description
|
description = R.string.universal_patches_safeguard_description,
|
||||||
|
confirmationText = R.string.universal_patches_safeguard_confirmation
|
||||||
)
|
)
|
||||||
BooleanItem(
|
SafeguardBooleanItem(
|
||||||
preference = vm.prefs.suggestedVersionSafeguard,
|
preference = vm.prefs.suggestedVersionSafeguard,
|
||||||
coroutineScope = vm.viewModelScope,
|
coroutineScope = vm.viewModelScope,
|
||||||
headline = R.string.suggested_version_safeguard,
|
headline = R.string.suggested_version_safeguard,
|
||||||
description = R.string.suggested_version_safeguard_description
|
description = R.string.suggested_version_safeguard_description,
|
||||||
|
confirmationText = R.string.suggested_version_safeguard_confirmation
|
||||||
)
|
)
|
||||||
BooleanItem(
|
SafeguardBooleanItem(
|
||||||
preference = vm.prefs.disableSelectionWarning,
|
preference = vm.prefs.disableSelectionWarning,
|
||||||
coroutineScope = vm.viewModelScope,
|
coroutineScope = vm.viewModelScope,
|
||||||
headline = R.string.patch_selection_safeguard,
|
headline = R.string.patch_selection_safeguard,
|
||||||
description = R.string.patch_selection_safeguard_description
|
description = R.string.patch_selection_safeguard_description,
|
||||||
|
confirmationText = R.string.patch_selection_safeguard_confirmation
|
||||||
)
|
)
|
||||||
|
|
||||||
GroupHeader(stringResource(R.string.debugging))
|
GroupHeader(stringResource(R.string.debugging))
|
||||||
|
@ -88,12 +88,16 @@
|
|||||||
<string name="safeguards">Safeguards</string>
|
<string name="safeguards">Safeguards</string>
|
||||||
<string name="patch_compat_check">Disable version compatibility check</string>
|
<string name="patch_compat_check">Disable version compatibility check</string>
|
||||||
<string name="patch_compat_check_description">The check restricts patches to supported app versions</string>
|
<string name="patch_compat_check_description">The check restricts patches to supported app versions</string>
|
||||||
|
<string name="patch_compat_check_confirmation">Selecting incompatible patches can result in a broken app.\n\nDo you want to proceed anyways?</string>
|
||||||
<string name="suggested_version_safeguard">Require suggested app version</string>
|
<string name="suggested_version_safeguard">Require suggested app version</string>
|
||||||
<string name="suggested_version_safeguard_description">Enforce selection of the suggested app version</string>
|
<string name="suggested_version_safeguard_description">Enforce selection of the suggested app version</string>
|
||||||
|
<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>
|
||||||
<string name="patch_selection_safeguard">Allow changing patch selection</string>
|
<string name="patch_selection_safeguard">Allow changing patch selection</string>
|
||||||
<string name="patch_selection_safeguard_description">Do not prevent selecting or deselecting patches</string>
|
<string name="patch_selection_safeguard_description">Do not prevent selecting or deselecting patches</string>
|
||||||
|
<string name="patch_selection_safeguard_confirmation">Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?</string>
|
||||||
<string name="universal_patches_safeguard">Disable universal patch warning</string>
|
<string name="universal_patches_safeguard">Disable universal patch warning</string>
|
||||||
<string name="universal_patches_safeguard_description">Disables the warning that appears when you try to select universal patches</string>
|
<string name="universal_patches_safeguard_description">Disables the warning that appears when you try to select universal patches</string>
|
||||||
|
<string name="universal_patches_safeguard_confirmation">Universal patches are not as well tested as those that target specific apps.\n\nEnable anyways?</string>
|
||||||
<string name="import_keystore">Import keystore</string>
|
<string name="import_keystore">Import keystore</string>
|
||||||
<string name="import_keystore_description">Import a custom keystore</string>
|
<string name="import_keystore_description">Import a custom keystore</string>
|
||||||
<string name="import_keystore_dialog_title">Enter keystore credentials</string>
|
<string name="import_keystore_dialog_title">Enter keystore credentials</string>
|
||||||
@ -142,6 +146,8 @@
|
|||||||
|
|
||||||
<string name="options">Options</string>
|
<string name="options">Options</string>
|
||||||
<string name="ok">OK</string>
|
<string name="ok">OK</string>
|
||||||
|
<string name="yes">Yes</string>
|
||||||
|
<string name="no">No</string>
|
||||||
<string name="edit">Edit</string>
|
<string name="edit">Edit</string>
|
||||||
<string name="dialog_input_placeholder">Value</string>
|
<string name="dialog_input_placeholder">Value</string>
|
||||||
<string name="reset">Reset</string>
|
<string name="reset">Reset</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user