Skip to content

Commit 7cbdeca

Browse files
authored
Merge pull request #1766 from michaelschattgen/feature/otpauth-uri-add
Add ability to import otpauth uri from clipboard
2 parents b5e21a5 + 170cd93 commit 7cbdeca

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import android.text.Spannable;
1818
import android.text.SpannableStringBuilder;
1919
import android.text.style.StyleSpan;
20+
import android.util.Log;
2021
import android.view.KeyEvent;
2122
import android.view.LayoutInflater;
2223
import android.view.Menu;
@@ -63,6 +64,7 @@
6364
import com.beemdevelopment.aegis.ui.tasks.IconOptimizationTask;
6465
import com.beemdevelopment.aegis.ui.tasks.QrDecodeTask;
6566
import com.beemdevelopment.aegis.ui.views.EntryListView;
67+
import com.beemdevelopment.aegis.util.ClipboardUtils;
6668
import com.beemdevelopment.aegis.util.TimeUtils;
6769
import com.beemdevelopment.aegis.util.UUIDMap;
6870
import com.beemdevelopment.aegis.vault.VaultEntry;
@@ -89,7 +91,6 @@
8991
import java.util.List;
9092
import java.util.Map;
9193
import java.util.Objects;
92-
import java.util.SequencedMap;
9394
import java.util.Set;
9495
import java.util.UUID;
9596
import java.util.concurrent.atomic.AtomicReference;
@@ -252,7 +253,7 @@ protected void onCreate(Bundle savedInstanceState) {
252253
LinkedHashMap<View, Runnable> actions = new LinkedHashMap<>();
253254
actions.put(fabMenuLayout.findViewById(R.id.fab_menu_item_scan), this::startScanActivity);
254255
actions.put(fabMenuLayout.findViewById(R.id.fab_menu_item_scan_image), this::startScanImageActivity);
255-
actions.put(fabMenuLayout.findViewById(R.id.fab_menu_item_enter), this::startEditEntryActivityForManual);
256+
actions.put(fabMenuLayout.findViewById(R.id.fab_menu_item_enter), this::startEditEntryActivity);
256257

257258
_fabMenuHelper = new FabMenuHelper(scrimOverlay, menuItemsContainer, fab, actions);
258259
_fabMenuHelper.setOnFabMenuStateChangeListener(_fabMenuBackPressHandler::setEnabled);
@@ -470,6 +471,34 @@ private void onPreferencesResult() {
470471
}
471472
}
472473

474+
private void startEditEntryActivity() {
475+
String clip = ClipboardUtils.readText(this);
476+
if (clip != null) {
477+
GoogleAuthInfo parsed;
478+
try {
479+
parsed = GoogleAuthInfo.parseUri(clip.trim());
480+
String message = getString(
481+
R.string.import_from_clipboard_message,
482+
parsed.getAccountName(),
483+
parsed.getIssuer()
484+
);
485+
486+
Dialogs.showSecureDialog(new MaterialAlertDialogBuilder(this)
487+
.setTitle(R.string.import_from_clipboard_title)
488+
.setMessage(message)
489+
.setPositiveButton(R.string.yes, (dialog, which) -> startEditEntryActivityForNew(new VaultEntry(parsed)))
490+
.setNegativeButton(R.string.no, (dialog, which) -> startEditEntryActivityForManual())
491+
.create());
492+
493+
return;
494+
} catch (GoogleAuthInfoException e) {
495+
Log.i("EntryActivity", "Clipboard did not contain a valid otpauth URI", e);
496+
}
497+
}
498+
499+
startEditEntryActivityForManual();
500+
}
501+
473502
private void startEditEntryActivityForNew(VaultEntry entry) {
474503
Intent intent = new Intent(this, EditEntryActivity.class);
475504
intent.putExtra("newEntry", entry);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.beemdevelopment.aegis.util;
2+
3+
import android.content.ClipData;
4+
import android.content.ClipboardManager;
5+
import android.content.Context;
6+
7+
public final class ClipboardUtils {
8+
public static String readText(Context context) {
9+
ClipboardManager clipboard =
10+
(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
11+
12+
if (clipboard == null) {
13+
return null;
14+
}
15+
16+
ClipData clip = clipboard.getPrimaryClip();
17+
if (clip == null || clip.getItemCount() == 0) {
18+
return null;
19+
}
20+
21+
ClipData.Item item = clip.getItemAt(0);
22+
CharSequence cs = item.coerceToText(context);
23+
if (cs == null) {
24+
return null;
25+
}
26+
27+
String text = cs.toString().trim();
28+
if (text.isEmpty()) {
29+
return null;
30+
}
31+
32+
return text;
33+
}
34+
}

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,10 @@
539539
<string name="dialog_wipe_entries_message">Your vault already contains entries. Do you want to remove these entries before importing this file?\n\n<b>In doing so, you will permanently lose access to the existing entries in the vault.</b></string>
540540
<string name="dialog_wipe_entries_checkbox">Wipe vault contents</string>
541541

542+
<string name="import_from_clipboard_title">Import from clipboard</string>
543+
544+
<string name="import_from_clipboard_message">We found a valid otpauth uri on your clipboard.\n\n<b>Name</b>: %1$s\n<b>Issuer</b>: %2$s\n\nDo you want to use it to prefill this entry?</string>
545+
542546
<string name="panic_trigger_ignore_toast">Aegis received panic trigger but setting is disabled, ignoring</string>
543547
<string name="pref_panic_trigger_title">Delete vault on panic trigger</string>
544548
<string name="pref_panic_trigger_summary">Delete vault when a panic trigger is received from Ripple</string>

0 commit comments

Comments
 (0)