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 fe342599..ceb2409d 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 @@ -167,6 +167,22 @@ public class BackupsPreferencesFragment extends PreferencesFragment { }); return false; }); + + Preference testBackupsLocationPreference = requirePreference("pref_test_backups_location"); + testBackupsLocationPreference.setOnPreferenceClickListener(preference -> { + Uri backupsLocation = _prefs.getBackupsLocation(); + if (backupsLocation != null) { + boolean success = new VaultBackupManager(requireContext(), _auditLogRepository).testBackupLocation(backupsLocation); + if (success) { + Toast.makeText(requireContext(), "Test successful!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(requireContext(), "Test failed. Please check the backup location and permissions.", Toast.LENGTH_LONG).show(); + } + } else { + Toast.makeText(requireContext(), "No backup location set.", Toast.LENGTH_SHORT).show(); + } + return true; + }); } private void saveAndDisableBackupReminder(boolean understand) { @@ -198,6 +214,7 @@ public class BackupsPreferencesFragment extends PreferencesFragment { boolean androidBackupEnabled = _prefs.isAndroidBackupsEnabled() && encrypted; boolean backupEnabled = _prefs.isBackupsEnabled() && encrypted; boolean backupReminderEnabled = _prefs.isBackupReminderEnabled(); + requirePreference("pref_test_backups_location").setVisible(backupEnabled); _backupsPasswordWarningPreference.setVisible(_vaultManager.getVault().isBackupPasswordSet()); _androidBackupsPreference.setChecked(androidBackupEnabled); _androidBackupsPreference.setEnabled(encrypted); 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 813523ef..ead940c3 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultBackupManager.java @@ -86,7 +86,7 @@ public class VaultBackupManager { Log.i(TAG, String.format("Creating backup at %s", fileUri)); try { if (!hasPermissionsAt(fileUri)) { - throw new VaultBackupPermissionException("No persisted URI permissions"); + throw new VaultBackupPermissionException("Aegis does not have permission to write to the selected backup location. Please select the backup location again."); } ContentResolver resolver = _context.getContentResolver(); try (FileInputStream inStream = new FileInputStream(tempFile); @@ -116,7 +116,7 @@ public class VaultBackupManager { Log.i(TAG, String.format("Creating backup at %s: %s", Uri.decode(dir.getUri().toString()), fileInfo.toString())); if (!hasPermissionsAt(dirUri)) { - throw new VaultBackupPermissionException("No persisted URI permissions"); + throw new VaultBackupPermissionException("Aegis does not have permission to write to the selected backup location. Please select the backup location again."); } // If we create a file with a name that already exists, SAF will append a number @@ -160,6 +160,27 @@ public class VaultBackupManager { return false; } + public boolean testBackupLocation(Uri uri) { + if (uri == null) { + return false; + } + try { + DocumentFile dir = DocumentFile.fromTreeUri(_context, uri); + if (dir == null || !dir.isDirectory() || !dir.canWrite()) { + return false; + } + DocumentFile testFile = dir.createFile("text/plain", "aegis_test_file"); + if (testFile == null) { + return false; + } + testFile.delete(); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + private void enforceVersioning(DocumentFile dir, int versionsToKeep) { if (versionsToKeep <= 0) { return; diff --git a/app/src/main/res/xml/preferences_backups.xml b/app/src/main/res/xml/preferences_backups.xml index ed512e93..5bb6e6ff 100644 --- a/app/src/main/res/xml/preferences_backups.xml +++ b/app/src/main/res/xml/preferences_backups.xml @@ -31,6 +31,9 @@ android:key="pref_backups_location" android:title="@string/pref_backups_location_title" android:summary="@string/pref_backups_location_summary" /> +