refactor: reorganize and rename settings (#1307)

Co-authored-by: Pun Butrach <pun.butrach@gmail.com>
Co-authored-by: Ushie <ushiekane@gmail.com>
This commit is contained in:
KobeW50 2023-10-15 05:56:02 -04:00 committed by GitHub
parent e960fcc303
commit 196d9fe4d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 285 additions and 271 deletions

View file

@ -128,12 +128,10 @@
"none": "None", "none": "None",
"noneTooltip": "Deselect all patches", "noneTooltip": "Deselect all patches",
"loadPatchesSelection": "Load patches selection", "loadPatchesSelection": "Load patch selection",
"noSavedPatches": "No saved patches for the selected app.\nPress Done to save current selection.", "noSavedPatches": "No saved patch selection for the selected app.\nPress Done to save the current selection.",
"noPatchesFound": "No patches found for the selected app", "noPatchesFound": "No patches found for the selected app",
"setRequiredOption": "Some patches require options to be set:\n\n{patches}\n\nPlease set them before continuing.", "setRequiredOption": "Some patches require options to be set:\n\n{patches}\n\nPlease set them before continuing."
"selectAllPatchesWarningContent": "You are about to select all patches, that includes non-suggested patches and can cause unwanted behavior."
}, },
"patchOptionsView": { "patchOptionsView": {
"viewTitle": "Patch options", "viewTitle": "Patch options",
@ -152,10 +150,10 @@
}, },
"patchItem": { "patchItem": {
"unsupportedDialogText": "Selecting this patch may result in patching errors.\n\nApp version: {packageVersion}\nSupported versions:\n{supportedVersions}", "unsupportedDialogText": "Selecting this patch may result in patching errors.\n\nApp version: {packageVersion}\nSupported versions:\n{supportedVersions}",
"unsupportedPatchVersion": "Patch is not supported for this app version. Enable the experimental toggle in settings to proceed.", "unsupportedPatchVersion": "Patch is not supported for this app version.",
"unsupportedRequiredOption": "This patch contains a required option that is not supported by this app", "unsupportedRequiredOption": "This patch contains a required option that is not supported by this app",
"patchesChangeWarningDialogText": "It is recommended to use the default selection of patches because changing it may cause unexpected issues.\n\nIf you know what you are doing, you can enable \"Enable changing selection\" in the settings.", "patchesChangeWarningDialogText": "It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou'll need to turn on \"Allow changing patch selection\" in settings before changing any patch selection.",
"patchesChangeWarningDialogButton": "Use default selection" "patchesChangeWarningDialogButton": "Use default selection"
}, },
"installerView": { "installerView": {
@ -187,10 +185,9 @@
"appearanceSectionTitle": "Appearance", "appearanceSectionTitle": "Appearance",
"teamSectionTitle": "Team", "teamSectionTitle": "Team",
"infoSectionTitle": "Info", "debugSectionTitle": "Debugging",
"advancedSectionTitle": "Advanced", "advancedSectionTitle": "Advanced",
"exportSectionTitle": "Import & export", "exportSectionTitle": "Import & export",
"logsSectionTitle": "Logs",
"themeModeLabel": "App theme", "themeModeLabel": "App theme",
"systemThemeLabel": "System", "systemThemeLabel": "System",
@ -204,15 +201,15 @@
"englishOption": "English", "englishOption": "English",
"sourcesLabel": "Sources", "sourcesLabel": "Sources",
"sourcesLabelHint": "Configure your custom sources", "sourcesLabelHint": "Configure your sources",
"sourcesIntegrationsLabel": "Integrations source", "sourcesIntegrationsLabel": "Integrations source",
"sourcesResetDialogTitle": "Reset", "sourcesResetDialogTitle": "Reset",
"sourcesResetDialogText": "Are you sure you want to reset custom sources to their default values?", "sourcesResetDialogText": "Are you sure you want to reset your sources to their default values?",
"apiURLResetDialogText": "Are you sure you want to reset API URL to its default value?", "apiURLResetDialogText": "Are you sure you want to reset your API URL to its default value?",
"sourcesUpdateNote": "Note: ReVanced Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.", "sourcesUpdateNote": "Note: Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.",
"apiURLLabel": "API URL", "apiURLLabel": "API URL",
"apiURLHint": "Configure your custom API URL", "apiURLHint": "Configure your API URL",
"selectApiURL": "API URL", "selectApiURL": "API URL",
"hostRepositoryLabel": "Repository API", "hostRepositoryLabel": "Repository API",
"orgPatchesLabel": "Patches organization", "orgPatchesLabel": "Patches organization",
@ -222,21 +219,20 @@
"contributorsLabel": "Contributors", "contributorsLabel": "Contributors",
"contributorsHint": "A list of contributors of ReVanced", "contributorsHint": "A list of contributors of ReVanced",
"logsLabel": "Logs", "logsLabel": "Share logs",
"logsHint": "Share Manager's logs", "logsHint": "Share ReVanced Manager logs",
"enablePatchesSelectionLabel": "Enable changing selection", "enablePatchesSelectionLabel": "Allow changing patch selection",
"enablePatchesSelectionHint": "Enable changing the selection of patches.", "enablePatchesSelectionHint": "Allow changing the selection of patches",
"enablePatchesSelectionWarningText": "Changing the default selection of patches may cause unexpected issues.\n\nEnable anyways?", "enablePatchesSelectionWarningText": "Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?",
"disablePatchesSelectionWarningText": "You are about to disable changing the selection of patches.\nThe default selection of patches will be restored.\n\nDisable anyways?", "disablePatchesSelectionWarningText": "You are about to disable changing the selection of patches.\nThe default selection of patches will be restored.\n\nDisable anyways?",
"autoUpdatePatchesLabel": "Auto update patches", "autoUpdatePatchesLabel": "Auto update patches",
"autoUpdatePatchesHint": "Automatically update ReVanced Patches to the latest version", "autoUpdatePatchesHint": "Automatically update patches to the latest version",
"experimentalUniversalPatchesLabel": "Experimental universal patches support", "universalPatchesLabel": "Show universal patches",
"experimentalUniversalPatchesHint": "Display all applications to use with universal patches, loading list of apps may be slower", "universalPatchesHint": "Display all apps and universal patches (may slow down the app list)",
"experimentalPatchesLabel": "Experimental patches support", "versionCompatibilityCheckLabel": "Version compatibility check",
"experimentalPatchesHint": "Enable usage of unsupported patches in any app version", "versionCompatibilityCheckHint": "Restricts patches to supported versions",
"enabledExperimentalPatches": "Experimental patches support enabled",
"aboutLabel": "About", "aboutLabel": "About",
"snackbarMessage": "Copied to clipboard", "snackbarMessage": "Copied to clipboard",
@ -246,54 +242,52 @@
"deleteTempDirHint": "Delete unused temporary files", "deleteTempDirHint": "Delete unused temporary files",
"deletedTempDir": "Temporary files deleted", "deletedTempDir": "Temporary files deleted",
"exportPatchesLabel": "Export patches selection", "exportPatchesLabel": "Export patch selection",
"exportPatchesHint": "Export patches selection to a JSON file", "exportPatchesHint": "Export patch selection to a JSON file",
"exportedPatches": "Patches selection exported", "exportedPatches": "Patch selection exported",
"noExportFileFound": "No patches selection to export", "noExportFileFound": "No patch selection to export",
"importPatchesLabel": "Import patches selection", "importPatchesLabel": "Import patch selection",
"importPatchesHint": "Import patches selection from a JSON file", "importPatchesHint": "Import patch selection from a JSON file",
"importedPatches": "Patches selection imported", "importedPatches": "Patch selection imported",
"resetStoredPatchesLabel": "Reset patches", "resetStoredPatchesLabel": "Reset patch selection",
"resetStoredPatchesHint": "Reset the stored patches selection", "resetStoredPatchesHint": "Reset the stored patch selection",
"resetStoredPatchesDialogTitle": "Reset patch selection?",
"resetStoredPatchesDialogText": "The default selection of patches will be restored..",
"resetStoredPatches": "Patch selection has been reset",
"resetStoredOptionsLabel": "Reset options", "resetStoredOptionsLabel": "Reset patch options",
"resetStoredOptionsHint": "Reset all patch options", "resetStoredOptionsHint": "Reset all patch options",
"resetStoredOptionsDialogTitle": "Reset patch options?",
"resetStoredPatchesDialogTitle": "Reset patches selection?", "resetStoredOptionsDialogText": "Resetting patch options will remove all saved options.",
"resetStoredPatchesDialogText": "Resetting patches selection will remove all selected patches.",
"resetStoredPatches": "Patches selection has been reset",
"resetStoredOptionsDialogTitle": "Reset options?",
"resetStoredOptionsDialogText": "Resetting options will remove all saved options.",
"resetStoredOptions": "Options have been reset", "resetStoredOptions": "Options have been reset",
"deleteLogsLabel": "Delete logs", "deleteLogsLabel": "Clear logs",
"deleteLogsHint": "Delete collected manager logs", "deleteLogsHint": "Delete collected ReVanced Manager logs",
"deletedLogs": "Logs deleted", "deletedLogs": "Logs deleted",
"regenerateKeystoreLabel": "Regenerate keystore", "regenerateKeystoreLabel": "Regenerate keystore",
"regenerateKeystoreHint": "Regenerate the keystore used to sign the app", "regenerateKeystoreHint": "Regenerate the keystore used to sign apps",
"regenerateKeystoreDialogTitle": "Regenerate keystore?", "regenerateKeystoreDialogTitle": "Regenerate keystore?",
"regenerateKeystoreDialogText": "Patched apps signed with the old keystore will no longer be able to update.", "regenerateKeystoreDialogText": "Patched apps signed with the old keystore will no longer be able to be updated.",
"regeneratedKeystore": "Keystore regenerated", "regeneratedKeystore": "Keystore regenerated",
"exportKeystoreLabel": "Export keystore", "exportKeystoreLabel": "Export keystore",
"exportKeystoreHint": "Export keystore used to sign apps", "exportKeystoreHint": "Export the keystore used to sign apps",
"exportedKeystore": "Keystore exported", "exportedKeystore": "Keystore exported",
"noKeystoreExportFileFound": "No keystore to export", "noKeystoreExportFileFound": "No keystore to export",
"importKeystoreLabel": "Import keystore", "importKeystoreLabel": "Import keystore",
"importKeystoreHint": "Import keystore used to sign apps", "importKeystoreHint": "Import a keystore used to sign apps",
"importedKeystore": "Keystore imported", "importedKeystore": "Keystore imported",
"selectKeystorePassword": "Keystore Password", "selectKeystorePassword": "Keystore password",
"selectKeystorePasswordHint": "Select keystore password used to sign the apk", "selectKeystorePasswordHint": "Select keystore password used to sign apps",
"jsonSelectorErrorMessage": "Unable to use selected JSON file", "jsonSelectorErrorMessage": "Unable to use selected JSON file",
"keystoreSelectorErrorMessage": "Unable to use selected KEYSTORE file" "keystoreSelectorErrorMessage": "Unable to use selected keystore file"
}, },
"appInfoView": { "appInfoView": {
"widgetTitle": "App info", "widgetTitle": "App info",

View file

@ -2,37 +2,41 @@
ReVanced Manager has settings that can be configured to your liking. ReVanced Manager has settings that can be configured to your liking.
## Essential settings ## 🎛️ Essential settings
- ### 🔗 API URL - ### 🪛 Allow changing patch selection
API to use to fetch updates and ReVanced Patches from. Allows the user to change the patch selection from the default selection.
- ### 🔍 Version compatibility check
Constrains patches to supported app versions. Disable this to patch any version of an app.
> [!WARNING]
> Disabling this may cause issues if the patches are not compatible with the app version.
- ### 🧑‍🔬 Show universal patches
Reveals patches which can be applied to any app.
> [!WARNING]
> These patches may not work on all apps.
- ### 🧬 Sources - ### 🧬 Sources
Override the API and download ReVanced Patches from a different source. Override the API and download patches from a different source.
- ### 🧪 Experimental ReVanced Patches support - ### 🔗 API URL
Disable checking for the version of the app when applying ReVanced Patches. API to use to fetch updates and patches from.
> [!WARNING]
> This may cause issues if the ReVanced Patches are not compatible with the app version.
- ### 🧑‍🔬 Experimental universal support
This will show or hide ReVanced Patches, which are not meant for any app in particular but apply to all apps
> [!WARNING]
> Because the patches generalize the app, they may not work on all apps.
- ### 💾 Imports & Exports - ### 💾 Imports & Exports
You can import, export or reset the following settings: You can import, export or reset the following settings:
- 🔑 Keystore - 🔑 Keystore
- 📄 ReVanced Patches selection - 📄 Patch selection
- ⚙️ Options - ⚙️ Patch options
> [!NOTE] > [!NOTE]
> This is particularly useful if you want to backup or reset your settings. > This is particularly useful if you want to backup or reset your settings.
@ -45,4 +49,4 @@ ReVanced Manager has settings that can be configured to your liking.
The next page will bring you back to the usage page. The next page will bring you back to the usage page.
Continue: [🛠️ Usage](2_usage.md) Continue: [🛠️ Usage](2_usage.md)

BIN
fonts/custom-icons.ttf Normal file

Binary file not shown.

View file

@ -244,12 +244,12 @@ class ManagerAPI {
await _prefs.setBool('universalPatchesEnabled', value); await _prefs.setBool('universalPatchesEnabled', value);
} }
bool areExperimentalPatchesEnabled() { bool isVersionCompatibilityCheckEnabled() {
return _prefs.getBool('experimentalPatchesEnabled') ?? false; return _prefs.getBool('versionCompatibilityCheckEnabled') ?? true;
} }
Future<void> enableExperimentalPatchesStatus(bool value) async { Future<void> enableVersionCompatibilityCheckStatus(bool value) async {
await _prefs.setBool('experimentalPatchesEnabled', value); await _prefs.setBool('versionCompatibilityCheckEnabled', value);
} }
Future<void> setKeystorePassword(String password) async { Future<void> setKeystorePassword(String password) async {
@ -677,7 +677,7 @@ class ManagerAPI {
Future<List<String>> getDefaultPatches() async { Future<List<String>> getDefaultPatches() async {
final List<Patch> patches = await getPatches(); final List<Patch> patches = await getPatches();
final List<String> defaultPatches = []; final List<String> defaultPatches = [];
if (areExperimentalPatchesEnabled() == false) { if (isVersionCompatibilityCheckEnabled() == false) {
defaultPatches.addAll( defaultPatches.addAll(
patches patches
.where( .where(

View file

@ -198,9 +198,9 @@ class InstallerViewModel extends BaseViewModel {
'Patches: ${_patches.map((p) => p.name).toList().join(", ")}', 'Patches: ${_patches.map((p) => p.name).toList().join(", ")}',
'\n~ Settings', '\n~ Settings',
'Enabled changing patches: ${_managerAPI.isPatchesChangeEnabled()}', 'Allow changing patch selection: ${_managerAPI.isPatchesChangeEnabled()}',
'Enabled universal patches: ${_managerAPI.areUniversalPatchesEnabled()}', 'Show universal patches: ${_managerAPI.areUniversalPatchesEnabled()}',
'Enabled experimental patches: ${_managerAPI.areExperimentalPatchesEnabled()}', 'Version compatibility check: ${_managerAPI.isVersionCompatibilityCheckEnabled()}',
'Patches source: ${_managerAPI.getPatchesRepo()}', 'Patches source: ${_managerAPI.getPatchesRepo()}',
'Integration source: ${_managerAPI.getIntegrationsRepo()}', 'Integration source: ${_managerAPI.getIntegrationsRepo()}',

View file

@ -190,7 +190,7 @@ class PatcherViewModel extends BaseViewModel {
this.selectedPatches.clear(); this.selectedPatches.clear();
this.selectedPatches.addAll(patches.where((patch) => !patch.excluded)); this.selectedPatches.addAll(patches.where((patch) => !patch.excluded));
} }
if (!_managerAPI.areExperimentalPatchesEnabled()) { if (!_managerAPI.isVersionCompatibilityCheckEnabled()) {
this.selectedPatches.removeWhere((patch) => !isPatchSupported(patch)); this.selectedPatches.removeWhere((patch) => !isPatchSupported(patch));
} }
if (!_managerAPI.areUniversalPatchesEnabled()) { if (!_managerAPI.areUniversalPatchesEnabled()) {

View file

@ -169,7 +169,7 @@ class PatchesSelectorViewModel extends BaseViewModel {
.where( .where(
(element) => (element) =>
!element.excluded && !element.excluded &&
(_managerAPI.areExperimentalPatchesEnabled() || (_managerAPI.isVersionCompatibilityCheckEnabled() ||
isPatchSupported(element)), isPatchSupported(element)),
), ),
); );
@ -281,7 +281,7 @@ class PatchesSelectorViewModel extends BaseViewModel {
this.selectedPatches.addAll( this.selectedPatches.addAll(
patches.where((patch) => selectedPatches.contains(patch.name)), patches.where((patch) => selectedPatches.contains(patch.name)),
); );
if (!_managerAPI.areExperimentalPatchesEnabled()) { if (!_managerAPI.isVersionCompatibilityCheckEnabled()) {
this.selectedPatches.removeWhere((patch) => !isPatchSupported(patch)); this.selectedPatches.removeWhere((patch) => !isPatchSupported(patch));
} }
} else { } else {

View file

@ -6,8 +6,8 @@ import 'package:google_fonts/google_fonts.dart';
import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_update_theme.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_update_theme.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_advanced_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_advanced_section.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_debug_section.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_export_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_export_section.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_info_section.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_team_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_team_section.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart';
import 'package:stacked/stacked.dart'; import 'package:stacked/stacked.dart';
@ -46,15 +46,16 @@ class SettingsView extends StatelessWidget {
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
children: const [ children: const [
SUpdateThemeUI(), SUpdateThemeUI(),
// SUpdateLanguageUI(),
// _settingsDivider, // _settingsDivider,
STeamSection(), // SUpdateLanguageUI(),
_settingsDivider, _settingsDivider,
SAdvancedSection(), SAdvancedSection(),
_settingsDivider, _settingsDivider,
SExportSection(), SExportSection(),
_settingsDivider, _settingsDivider,
SInfoSection(), STeamSection(),
_settingsDivider,
SDebugSection(),
], ],
), ),
], ],

View file

@ -135,12 +135,12 @@ class SettingsViewModel extends BaseViewModel {
notifyListeners(); notifyListeners();
} }
bool areExperimentalPatchesEnabled() { bool isVersionCompatibilityCheckEnabled() {
return _managerAPI.areExperimentalPatchesEnabled(); return _managerAPI.isVersionCompatibilityCheckEnabled();
} }
void useExperimentalPatches(bool value) { void useVersionCompatibilityCheck(bool value) {
_managerAPI.enableExperimentalPatchesStatus(value); _managerAPI.enableVersionCompatibilityCheckStatus(value);
notifyListeners(); notifyListeners();
} }

View file

@ -75,7 +75,7 @@ class _LatestCommitCardState extends State<LatestCommitCard> {
const SizedBox(height: 16), const SizedBox(height: 16),
// ReVanced Patches // Patches
CustomCard( CustomCard(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -84,7 +84,7 @@ class _LatestCommitCardState extends State<LatestCommitCard> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
const Text('ReVanced Patches'), const Text('Patches'),
const SizedBox(height: 4), const SizedBox(height: 4),
Row( Row(
children: <Widget>[ children: <Widget>[

View file

@ -48,13 +48,12 @@ class _PatchItemState extends State<PatchItem> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
widget.isSelected = widget.isSelected && widget.isSelected = widget.isSelected &&
(!widget.isUnsupported || (!widget.isUnsupported ||
widget._managerAPI.areExperimentalPatchesEnabled()) && widget._managerAPI.isVersionCompatibilityCheckEnabled()) && !widget.hasUnsupportedPatchOption;
!widget.hasUnsupportedPatchOption;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0), padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Opacity( child: Opacity(
opacity: widget.isUnsupported && opacity: widget.isUnsupported &&
widget._managerAPI.areExperimentalPatchesEnabled() == false widget._managerAPI.isVersionCompatibilityCheckEnabled() == false
? 0.5 ? 0.5
: 1, : 1,
child: CustomCard( child: CustomCard(
@ -66,7 +65,7 @@ class _PatchItemState extends State<PatchItem> {
), ),
onTap: () { onTap: () {
if (widget.isUnsupported && if (widget.isUnsupported &&
!widget._managerAPI.areExperimentalPatchesEnabled()) { !widget._managerAPI.isVersionCompatibilityCheckEnabled()) {
widget.isSelected = false; widget.isSelected = false;
widget.toast.showBottom('patchItem.unsupportedPatchVersion'); widget.toast.showBottom('patchItem.unsupportedPatchVersion');
} else if (widget.isChangeEnabled) { } else if (widget.isChangeEnabled) {
@ -80,7 +79,7 @@ class _PatchItemState extends State<PatchItem> {
setState(() {}); setState(() {});
} }
if (!widget.isUnsupported || if (!widget.isUnsupported ||
widget._managerAPI.areExperimentalPatchesEnabled()) { widget._managerAPI.isVersionCompatibilityCheckEnabled()) {
widget.onChanged(widget.isSelected); widget.onChanged(widget.isSelected);
} }
}, },
@ -99,7 +98,7 @@ class _PatchItemState extends State<PatchItem> {
), ),
onChanged: (newValue) { onChanged: (newValue) {
if (widget.isUnsupported && if (widget.isUnsupported &&
!widget._managerAPI.areExperimentalPatchesEnabled()) { !widget._managerAPI.isVersionCompatibilityCheckEnabled()) {
widget.isSelected = false; widget.isSelected = false;
widget.toast.showBottom( widget.toast.showBottom(
'patchItem.unsupportedPatchVersion', 'patchItem.unsupportedPatchVersion',
@ -115,7 +114,7 @@ class _PatchItemState extends State<PatchItem> {
setState(() {}); setState(() {});
} }
if (!widget.isUnsupported || if (!widget.isUnsupported ||
widget._managerAPI.areExperimentalPatchesEnabled()) { widget._managerAPI.isVersionCompatibilityCheckEnabled()) {
widget.onChanged(widget.isSelected); widget.onChanged(widget.isSelected);
} }
}, },
@ -156,7 +155,7 @@ class _PatchItemState extends State<PatchItem> {
children: [ children: [
if (widget.isUnsupported && if (widget.isUnsupported &&
widget._managerAPI widget._managerAPI
.areExperimentalPatchesEnabled()) .isVersionCompatibilityCheckEnabled())
Padding( Padding(
padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8),
child: TextButton.icon( child: TextButton.icon(

View file

@ -1,18 +1,14 @@
// ignore_for_file: prefer_const_constructors // ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_i18n/widgets/I18nText.dart';
import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_api_url.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_api_url.dart';
import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_sources.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_sources.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_auto_update_patches.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_auto_update_patches.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_enable_patches_selection.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_enable_patches_selection.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_experimental_patches.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_experimental_universal_patches.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_material_button.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_universal_patches.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_version_compatibility_check.dart';
final _settingsViewModel = SettingsViewModel();
class SAdvancedSection extends StatelessWidget { class SAdvancedSection extends StatelessWidget {
const SAdvancedSection({super.key}); const SAdvancedSection({super.key});
@ -21,85 +17,14 @@ class SAdvancedSection extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SettingsSection( return SettingsSection(
title: 'settingsView.advancedSectionTitle', title: 'settingsView.advancedSectionTitle',
children: <Widget>[ children: const <Widget>[
SManageApiUrlUI(),
SManageSourcesUI(),
// SManageKeystorePasswordUI(),
SAutoUpdatePatches(), SAutoUpdatePatches(),
SEnablePatchesSelection(), SEnablePatchesSelection(),
SExperimentalUniversalPatches(), SVersionCompatibilityCheck(),
SExperimentalPatches(), SUniversalPatches(),
ListTile( SManageSourcesUI(),
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), SManageApiUrlUI(),
title: I18nText(
'settingsView.regenerateKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.regenerateKeystoreHint'),
onTap: () => _showDeleteKeystoreDialog(context),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.deleteTempDirLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.deleteTempDirHint'),
onTap: () => _settingsViewModel.deleteTempDir(),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.deleteLogsLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.deleteLogsHint'),
onTap: () => _settingsViewModel.deleteLogs(),
),
], ],
); );
} }
Future<void> _showDeleteKeystoreDialog(context) {
return showDialog(
context: context,
builder: (context) => AlertDialog(
title: I18nText('settingsView.regenerateKeystoreDialogTitle'),
backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
content: I18nText('settingsView.regenerateKeystoreDialogText'),
actions: <Widget>[
CustomMaterialButton(
isFilled: false,
label: I18nText('noButton'),
onPressed: () => Navigator.of(context).pop(),
),
CustomMaterialButton(
label: I18nText('yesButton'),
onPressed: () => {
Navigator.of(context).pop(),
_settingsViewModel.deleteKeystore(),
},
),
],
),
);
}
} }

View file

@ -0,0 +1,68 @@
import 'package:flutter/material.dart';
import 'package:flutter_i18n/widgets/I18nText.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/settingsView/about_widget.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart';
final _settingsViewModel = SettingsViewModel();
class SDebugSection extends StatelessWidget {
const SDebugSection({super.key});
@override
Widget build(BuildContext context) {
return SettingsSection(
title: 'settingsView.debugSectionTitle',
children: <Widget>[
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.logsLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.logsHint'),
onTap: () => _settingsViewModel.exportLogcatLogs(),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.deleteLogsLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.deleteLogsHint'),
onTap: () => _settingsViewModel.deleteLogs(),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.deleteTempDirLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.deleteTempDirHint'),
onTap: () => _settingsViewModel.deleteTempDir(),
),
const AboutWidget(
padding: EdgeInsets.symmetric(horizontal: 20.0),
),
],
);
}
}

View file

@ -45,42 +45,6 @@ class SExportSection extends StatelessWidget {
subtitle: I18nText('settingsView.importPatchesHint'), subtitle: I18nText('settingsView.importPatchesHint'),
onTap: () => _settingsViewModel.importPatches(context), onTap: () => _settingsViewModel.importPatches(context),
), ),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.exportKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.exportKeystoreHint'),
onTap: () => _settingsViewModel.exportKeystore(),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.importKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.importKeystoreHint'),
onTap: () async {
await _settingsViewModel.importKeystore();
final sManageKeystorePassword = SManageKeystorePassword();
if (context.mounted) {
sManageKeystorePassword.showKeystoreDialog(context);
}
},
),
ListTile( ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText( title: I18nText(
@ -121,6 +85,58 @@ class SExportSection extends StatelessWidget {
_settingsViewModel.resetAllOptions, _settingsViewModel.resetAllOptions,
), ),
), ),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.exportKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.exportKeystoreHint'),
onTap: () => _settingsViewModel.exportKeystore(),
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.importKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.importKeystoreHint'),
onTap: () async {
await _settingsViewModel.importKeystore();
final sManageKeystorePassword = SManageKeystorePassword();
if (context.mounted) {
sManageKeystorePassword.showKeystoreDialog(context);
}
},
),
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.regenerateKeystoreLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.regenerateKeystoreHint'),
onTap: () => _showDeleteKeystoreDialog(context),
),
// SManageKeystorePasswordUI(),
], ],
); );
} }
@ -154,4 +170,29 @@ class SExportSection extends StatelessWidget {
), ),
); );
} }
Future<void> _showDeleteKeystoreDialog(context) {
return showDialog(
context: context,
builder: (context) => AlertDialog(
title: I18nText('settingsView.regenerateKeystoreDialogTitle'),
backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
content: I18nText('settingsView.regenerateKeystoreDialogText'),
actions: <Widget>[
CustomMaterialButton(
isFilled: false,
label: I18nText('noButton'),
onPressed: () => Navigator.of(context).pop(),
),
CustomMaterialButton(
label: I18nText('yesButton'),
onPressed: () => {
Navigator.of(context).pop(),
_settingsViewModel.deleteKeystore(),
},
),
],
),
);
}
} }

View file

@ -1,38 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_i18n/widgets/I18nText.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/settingsView/about_widget.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart';
final _settingsViewModel = SettingsViewModel();
class SInfoSection extends StatelessWidget {
const SInfoSection({super.key});
@override
Widget build(BuildContext context) {
return SettingsSection(
title: 'settingsView.infoSectionTitle',
children: <Widget>[
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.logsLabel',
child: const Text(
'',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
subtitle: I18nText('settingsView.logsHint'),
onTap: () => _settingsViewModel.exportLogcatLogs(),
),
const AboutWidget(
padding: EdgeInsets.symmetric(horizontal: 20.0),
),
],
);
}
}

View file

@ -4,26 +4,26 @@ import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart';
import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
class SExperimentalUniversalPatches extends StatefulWidget { class SUniversalPatches extends StatefulWidget {
const SExperimentalUniversalPatches({super.key}); const SUniversalPatches({super.key});
@override @override
State<SExperimentalUniversalPatches> createState() => State<SUniversalPatches> createState() =>
_SExperimentalUniversalPatchesState(); _SUniversalPatchesState();
} }
final _settingsViewModel = SettingsViewModel(); final _settingsViewModel = SettingsViewModel();
final _patchesSelectorViewModel = PatchesSelectorViewModel(); final _patchesSelectorViewModel = PatchesSelectorViewModel();
final _patcherViewModel = PatcherViewModel(); final _patcherViewModel = PatcherViewModel();
class _SExperimentalUniversalPatchesState class _SUniversalPatchesState
extends State<SExperimentalUniversalPatches> { extends State<SUniversalPatches> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SwitchListTile( return SwitchListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText( title: I18nText(
'settingsView.experimentalUniversalPatchesLabel', 'settingsView.universalPatchesLabel',
child: const Text( child: const Text(
'', '',
style: TextStyle( style: TextStyle(
@ -32,7 +32,7 @@ class _SExperimentalUniversalPatchesState
), ),
), ),
), ),
subtitle: I18nText('settingsView.experimentalUniversalPatchesHint'), subtitle: I18nText('settingsView.universalPatchesHint'),
value: _settingsViewModel.areUniversalPatchesEnabled(), value: _settingsViewModel.areUniversalPatchesEnabled(),
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {

View file

@ -5,24 +5,24 @@ import 'package:revanced_manager/ui/views/patches_selector/patches_selector_view
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/utils/check_for_supported_patch.dart'; import 'package:revanced_manager/utils/check_for_supported_patch.dart';
class SExperimentalPatches extends StatefulWidget { class SVersionCompatibilityCheck extends StatefulWidget {
const SExperimentalPatches({super.key}); const SVersionCompatibilityCheck({super.key});
@override @override
State<SExperimentalPatches> createState() => _SExperimentalPatchesState(); State<SVersionCompatibilityCheck> createState() => _SVersionCompatibilityCheckState();
} }
final _settingsViewModel = SettingsViewModel(); final _settingsViewModel = SettingsViewModel();
final _patchesSelectorViewModel = PatchesSelectorViewModel(); final _patchesSelectorViewModel = PatchesSelectorViewModel();
final _patcherViewModel = PatcherViewModel(); final _patcherViewModel = PatcherViewModel();
class _SExperimentalPatchesState extends State<SExperimentalPatches> { class _SVersionCompatibilityCheckState extends State<SVersionCompatibilityCheck> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SwitchListTile( return SwitchListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText( title: I18nText(
'settingsView.experimentalPatchesLabel', 'settingsView.versionCompatibilityCheckLabel',
child: const Text( child: const Text(
'', '',
style: TextStyle( style: TextStyle(
@ -31,11 +31,11 @@ class _SExperimentalPatchesState extends State<SExperimentalPatches> {
), ),
), ),
), ),
subtitle: I18nText('settingsView.experimentalPatchesHint'), subtitle: I18nText('settingsView.versionCompatibilityCheckHint'),
value: _settingsViewModel.areExperimentalPatchesEnabled(), value: _settingsViewModel.isVersionCompatibilityCheckEnabled(),
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {
_settingsViewModel.useExperimentalPatches(value); _settingsViewModel.useVersionCompatibilityCheck(value);
}); });
if (!value) { if (!value) {
_patcherViewModel.selectedPatches _patcherViewModel.selectedPatches

View file

@ -4,6 +4,7 @@ import 'package:flutter_i18n/flutter_i18n.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:revanced_manager/ui/widgets/settingsView/social_media_item.dart'; import 'package:revanced_manager/ui/widgets/settingsView/social_media_item.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_icon.dart';
class SocialMediaWidget extends StatelessWidget { class SocialMediaWidget extends StatelessWidget {
const SocialMediaWidget({ const SocialMediaWidget({
@ -42,6 +43,12 @@ class SocialMediaWidget extends StatelessWidget {
child: const CustomCard( child: const CustomCard(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
SocialMediaItem(
icon: Icon(CustomIcon.revancedIcon),
title: Text('Website'),
subtitle: Text('revanced.app'),
url: 'https://revanced.app',
),
SocialMediaItem( SocialMediaItem(
icon: FaIcon(FontAwesomeIcons.github), icon: FaIcon(FontAwesomeIcons.github),
title: Text('GitHub'), title: Text('GitHub'),

View file

@ -0,0 +1,9 @@
import 'package:flutter/widgets.dart';
class CustomIcon {
CustomIcon._();
static const _kFontFam = 'CustomIcon';
static const IconData revancedIcon = IconData(0xe800, fontFamily: _kFontFam);
}

View file

@ -91,5 +91,9 @@ dev_dependencies:
flutter: flutter:
uses-material-design: true uses-material-design: true
fonts:
- family: CustomIcon
fonts:
- asset: fonts/custom-icons.ttf
assets: assets:
- assets/i18n/ - assets/i18n/