From cb6913f6dd0b752d5f37c7e35d3a9e232cc19d2b Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 8 May 2018 15:14:19 +0200 Subject: [PATCH] Simplify backup code fragment --- .../keychain/ui/BackupCodeFragment.java | 418 ++---------------- .../main/res/layout/backup_code_fragment.xml | 212 +++------ .../res/menu/backup_fragment_debug_menu.xml | 10 - OpenKeychain/src/main/res/values/strings.xml | 2 + 4 files changed, 108 insertions(+), 534 deletions(-) delete mode 100644 OpenKeychain/src/main/res/menu/backup_fragment_debug_menu.xml diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java index 1f7b12820..3911a0f67 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BackupCodeFragment.java @@ -24,32 +24,19 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Handler; -import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentManager.OnBackStackChangedListener; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.view.animation.AccelerateInterpolator; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; @@ -60,48 +47,39 @@ import org.sufficientlysecure.keychain.service.BackupKeyringParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment; import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener; import org.sufficientlysecure.keychain.ui.util.Notify.Style; -import org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator; -import org.sufficientlysecure.keychain.util.Numeric9x4PassphraseUtil; import org.sufficientlysecure.keychain.util.FileHelper; +import org.sufficientlysecure.keychain.util.Numeric9x4PassphraseUtil; import org.sufficientlysecure.keychain.util.Passphrase; -public class BackupCodeFragment extends CryptoOperationFragment - implements OnBackStackChangedListener { +public class BackupCodeFragment extends CryptoOperationFragment { public static final String ARG_BACKUP_CODE = "backup_code"; - public static final String BACK_STACK_INPUT = "state_display"; public static final String ARG_EXPORT_SECRET = "export_secret"; public static final String ARG_EXECUTE_BACKUP_OPERATION = "execute_backup_operation"; public static final String ARG_MASTER_KEY_IDS = "master_key_ids"; - public static final String ARG_CURRENT_STATE = "current_state"; - public static final int REQUEST_SAVE = 1; - public static final String ARG_BACK_STACK = "back_stack"; - // argument variables private boolean mExportSecret; private long[] mMasterKeyIds; Passphrase mBackupCode; private boolean mExecuteBackupOperation; - private TextView[] mCodeEditText; - - private ToolableViewAnimator mStatusAnimator, mTitleAnimator, mCodeFieldsAnimator; - private Integer mBackStackLevel; - private Uri mCachedBackupUri; private boolean mShareNotSave; - private boolean mDebugModeAcceptAnyCode; + private View buttonSave; + private View buttonShare; + private View buttonExport; public static BackupCodeFragment newInstance(long[] masterKeyIds, boolean exportSecret, boolean executeBackupOperation) { BackupCodeFragment frag = new BackupCodeFragment(); + Passphrase backupCode = Numeric9x4PassphraseUtil.generateNumeric9x4Passphrase(); + Bundle args = new Bundle(); - args.putParcelable(ARG_BACKUP_CODE, Numeric9x4PassphraseUtil.generateNumeric9x4Passphrase()); + args.putParcelable(ARG_BACKUP_CODE, backupCode); args.putLongArray(ARG_MASTER_KEY_IDS, masterKeyIds); args.putBoolean(ARG_EXPORT_SECRET, exportSecret); args.putBoolean(ARG_EXECUTE_BACKUP_OPERATION, executeBackupOperation); @@ -110,142 +88,8 @@ public class BackupCodeFragment extends CryptoOperationFragment { mShareNotSave = false; startBackup(); - } - }); + }); - view.findViewById(R.id.button_backup_share).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { + buttonShare.setOnClickListener(v -> { mShareNotSave = true; startBackup(); - } - }); + }); + } else { + view.findViewById(R.id.button_bar_backup).setVisibility(View.GONE); + buttonExport.setVisibility(View.VISIBLE); + buttonExport.setOnClickListener(v -> startBackup()); + } - view.findViewById(R.id.button_backup_back).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - FragmentManager fragMan = getFragmentManager(); - if (fragMan != null) { - fragMan.popBackStack(); - } - } - }); + ((CheckBox) view.findViewById(R.id.check_backup_code_written)).setOnCheckedChangeListener( + (buttonView, isChecked) -> { + buttonSave.setEnabled(isChecked); + buttonShare.setEnabled(isChecked); + buttonExport.setEnabled(isChecked); + }); - view.findViewById(R.id.button_faq).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - showFaq(); - } - }); + view.findViewById(R.id.button_faq).setOnClickListener(v -> showFaq()); return view; } @@ -342,168 +165,7 @@ public class BackupCodeFragment extends CryptoOperationFragment= 0) { - mBackStackLevel = savedBackStack; - // unchecked use, we know that this one is available in onViewCreated - getFragmentManager().addOnBackStackChangedListener(this); - } - BackupCodeState savedState = BackupCodeState.values()[savedInstanceState.getInt(ARG_CURRENT_STATE)]; - switchState(savedState, false); - } else if (mCurrentState == BackupCodeState.STATE_UNINITIALIZED) { - switchState(BackupCodeState.STATE_DISPLAY, true); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putInt(ARG_CURRENT_STATE, mCurrentState.ordinal()); - outState.putInt(ARG_BACK_STACK, mBackStackLevel == null ? -1 : mBackStackLevel); - } - - private void setupEditTextSuccessListener(final TextView[] backupCodes) { - for (TextView backupCode : backupCodes) { - - backupCode.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) { - } - - @Override - public void afterTextChanged(Editable s) { - if (s.length() > 4) { - throw new AssertionError("max length of each field is 4!"); - } - - boolean inInputState = mCurrentState == BackupCodeState.STATE_INPUT - || mCurrentState == BackupCodeState.STATE_INPUT_ERROR; - boolean partIsComplete = s.length() == 4; - if (!inInputState || !partIsComplete) { - return; - } - - checkIfCodeIsCorrect(); - } - }); - - } - } - - private void checkIfCodeIsCorrect() { - - if (Constants.DEBUG && mDebugModeAcceptAnyCode) { - switchState(BackupCodeState.STATE_OK, true); - return; - } - - StringBuilder backupCodeInput = new StringBuilder(26); - for (TextView editText : mCodeEditText) { - if (editText.getText().length() < 4) { - return; - } - backupCodeInput.append(editText.getText()); - backupCodeInput.append('-'); - } - backupCodeInput.deleteCharAt(backupCodeInput.length() - 1); - - // if they don't match, do nothing - if (backupCodeInput.toString().equals(mBackupCode)) { - switchState(BackupCodeState.STATE_OK, true); - return; - } - - switchState(BackupCodeState.STATE_INPUT_ERROR, true); - - } - - private static void animateFlashText( - final TextView[] textViews, int color1, int color2, boolean staySecondColor) { - - ValueAnimator anim = ValueAnimator.ofObject(new ArgbEvaluator(), color1, color2); - anim.addUpdateListener(new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animator) { - for (TextView textView : textViews) { - textView.setTextColor((Integer) animator.getAnimatedValue()); - } - } - }); - anim.setRepeatMode(ValueAnimator.REVERSE); - anim.setRepeatCount(staySecondColor ? 4 : 5); - anim.setDuration(180); - anim.setInterpolator(new AccelerateInterpolator()); - anim.start(); - - } - - private static void setupEditTextFocusNext(final TextView[] 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) == 4; - - if (inserting && cursorAtEnd) { - backupCodes[next].requestFocus(); - } - } - - @Override - public void afterTextChanged(Editable s) { - } - }); - - } - } - - private void pushBackStackEntry() { - if (mBackStackLevel != null) { - return; - } - FragmentManager fragMan = getFragmentManager(); - mBackStackLevel = fragMan.getBackStackEntryCount(); - fragMan.beginTransaction().addToBackStack(BACK_STACK_INPUT).commit(); - fragMan.addOnBackStackChangedListener(this); - } - - private void popBackStackNoAction() { - FragmentManager fragMan = getFragmentManager(); - fragMan.removeOnBackStackChangedListener(this); - fragMan.popBackStackImmediate(BACK_STACK_INPUT, FragmentManager.POP_BACK_STACK_INCLUSIVE); - mBackStackLevel = null; - } - - @Override - public void onBackStackChanged() { - FragmentManager fragMan = getFragmentManager(); - if (mBackStackLevel != null && fragMan.getBackStackEntryCount() == mBackStackLevel) { - fragMan.removeOnBackStackChangedListener(this); - switchState(BackupCodeState.STATE_DISPLAY, true); - mBackStackLevel = null; - } - } - private void startBackup() { - FragmentActivity activity = getActivity(); if (activity == null) { return; @@ -514,15 +176,10 @@ public class BackupCodeFragment extends CryptoOperationFragment saveFile(filename, true), R.string.snack_btn_overwrite).show(); return; } diff --git a/OpenKeychain/src/main/res/layout/backup_code_fragment.xml b/OpenKeychain/src/main/res/layout/backup_code_fragment.xml index 3a4456b51..3798692a9 100644 --- a/OpenKeychain/src/main/res/layout/backup_code_fragment.xml +++ b/OpenKeychain/src/main/res/layout/backup_code_fragment.xml @@ -1,168 +1,98 @@ - + android:gravity="center_horizontal" + android:padding="10dp" + android:text="@string/backup_code_explanation" /> - + - + - - - - - - - - - - - - - - -