diff --git a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java index 78251446..5a113d63 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java +++ b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java @@ -160,6 +160,14 @@ public class Preferences { _prefs.edit().putInt("pref_backups_versions", versions).apply(); } + public void setBackupsError(Exception e) { + _prefs.edit().putString("pref_backups_error", e == null ? null : e.toString()).apply(); + } + + public String getBackupsError() { + return _prefs.getString("pref_backups_error", null); + } + public boolean isTimeSyncWarningEnabled() { return _prefs.getBoolean("pref_warn_time_sync", true); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java index ffce1906..2127126e 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AegisActivity.java @@ -122,9 +122,9 @@ public abstract class AegisActivity extends AppCompatActivity implements AegisAp this.getResources().updateConfiguration(config, this.getResources().getDisplayMetrics()); } - protected boolean saveVault() { + protected boolean saveVault(boolean backup) { try { - getApp().getVaultManager().save(); + getApp().getVaultManager().save(backup); return true; } catch (VaultManagerException e) { Toast.makeText(this, getString(R.string.saving_error), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java index 5fd7c049..00bef1f0 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java @@ -36,7 +36,6 @@ import com.beemdevelopment.aegis.helpers.UiThreadExecutor; import com.beemdevelopment.aegis.ui.tasks.PasswordSlotDecryptTask; import com.beemdevelopment.aegis.vault.VaultFile; import com.beemdevelopment.aegis.vault.VaultFileCredentials; -import com.beemdevelopment.aegis.vault.VaultManager; import com.beemdevelopment.aegis.vault.VaultManagerException; import com.beemdevelopment.aegis.vault.slots.BiometricSlot; import com.beemdevelopment.aegis.vault.slots.PasswordSlot; @@ -273,10 +272,9 @@ public class AuthActivity extends AegisActivity { } else { try { AegisApplication app = getApp(); - VaultManager vault = app.initVaultManager(app.loadVaultFile(), creds); + app.initVaultManager(app.loadVaultFile(), creds); if (isSlotRepaired) { - vault.setCredentials(creds); - saveVault(); + saveVault(true); } } catch (VaultManagerException e) { e.printStackTrace(); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index 7df7576f..2fd63dd9 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -467,7 +467,7 @@ public class EditEntryActivity extends AegisActivity { intent.putExtra("entryUUID", entry.getUUID()); intent.putExtra("delete", delete); - if (saveVault()) { + if (saveVault(true)) { setResult(RESULT_OK, intent); finish(); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java index c027256d..390681b8 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -16,6 +16,8 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SubMenu; +import android.view.View; +import android.widget.LinearLayout; import android.widget.Toast; import androidx.appcompat.view.ActionMode; @@ -81,6 +83,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene private SearchView _searchView; private FloatingActionsMenu _fabMenu; private EntryListView _entryListView; + private LinearLayout _btnBackupError; private FabScrollHelper _fabScrollHelper; @@ -125,6 +128,11 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene startScanActivity(); }); + _btnBackupError = findViewById(R.id.btn_backup_error); + _btnBackupError.setOnClickListener(view -> { + startPreferencesActivity("pref_backups"); + }); + _fabScrollHelper = new FabScrollHelper(_fabMenu); _selectedEntries = new ArrayList<>(); } @@ -264,7 +272,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } } - saveVault(); + saveVault(true); } } @@ -400,6 +408,12 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene startActivityForResult(Intent.createChooser(chooserIntent, getString(R.string.select_picture)), CODE_SCAN_IMAGE); } + private void startPreferencesActivity(String preference) { + Intent intent = new Intent(this, PreferencesActivity.class); + intent.putExtra("pref", preference); + startActivityForResult(intent, CODE_PREFERENCES); + } + private void doShortcutActions() { Intent intent = getIntent(); String action = intent.getStringExtra("action"); @@ -489,6 +503,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene handleDeeplink(); updateLockIcon(); doShortcutActions(); + updateBackupErrorBar(); } @Override @@ -517,7 +532,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene _entryListView.removeEntry(oldEntry); } - saveVault(); + saveVault(true); } @Override @@ -567,8 +582,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: { - Intent intent = new Intent(this, PreferencesActivity.class); - startActivityForResult(intent, CODE_PREFERENCES); + startPreferencesActivity(null); return true; } case R.id.action_about: { @@ -647,6 +661,15 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } } + private void updateBackupErrorBar() { + String error = null; + if (_app.getPreferences().isBackupsEnabled()) { + error = _app.getPreferences().getBackupsError(); + } + + _btnBackupError.setVisibility(error == null ? View.GONE : View.VISIBLE); + } + @Override public void onEntryClick(VaultEntry entry) { if (_actionMode != null) { @@ -694,12 +717,12 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene @Override public void onEntryDrop(VaultEntry entry) { - saveVault(); + saveVault(false); } @Override public void onEntryChange(VaultEntry entry) { - saveVault(); + saveVault(true); } public void onEntryCopy(VaultEntry entry) { diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java index 145ab158..e97d1663 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesActivity.java @@ -1,5 +1,6 @@ package com.beemdevelopment.aegis.ui; +import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; @@ -24,6 +25,18 @@ public class PreferencesActivity extends AegisActivity { } } + @Override + public void onResume() { + super.onResume(); + + Intent intent = getIntent(); + String preference = intent.getStringExtra("pref"); + if (preference != null) { + _fragment.scrollToPreference(preference); + intent.removeExtra("pref"); + } + } + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // pass permission request results to the fragment diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java index b5f907a4..103e0dfe 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java @@ -434,8 +434,8 @@ public class PreferencesFragment extends PreferenceFragmentCompat { } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + public void onResume() { + super.onResume(); updateEncryptionPreferences(); updateBackupPreference(); } @@ -749,13 +749,14 @@ public class PreferencesFragment extends PreferenceFragmentCompat { _prefs.setBackupsLocation(uri); _prefs.setIsBackupsEnabled(true); + _prefs.setBackupsError(null); _backupsLocationPreference.setSummary(String.format("%s: %s", getString(R.string.pref_backups_location_summary), Uri.decode(uri.toString()))); updateBackupPreference(); } private boolean saveVault() { try { - _vault.save(); + _vault.save(true); } catch (VaultManagerException e) { e.printStackTrace(); Dialogs.showErrorDialog(getContext(), R.string.saving_error, e); diff --git a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java index 3ef2fe67..10530bb5 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultManager.java @@ -96,7 +96,7 @@ public class VaultManager { } } - public void save() throws VaultManagerException { + public void save(boolean backup) throws VaultManagerException { try { JSONObject obj = _vault.toJson(); @@ -108,13 +108,18 @@ public class VaultManager { } save(_context, file); - - if (_prefs.isBackupsEnabled()) { - backup(); - } } catch (VaultFileException e) { throw new VaultManagerException(e); } + + if (backup && _prefs.isBackupsEnabled()) { + try { + backup(); + _prefs.setBackupsError(null); + } catch (VaultManagerException e) { + _prefs.setBackupsError(e); + } + } } public void export(OutputStream stream, boolean encrypt) throws VaultManagerException { @@ -190,11 +195,11 @@ public class VaultManager { public void enableEncryption(VaultFileCredentials creds) throws VaultManagerException { _creds = creds; - save(); + save(true); } public void disableEncryption() throws VaultManagerException { _creds = null; - save(); + save(true); } } diff --git a/app/src/main/res/drawable/ic_alert_black_24dp.xml b/app/src/main/res/drawable/ic_alert_black_24dp.xml new file mode 100644 index 00000000..6ed4cfd7 --- /dev/null +++ b/app/src/main/res/drawable/ic_alert_black_24dp.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6ad35c5c..970f3acb 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,12 +8,43 @@ android:fitsSystemWindows="true" tools:context="com.beemdevelopment.aegis.ui.MainActivity"> - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + Unrelated QR code found. Try restarting the scanner. Scanned %d/%d QR codes Expected QR code #%d, but scanned #%d instead + Vault backup failed recently body {