aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2016-02-10 17:15:16 +0100
committerDominik Schürmann <dominik@dominikschuermann.de>2016-02-10 18:48:27 +0100
commita2ea509f06242fa713e26081fded56590788f1a7 (patch)
tree83c519ebc06966c063e2c505316a0a2c15177b72
parent713f3076f4ee1b94f1a1a133fba32a396c0d1039 (diff)
downloadopen-keychain-a2ea509f06242fa713e26081fded56590788f1a7.tar.gz
open-keychain-a2ea509f06242fa713e26081fded56590788f1a7.tar.bz2
open-keychain-a2ea509f06242fa713e26081fded56590788f1a7.zip
Backup format v2: redesign restore dialog
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java68
-rw-r--r--OpenKeychain/src/main/res/layout/passphrase_dialog_backup_code.xml98
3 files changed, 34 insertions, 134 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java
index b6f102593..c4755c7c5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java
@@ -278,7 +278,7 @@ public class PgpDecryptVerifyOperation extends BaseOperation<PgpDecryptVerifyInp
ArmorHeaders armorHeaders = parseArmorHeaders(in, log, indent);
String charset = armorHeaders.charset;
boolean useBackupCode = false;
- if (armorHeaders.backupVersion != null && armorHeaders.backupVersion == 1) {
+ if (armorHeaders.backupVersion != null && armorHeaders.backupVersion == 2) {
useBackupCode = true;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
index 88616117f..f1edaccef 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014-2016 Dominik Schürmann <dominik@dominikschuermann.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -46,6 +46,8 @@ import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewAnimator;
+import com.github.pinball83.maskededittext.MaskedEditText;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey;
@@ -158,7 +160,7 @@ public class PassphraseDialogActivity extends FragmentActivity {
public static class PassphraseDialogFragment extends DialogFragment implements TextView.OnEditorActionListener {
private EditText mPassphraseEditText;
private TextView mPassphraseText;
- private EditText[] mBackupCodeEditText;
+ private MaskedEditText mBackupCodeEditText;
private boolean mIsCancelled = false;
private RequiredInputParcel mRequiredInput;
@@ -185,12 +187,13 @@ public class PassphraseDialogActivity extends FragmentActivity {
View view = inflater.inflate(R.layout.passphrase_dialog_backup_code, null);
alert.setView(view);
- mBackupCodeEditText = new EditText[4];
- mBackupCodeEditText[0] = (EditText) view.findViewById(R.id.backup_code_1);
- mBackupCodeEditText[1] = (EditText) view.findViewById(R.id.backup_code_2);
- mBackupCodeEditText[2] = (EditText) view.findViewById(R.id.backup_code_3);
- mBackupCodeEditText[3] = (EditText) view.findViewById(R.id.backup_code_4);
- setupEditTextFocusNext(mBackupCodeEditText);
+ mBackupCodeEditText = (MaskedEditText) view.findViewById(R.id.backup_code);
+ // NOTE: order of these method calls matter, see setupAutomaticLinebreak()
+ mBackupCodeEditText.setInputType(
+ InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
+ setupAutomaticLinebreak(mBackupCodeEditText);
+ mBackupCodeEditText.setImeActionLabel(getString(android.R.string.ok), EditorInfo.IME_ACTION_DONE);
+ mBackupCodeEditText.setOnEditorActionListener(this);
AlertDialog dialog = alert.create();
dialog.setButton(DialogInterface.BUTTON_POSITIVE,
@@ -324,32 +327,16 @@ public class PassphraseDialogActivity extends FragmentActivity {
return dialog;
}
- private static void setupEditTextFocusNext(final EditText[] backupCodes) {
- for (int i = 0; i < backupCodes.length - 1; i++) {
-
- final int next = i + 1;
-
- backupCodes[i].addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- boolean inserting = before < count;
- boolean cursorAtEnd = (start + count) == 6;
-
- if (inserting && cursorAtEnd) {
- backupCodes[next].requestFocus();
- }
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- }
- });
-
- }
+ /**
+ * Automatic line break with max 6 lines for smaller displays
+ * <p/>
+ * NOTE: I was not able to get this behaviour using XML!
+ * Looks like the order of these method calls matter, see http://stackoverflow.com/a/11171307
+ */
+ private void setupAutomaticLinebreak(TextView textview) {
+ textview.setSingleLine(true);
+ textview.setMaxLines(6);
+ textview.setHorizontallyScrolling(false);
}
@Override
@@ -363,17 +350,8 @@ public class PassphraseDialogActivity extends FragmentActivity {
public void onClick(View v) {
if (mRequiredInput.mType == RequiredInputType.BACKUP_CODE) {
- StringBuilder backupCodeInput = new StringBuilder(26);
- for (EditText editText : mBackupCodeEditText) {
- if (editText.getText().length() < 6) {
- return;
- }
- backupCodeInput.append(editText.getText());
- backupCodeInput.append('-');
- }
- backupCodeInput.deleteCharAt(backupCodeInput.length() - 1);
-
- Passphrase passphrase = new Passphrase(backupCodeInput.toString());
+ Passphrase passphrase =
+ new Passphrase(mBackupCodeEditText.getText().toString());
finishCaching(passphrase);
return;
diff --git a/OpenKeychain/src/main/res/layout/passphrase_dialog_backup_code.xml b/OpenKeychain/src/main/res/layout/passphrase_dialog_backup_code.xml
index 0ffa695cf..a55033380 100644
--- a/OpenKeychain/src/main/res/layout/passphrase_dialog_backup_code.xml
+++ b/OpenKeychain/src/main/res/layout/passphrase_dialog_backup_code.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -27,99 +28,20 @@
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp">
- <!--
- The most reliable way to correctly size these I found was to put a transparent hint on them.
- Theoretically, this should be what the android:ems attribute is for - didn't work for me.
- -->
- <EditText
- android:id="@+id/backup_code_1"
+ <com.github.pinball83.maskededittext.MaskedEditText
+ android:id="@+id/backup_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:hint="ABCDEF"
- android:inputType="textNoSuggestions|textCapCharacters"
- android:maxLength="6"
- android:singleLine="true"
- android:textColorHint="@android:color/transparent"
- android:textSize="14dp"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:textSize="18dp"
android:textStyle="bold"
android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- android:text="-"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <EditText
- android:id="@+id/backup_code_2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:hint="ABCDEF"
- android:inputType="textNoSuggestions|textCapCharacters"
- android:maxLength="6"
- android:singleLine="true"
- android:textColorHint="@android:color/transparent"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- android:text="-"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <EditText
- android:id="@+id/backup_code_3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:hint="ABCDEF"
- android:inputType="textNoSuggestions|textCapCharacters"
- android:maxLength="6"
- android:singleLine="true"
- android:textColorHint="@android:color/transparent"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- android:text="-"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
-
- <EditText
- android:id="@+id/backup_code_4"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:hint="ABCDEF"
- android:inputType="textNoSuggestions|textCapCharacters"
- android:maxLength="6"
- android:singleLine="true"
- android:textColorHint="@android:color/transparent"
- android:textSize="14dp"
- android:textStyle="bold"
- android:typeface="monospace"
- tools:ignore="HardcodedText,SpUsage" />
+ app:mask="****-****-****-****-****-****"
+ app:maskIconColor="@color/colorPrimary"
+ app:notMaskedSymbol="*"
+ tools:ignore="SpUsage" />
</LinearLayout>
</LinearLayout>