From fc8cdc65022cbcfb50d69931054c90dfbfb3a0dc Mon Sep 17 00:00:00 2001 From: r3dh3ck Date: Tue, 23 Jul 2024 06:08:52 +0000 Subject: [PATCH] Implement infinite backups --- .../beemdevelopment/aegis/Preferences.java | 1 + .../aegis/ui/dialogs/Dialogs.java | 25 ++++++++++++------- .../BackupsPreferencesFragment.java | 15 ++++++++--- .../aegis/vault/VaultBackupManager.java | 4 +++ app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java index d94668b1..0ccf77ee 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java +++ b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java @@ -33,6 +33,7 @@ public class Preferences { public static final int AUTO_LOCK_ON_BACK_BUTTON = 1 << 1; public static final int AUTO_LOCK_ON_MINIMIZE = 1 << 2; public static final int AUTO_LOCK_ON_DEVICE_LOCK = 1 << 3; + public static final int BACKUPS_VERSIONS_INFINITE = -1; public static final int[] AUTO_LOCK_SETTINGS = { AUTO_LOCK_ON_BACK_BUTTON, diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java index 4d14908d..5a427494 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java @@ -318,25 +318,32 @@ public class Dialogs { } public static void showBackupVersionsPickerDialog(Context context, int currentVersionCount, NumberInputListener listener) { - final int max = 30; - String[] numbers = new String[max / 5]; - for (int i = 0; i < numbers.length; i++) { - numbers[i] = Integer.toString(i * 5 + 5); + String infinite = context.getString(R.string.pref_backups_versions_infinite); + String[] values = {"5", "10", "15", "20", "25", "30", infinite}; + int[] numbers = {5, 10, 15, 20, 25, 30, Preferences.BACKUPS_VERSIONS_INFINITE}; + int selectedIndex; + if (currentVersionCount == Preferences.BACKUPS_VERSIONS_INFINITE) { + selectedIndex = numbers.length - 1; + } else { + selectedIndex = currentVersionCount / 5 - 1; } View view = LayoutInflater.from(context).inflate(R.layout.dialog_number_picker, null); NumberPicker numberPicker = view.findViewById(R.id.numberPicker); - numberPicker.setDisplayedValues(numbers); - numberPicker.setMaxValue(numbers.length - 1); + numberPicker.setDisplayedValues(values); + numberPicker.setMaxValue(values.length - 1); numberPicker.setMinValue(0); - numberPicker.setValue(currentVersionCount / 5 - 1); + numberPicker.setValue(selectedIndex); numberPicker.setWrapSelectorWheel(false); AlertDialog dialog = new MaterialAlertDialogBuilder(context) .setTitle(R.string.set_number) .setView(view) - .setPositiveButton(android.R.string.ok, (dialog1, which) -> - listener.onNumberInputResult(numberPicker.getValue())) + .setPositiveButton(android.R.string.ok, (dialog1, which) -> { + int index = numberPicker.getValue(); + int number = numbers[index]; + listener.onNumberInputResult(number); + }) .create(); showSecureDialog(dialog); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java index a2ec4fd5..cb9c6658 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/BackupsPreferencesFragment.java @@ -131,12 +131,11 @@ public class BackupsPreferencesFragment extends PreferencesFragment { }); _backupsVersionsPreference = requirePreference("pref_backups_versions"); - _backupsVersionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_backups_versions_summary, _prefs.getBackupsVersionCount(), _prefs.getBackupsVersionCount())); + updateBackupsVersionsSummary(); _backupsVersionsPreference.setOnPreferenceClickListener(preference -> { Dialogs.showBackupVersionsPickerDialog(requireContext(), _prefs.getBackupsVersionCount(), number -> { - number = number * 5 + 5; _prefs.setBackupsVersionCount(number); - _backupsVersionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_backups_versions_summary, _prefs.getBackupsVersionCount(), _prefs.getBackupsVersionCount())); + updateBackupsVersionsSummary(); }); return false; }); @@ -242,4 +241,14 @@ public class BackupsPreferencesFragment extends PreferencesFragment { Dialogs.showErrorDialog(requireContext(), R.string.backup_error, e); } } + + private void updateBackupsVersionsSummary() { + int count = _prefs.getBackupsVersionCount(); + if (count == Preferences.BACKUPS_VERSIONS_INFINITE) { + _backupsVersionsPreference.setSummary(R.string.pref_backups_versions_infinite_summary); + } else { + String summary = getResources().getQuantityString(R.plurals.pref_backups_versions_summary, count, count); + _backupsVersionsPreference.setSummary(summary); + } + } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java index 46d515c1..e235337d 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java @@ -118,6 +118,10 @@ public class VaultBackupManager { } private void enforceVersioning(DocumentFile dir, int versionsToKeep) { + if (versionsToKeep < 0) { + return; + } + Log.i(TAG, String.format("Scanning directory %s for backup files", Uri.decode(dir.getUri().toString()))); List files = new ArrayList<>(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9998e88e..6cc0ae54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,10 +66,12 @@ Trigger backup Manually trigger a backup Number of versions to keep + \u221E Keep %1$d version of the backup Keep %1$d versions of the backup + Keep an infinite number of versions of the backup Import from app Import tokens from an app (requires root access) Export