Compare commits

..
5 Commits
Author SHA1 Message Date
Michael Schättgen 27e56d60b5 Release v2.2.1
build / test (push) Canceled after 0s
build / build (push) Canceled after 0s
2023-09-06 23:49:51 +02:00
Michael SchättgenandGitHub aac77442bf Merge pull request #1175 from michaelschattgen/hotfix/biometrics-unlock
Fix biometrics unlock button on AuthActivity
2023-09-06 23:43:50 +02:00
Michael Schättgen c9cf6729e0 Fix biometrics unlock button on AuthActivity 2023-09-06 23:39:18 +02:00
Alexander BakkerandGitHub b916697391 Merge pull request #1171 from michaelschattgen/feature/import-duplicates
Add ability to skip duplicates during import
2023-09-06 12:49:23 +02:00
Michael Schättgen b205438982 Add ability to skip duplicates during import 2023-09-06 12:40:01 +02:00
6 changed files with 68 additions and 3 deletions
+2 -2
View File
@@ -27,8 +27,8 @@ android {
applicationId "${packageName}"
minSdkVersion 21
targetSdkVersion 33
versionCode 60
versionName "2.2"
versionCode 61
versionName "2.2.1"
multiDexEnabled true
buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\""
buildConfigField "String", "GIT_BRANCH", "\"${getGitBranch()}\""
+9
View File
@@ -31,6 +31,15 @@
</head>
<body>
<div></div>
<h3>Version 2.2.1</h3>
<h4>New</h4>
<ul>
<li>Ability to automatically skip potential duplicates when importing entries</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Biometrics button on the unlock screen was unresponsive</li>
</ul>
<h3>Version 2.2</h3>
<h4>New</h4>
<ul>
@@ -171,6 +171,8 @@ public class AuthActivity extends AegisActivity {
showBiometricPrompt();
})
.create());
} else {
showBiometricPrompt();
}
});
}
@@ -4,6 +4,7 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -26,15 +27,20 @@ import com.beemdevelopment.aegis.util.UUIDMap;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.beemdevelopment.aegis.vault.VaultRepository;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public class ImportEntriesActivity extends AegisActivity {
private View _view;
private Menu _menu;
private ImportEntriesAdapter _adapter;
private FabScrollHelper _fabScrollHelper;
@@ -48,6 +54,8 @@ public class ImportEntriesActivity extends AegisActivity {
setContentView(R.layout.activity_import_entries);
setSupportActionBar(findViewById(R.id.toolbar));
_view = findViewById(R.id.importEntriesRootView);
ActionBar bar = getSupportActionBar();
bar.setHomeAsUpIndicator(R.drawable.ic_close);
bar.setDisplayHomeAsUpEnabled(true);
@@ -180,6 +188,7 @@ public class ImportEntriesActivity extends AegisActivity {
}
private void importDatabase(DatabaseImporter.State state) {
List<ImportEntry> importEntries = new ArrayList<>();
DatabaseImporter.Result result;
try {
result = state.convert();
@@ -191,7 +200,9 @@ public class ImportEntriesActivity extends AegisActivity {
UUIDMap<VaultEntry> entries = result.getEntries();
for (VaultEntry entry : entries.getValues()) {
_adapter.addEntry(new ImportEntry(entry));
ImportEntry importEntry = new ImportEntry(entry);
_adapter.addEntry(importEntry);
importEntries.add(importEntry);
}
List<DatabaseImporterEntryException> errors = result.getErrors();
@@ -199,6 +210,8 @@ public class ImportEntriesActivity extends AegisActivity {
String message = getResources().getQuantityString(R.plurals.import_error_dialog, errors.size(), errors.size());
Dialogs.showMultiErrorDialog(this, R.string.import_error_title, message, errors, null);
}
findDuplicates(importEntries);
}
private void showWipeEntriesDialog() {
@@ -236,6 +249,33 @@ public class ImportEntriesActivity extends AegisActivity {
}
}
private void findDuplicates(List<ImportEntry> importEntries) {
List<UUID> duplicateEntries = new ArrayList<>();
for (ImportEntry importEntry: importEntries) {
boolean exists = _vaultManager.getVault().getEntries().stream().anyMatch(item ->
item.getIssuer().equals(importEntry.getEntry().getIssuer()) &&
Arrays.equals(item.getInfo().getSecret(), importEntry.getEntry().getInfo().getSecret()));
if (exists) {
duplicateEntries.add(importEntry.getEntry().getUUID());
}
}
if (duplicateEntries.size() == 0) {
return;
}
_adapter.setCheckboxStates(duplicateEntries, false);
Snackbar snackbar = Snackbar.make(_view, getResources().getQuantityString(R.plurals.import_duplicate_toast, duplicateEntries.size(), duplicateEntries.size()), Snackbar.LENGTH_INDEFINITE);
snackbar.setAction(R.string.undo, new View.OnClickListener() {
@Override
public void onClick(View v) {
_adapter.setCheckboxStates(duplicateEntries, true);
}
});
snackbar.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
_menu = menu;
@@ -12,6 +12,7 @@ import com.beemdevelopment.aegis.ui.models.ImportEntry;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ImportEntriesAdapter extends RecyclerView.Adapter<ImportEntryHolder> {
private List<ImportEntry> _entries;
@@ -67,6 +68,14 @@ public class ImportEntriesAdapter extends RecyclerView.Adapter<ImportEntryHolder
return entries;
}
public void setCheckboxStates(List<UUID> uuids, boolean state) {
for (ImportEntry entry : _entries) {
if(uuids.contains(entry.getEntry().getUUID())) {
entry.setIsChecked(state);
}
}
}
public void toggleCheckboxes() {
int checkedEntries = getCheckedEntries().size();
if (checkedEntries == 0 || checkedEntries != _entries.size()) {
+5
View File
@@ -159,6 +159,7 @@
<string name="share">Share</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="undo">Undo</string>
<string name="unlock">Unlock</string>
<string name="advanced">Advanced</string>
<string name="counter">Counter</string>
@@ -469,6 +470,10 @@
<string name="pref_panic_trigger_summary">Delete vault when a panic trigger is received from Ripple</string>
<string name="import_vault">Import vault</string>
<plurals name="import_duplicate_toast">
<item quantity="one">Unchecked %d potential duplicate. Please review the list of entries.</item>
<item quantity="other">Unchecked %d potential duplicates. Please review the list of entries.</item>
</plurals>
<string name="importer_help_2fas">Supply a 2FAS Authenticator backup file.</string>
<string name="importer_help_aegis">Supply an Aegis export/backup file.</string>
<string name="importer_help_authenticator_plus">Supply an Authenticator Plus export file obtained through <b>Settings -> Backup &amp; Restore -> Export as Text and HTML</b>.</string>