From 80b8374eaa85d97c6c14b52359354473810363d2 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 19 May 2017 14:44:59 +0200 Subject: [PATCH 1/2] remove passphrase fragment from key creation --- .../keychain/ui/CreateKeyActivityTest.java | 2 + .../keychain/ui/CreateKeyEmailFragment.java | 2 +- .../ui/CreateKeyPassphraseFragment.java | 211 ------------------ 3 files changed, 3 insertions(+), 212 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java diff --git a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java index 3e165d4a7..a02078d8e 100644 --- a/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java +++ b/OpenKeychain/src/androidTest/java/org/sufficientlysecure/keychain/ui/CreateKeyActivityTest.java @@ -62,6 +62,7 @@ public class CreateKeyActivityTest { //@Test public void testCreateMyKey() { + /* mActivity.getActivity(); @@ -198,6 +199,7 @@ public class CreateKeyActivityTest { // Clicks create key onView(withId(R.id.create_key_next_button)) .perform(click()); + */ } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java index a4c9e4375..1b246595c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java @@ -222,7 +222,7 @@ public class CreateKeyEmailFragment extends Fragment { CreateSecurityTokenPinFragment frag = CreateSecurityTokenPinFragment.newInstance(); mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); } else { - CreateKeyPassphraseFragment frag = CreateKeyPassphraseFragment.newInstance(); + CreateKeyFinalFragment frag = CreateKeyFinalFragment.newInstance(); mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java deleted file mode 100644 index 1a65dba0b..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyPassphraseFragment.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.method.HideReturnsTransformationMethod; -import android.text.method.PasswordTransformationMethod; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; - -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; -import org.sufficientlysecure.keychain.ui.widget.PassphraseEditText; -import org.sufficientlysecure.keychain.util.Passphrase; - -public class CreateKeyPassphraseFragment extends Fragment { - - // view - CreateKeyActivity mCreateKeyActivity; - PassphraseEditText mPassphraseEdit; - EditText mPassphraseEditAgain; - CheckBox mShowPassphrase; - View mBackButton; - View mNextButton; - - /** - * Creates new instance of this fragment - */ - public static CreateKeyPassphraseFragment newInstance() { - CreateKeyPassphraseFragment frag = new CreateKeyPassphraseFragment(); - - Bundle args = new Bundle(); - frag.setArguments(args); - - return frag; - } - - /** - * Checks if text of given EditText is not empty. If it is empty an error is - * set and the EditText gets the focus. - * - * @param context - * @param editText - * @return true if EditText is not empty - */ - private static boolean isEditTextNotEmpty(Context context, EditText editText) { - boolean output = true; - if (editText.getText().length() == 0) { - editText.setError(context.getString(R.string.create_key_empty)); - editText.requestFocus(); - output = false; - } else { - editText.setError(null); - } - - return output; - } - - private static boolean areEditTextsEqual(EditText editText1, EditText editText2) { - Passphrase p1 = new Passphrase(editText1); - Passphrase p2 = new Passphrase(editText2); - return (p1.equals(p2)); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.create_key_passphrase_fragment, container, false); - - mPassphraseEdit = view.findViewById(R.id.create_key_passphrase); - mPassphraseEditAgain = view.findViewById(R.id.create_key_passphrase_again); - mShowPassphrase = view.findViewById(R.id.create_key_show_passphrase); - mBackButton = view.findViewById(R.id.create_key_back_button); - mNextButton = view.findViewById(R.id.create_key_next_button); - - // initial values - // TODO: using String here is unsafe... - if (mCreateKeyActivity.mPassphrase != null) { - mPassphraseEdit.setText(mCreateKeyActivity.mPassphrase.toStringUnsafe()); - mPassphraseEditAgain.setText(mCreateKeyActivity.mPassphrase.toStringUnsafe()); - } - - mPassphraseEdit.requestFocus(); - mBackButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - back(); - } - }); - mNextButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - nextClicked(); - } - }); - mShowPassphrase.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - mPassphraseEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); - mPassphraseEditAgain.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); - } else { - mPassphraseEdit.setTransformationMethod(PasswordTransformationMethod.getInstance()); - mPassphraseEditAgain.setTransformationMethod(PasswordTransformationMethod.getInstance()); - } - } - }); - - TextWatcher textWatcher = 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) { - if (!isEditTextNotEmpty(getActivity(), mPassphraseEdit)) { - mPassphraseEditAgain.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - return; - } - - if (areEditTextsEqual(mPassphraseEdit, mPassphraseEditAgain)) { - mPassphraseEditAgain.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_stat_retyped_ok, 0); - } else { - mPassphraseEditAgain.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_stat_retyped_bad, 0); - } - - } - - @Override - public void afterTextChanged(Editable s) { - - } - }; - - mPassphraseEdit.addTextChangedListener(textWatcher); - mPassphraseEditAgain.addTextChangedListener(textWatcher); - - return view; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - mCreateKeyActivity = (CreateKeyActivity) getActivity(); - } - - private void back() { - hideKeyboard(); - mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT); - } - - private void nextClicked() { - if (isEditTextNotEmpty(getActivity(), mPassphraseEdit)) { - - if (!areEditTextsEqual(mPassphraseEdit, mPassphraseEditAgain)) { - mPassphraseEditAgain.setError(getActivity().getApplicationContext().getString(R.string.create_key_passphrases_not_equal)); - mPassphraseEditAgain.requestFocus(); - return; - } - - mPassphraseEditAgain.setError(null); - // save state - mCreateKeyActivity.mPassphrase = new Passphrase(mPassphraseEdit); - - CreateKeyFinalFragment frag = CreateKeyFinalFragment.newInstance(); - hideKeyboard(); - mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); - } - } - - private void hideKeyboard() { - if (getActivity() == null) { - return; - } - InputMethodManager inputManager = (InputMethodManager) getActivity() - .getSystemService(Context.INPUT_METHOD_SERVICE); - - // check if no view has focus - View v = getActivity().getCurrentFocus(); - if (v == null) - return; - - inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); - } - -} From 37865f5c0c44ab57643f65253cfc6e4b659bc32d Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 19 May 2017 14:49:57 +0200 Subject: [PATCH 2/2] ditch password strength indicator --- .../dialog/SetPassphraseDialogFragment.java | 6 +- .../ui/widget/PassphraseEditText.java | 86 ----- .../ui/widget/PasswordStrengthBarView.java | 114 ------ .../ui/widget/PasswordStrengthView.java | 362 ------------------ .../layout/create_key_passphrase_fragment.xml | 106 ----- .../res/layout/passphrase_repeat_dialog.xml | 35 +- OpenKeychain/src/main/res/values/attr.xml | 14 - 7 files changed, 11 insertions(+), 712 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PassphraseEditText.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthBarView.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java delete mode 100644 OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java index 374e46323..6f5f5d816 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java @@ -17,8 +17,8 @@ package org.sufficientlysecure.keychain.ui.dialog; + import android.app.Activity; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -27,6 +27,7 @@ import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -41,7 +42,6 @@ import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.widget.PassphraseEditText; import org.sufficientlysecure.keychain.util.Passphrase; import timber.log.Timber; @@ -55,7 +55,7 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi public static final String MESSAGE_NEW_PASSPHRASE = "new_passphrase"; private Messenger mMessenger; - private PassphraseEditText mPassphraseEditText; + private EditText mPassphraseEditText; private EditText mPassphraseAgainEditText; private CheckBox mNoPassphraseCheckBox; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PassphraseEditText.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PassphraseEditText.java deleted file mode 100644 index e371c5464..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PassphraseEditText.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2017 Schürmann & Breitmoser GbR - * - * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import android.graphics.Canvas; -import android.support.v7.widget.AppCompatEditText; -import android.text.Editable; -import android.text.TextWatcher; -import android.util.AttributeSet; -import android.util.TypedValue; - -public class PassphraseEditText extends AppCompatEditText { - - PasswordStrengthBarView mPasswordStrengthBarView; - int mPasswordBarWidth; - int mPasswordBarHeight; - float barGap; - - public PassphraseEditText(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - private void init(Context context, AttributeSet attrs) { - mPasswordBarHeight = (int) (8 * getResources().getDisplayMetrics().density); - mPasswordBarWidth = (int) (50 * getResources().getDisplayMetrics().density); - - barGap = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, - getContext().getResources().getDisplayMetrics()); - - this.setPadding(getPaddingLeft(), getPaddingTop(), - getPaddingRight() + (int) barGap + mPasswordBarWidth, getPaddingBottom()); - - mPasswordStrengthBarView = new PasswordStrengthBarView(context, attrs); - mPasswordStrengthBarView.setShowGuides(false); - - this.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) { - mPasswordStrengthBarView.setPassword(s.toString()); - } - - @Override - public void afterTextChanged(Editable s) { - - } - }); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - mPasswordStrengthBarView.layout(0, 0, mPasswordBarWidth, mPasswordBarHeight); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - float translateX = getScrollX() + canvas.getWidth() - mPasswordBarWidth; - float translateY = (canvas.getHeight() - mPasswordBarHeight) / 2; - canvas.translate(translateX, translateY); - mPasswordStrengthBarView.draw(canvas); - canvas.translate(-translateX, -translateY); - } -} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthBarView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthBarView.java deleted file mode 100644 index e5886345f..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthBarView.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2014 Matt Allen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; - -/** - * Created by matt on 04/07/2014. - * https://github.com/matt-allen/android-password-strength-indicator - */ -public class PasswordStrengthBarView extends PasswordStrengthView { - - public PasswordStrengthBarView(Context context, AttributeSet attrs) { - super(context, attrs); - mMinHeight = 80; - mMinWidth = 300; - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - generateIndicatorColor(); - // Default to full width - int indWidth = mIndicatorWidth; - // If score, leave it as full - can cause it to become - // less than full width in this calculation - if (mCurrentScore < 20) indWidth = (mIndicatorWidth / 20) * mCurrentScore; - // Draw indicator - canvas.drawRect( - getPaddingLeft(), - getPaddingTop(), - indWidth, - mIndicatorHeight, - mIndicatorPaint - ); - // Draw guides if true - if (mShowGuides) { - // TODO: Try and do this with a loop, for efficiency - // Draw bottom guide border - float positionY = getHeight() - getPaddingBottom() - getPaddingTop(); - float notchHeight = (float) (positionY * 0.8); - canvas.drawLine( - getPaddingLeft(), - positionY, - getWidth() - getPaddingRight(), - positionY, - mGuidePaint); - // Show left-most notch - canvas.drawLine( - getPaddingLeft(), - positionY, - getPaddingLeft(), - notchHeight, - mGuidePaint - ); - // Show middle-left notch - canvas.drawLine( - (float) (mIndicatorWidth * 0.25) + getPaddingLeft(), - positionY, - (float) (mIndicatorWidth * 0.25) + getPaddingLeft(), - notchHeight, - mGuidePaint - ); - // Show the middle notch - canvas.drawLine( - (float) (mIndicatorWidth * 0.5) + getPaddingLeft(), - positionY, - (float) (mIndicatorWidth * 0.5) + getPaddingLeft(), - notchHeight, - mGuidePaint - ); - // Show the middle-right notch - canvas.drawLine( - (float) (mIndicatorWidth * 0.75) + getPaddingLeft(), - positionY, - (float) (mIndicatorWidth * 0.75) + getPaddingLeft(), - notchHeight, - mGuidePaint - ); - // Show the right-most notch - canvas.drawLine( - mIndicatorWidth + getPaddingLeft(), - positionY, - mIndicatorWidth + getPaddingLeft(), - notchHeight, - mGuidePaint - ); - } - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java deleted file mode 100644 index c1c0e9efa..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2014 Matt Allen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.sufficientlysecure.keychain.ui.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Color; -import android.graphics.Paint; -import android.util.AttributeSet; -import android.view.View; - -import org.sufficientlysecure.keychain.R; - - -/** - * Created by Matt Allen - * 01/07/14 - * http://www.mattallensoftware.co.uk - * mattallen092@gmail.com - *

- * https://github.com/matt-allen/android-password-strength-indicator - *

- *

- * This View is designed to indicate how secure a user-entered password is in a visual way to - * relay to the user if they need to make it stronger. The strength of the password can be set - * at creation (or after) which will decide whether their password is strong enough. - *

- *

- *

- * The password strength is decided by an index of 20. The minimum score needed to pass is 10 - * which means the String has met the conditions imposed by the strength test, but can be improved. - * If the password scores 10-19 it is considered weak, and only if it scores 20 will it be - * considered strong. - *

- */ -public class PasswordStrengthView extends View { - - protected int mMinWidth; - protected int mMinHeight; - - protected Paint mIndicatorPaint; - protected Paint mGuidePaint; - - protected int mIndicatorHeight; - protected int mIndicatorWidth; - protected int mCurrentScore; - - protected int mColorFail; - protected int mColorWeak; - protected int mColorStrong; - - protected boolean mShowGuides = true; - - /** - * Used to define that the indicator should only be looking - * for a weak password. The bare minimum is used here to let - * the user continue. - */ - public static final int STRENGTH_WEAK = 0; - - /** - * A fairly strict rule for generating a password. It encourages a password that is - * less easy to crack. - */ - public static final int STRENGTH_MEDIUM = 1; - - /** - * A strong algorithm that encourages very strong passwords that should be fairly long, with - * non-alphanumeric, numbers, and upper case. - */ - public static final int STRENGTH_STRONG = 2; - - private int mStrengthRequirement = -1; - protected String mPassword; - - public PasswordStrengthView(Context context, AttributeSet attrs) { - super(context, attrs); - - int COLOR_FAIL = getResources().getColor(R.color.password_strength_low); - int COLOR_WEAK = getResources().getColor(R.color.password_strength_medium); - int COLOR_STRONG = getResources().getColor(R.color.password_strength_high); - - TypedArray style = context.getTheme().obtainStyledAttributes( - attrs, - R.styleable.PasswordStrengthView, - 0, 0); - - mStrengthRequirement = style.getInteger(R.styleable.PasswordStrengthView_strength, - STRENGTH_MEDIUM); - mShowGuides = style.getBoolean(R.styleable.PasswordStrengthView_showGuides, true); - mColorFail = style.getColor(R.styleable.PasswordStrengthView_color_fail, COLOR_FAIL); - mColorWeak = style.getColor(R.styleable.PasswordStrengthView_color_weak, COLOR_WEAK); - mColorStrong = style.getColor(R.styleable.PasswordStrengthView_color_strong, - COLOR_STRONG); - - // Create and style the paint used for drawing the guide on the indicator - mGuidePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mGuidePaint.setStyle(Paint.Style.FILL_AND_STROKE); - mGuidePaint.setColor(Color.BLACK); - // Create and style paint for indicator - mIndicatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mIndicatorPaint.setStyle(Paint.Style.FILL); - - style.recycle(); - - } - - /** - * This view can determine if the password entered by the user is acceptable for - * use by your use case. This is based on the strength requirement you have set. - * - * @return True if requirement has been met - */ - public boolean isStrengthRequirementMet() { - return (mCurrentScore >= 10); - } - - /** - * Change the strength requirement of the password entered by the user. This will also - * re-check the password already entered against these new requirements. - * - * @param requiredStrength Use the public constants of this class to set - */ - public void setStrengthRequirement(int requiredStrength) { - if (requiredStrength >= 0 && requiredStrength <= 2) { - mStrengthRequirement = requiredStrength; - if (mPassword != null && mPassword.length() > 0) { - generatePasswordScore(); - // Update view with new score - invalidate(); - requestLayout(); - } - } else { - throw new IndexOutOfBoundsException("Input out of expected range"); - } - } - - /** - * Update the password string to check strength of - * - * @param passwordString String representation of user-input - */ - public void setPassword(String passwordString) { - if (passwordString != null && passwordString.length() > 0) { - mPassword = passwordString; - generatePasswordScore(); - } else { - mPassword = ""; - mCurrentScore = 0; - } - - // Update view with new score - invalidate(); - requestLayout(); - } - - /** - * Private convenience method for adding to the password score - * - * @param score Amount to be added to current score - */ - protected void addToPasswordScore(int score) { - int newScore = mCurrentScore + score; - - // Limit max score - if (newScore > 20) { - mCurrentScore = 20; - } else { - mCurrentScore = newScore; - } - } - - /** - * Call this to determine the current strength requirement set on the algorithm - * - * @return Int representation of the current strength set for the indicator - */ - public int getStrengthRequirement() { - return mStrengthRequirement; - } - - /** - * Generate a score based on the password. The password will already need to be stored - * as a class member before running this. - */ - protected void generatePasswordScore() { - mCurrentScore = 0; - int upperCase = getUppercaseCount(mPassword); - int nonAlpha = getNonAlphanumericCount(mPassword); - int numbers = getNumberCount(mPassword); - switch (mStrengthRequirement) { - case STRENGTH_WEAK: - addToPasswordScore(mPassword.length() * 2); - addToPasswordScore(upperCase * 2); - addToPasswordScore(nonAlpha * 2); - addToPasswordScore(numbers * 2); - break; - - case STRENGTH_MEDIUM: - addToPasswordScore(mPassword.length()); - addToPasswordScore(upperCase); - addToPasswordScore(nonAlpha * 2); - addToPasswordScore(numbers); - break; - - case STRENGTH_STRONG: - addToPasswordScore(mPassword.length() / 2); - // Cut the score in half to make this a very high requirement - addToPasswordScore(upperCase); - addToPasswordScore(nonAlpha); - addToPasswordScore(numbers); - break; - } - } - - @Override - protected void onSizeChanged(int w, int h, int oldW, int oldH) { - super.onSizeChanged(w, h, oldW, oldH); - int paddingX = getPaddingLeft(); - int paddingY = getPaddingTop(); - mIndicatorHeight = h - paddingY; - mIndicatorWidth = w - paddingX; - } - - /** - * The standard parts of the onMeasure needed to create the password strength - * indicator. Subclasses should call super.onMeasure, but also need to set - * the minimum height and width in the constructor. - * - * @param widthMeasureSpec The measurement given by the system - * @param heightMeasureSpec The measurement given by the system - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Set minimum space for the view to do it's thing - int minW = getPaddingLeft() + getPaddingRight() + mMinWidth; - int w = resolveSizeAndState(minW, widthMeasureSpec, 1); - // And give it enough height so it's visible - int minH = mMinHeight + getPaddingBottom() + getPaddingTop(); - int h = resolveSizeAndState(minH, heightMeasureSpec, 0); - // Feed these back into UIKit - setMeasuredDimension(w, h); - } - - /** - * Set the colour of the indicator {@code Paint} to one that is appropriate - * for the strength of the password. - */ - protected void generateIndicatorColor() { - int color = mColorFail; - if (mCurrentScore >= 18) { - color = mColorStrong; - } else if (mCurrentScore >= 10) { - color = mColorWeak; - } - mIndicatorPaint.setColor(color); - } - - /** - * Quick method to determine how many of the characters in a given string are upper case - * - * @param stringToCheck The string to examine - * @return Number of upper case characters - */ - protected int getUppercaseCount(String stringToCheck) { - int score = 0; - int loops = stringToCheck.length() - 1; - for (int i = 0; i <= loops; i++) { - if (Character.isUpperCase(stringToCheck.charAt(i))) { - score++; - } - } - return score; - } - - /** - * A convenience method to determine how many characters in the given String aren't - * letters or numbers. - * - * @param stringToCheck - * @return Number of characters that aren't numbers or letters - */ - protected int getNonAlphanumericCount(String stringToCheck) { - int score = 0; - int loops = stringToCheck.length() - 1; - for (int i = 0; i <= loops; i++) { - if (!Character.isLetter(stringToCheck.charAt(i)) && - !Character.isDigit(stringToCheck.charAt(i))) { - score++; - } - } - return score; - } - - /** - * A convenience method for returning the count of numbers in a given String. - * - * @param stringToCheck - * @return The numbers of digits in the String - */ - protected int getNumberCount(String stringToCheck) { - int score = 0; - int loops = stringToCheck.length() - 1; - for (int i = 0; i <= loops; i++) { - if (Character.isDigit(stringToCheck.charAt(i))) { - score++; - } - } - return score; - } - - /** - * Set the guides to show on the view.
- * On the line style, the guides will show underneath
- * On the rounded style, the guides will be shown on the outer edges.
- * The view will be redrawn after the method is called. - * - * @param showGuides True if you want the guides to be shown - */ - public void setShowGuides(boolean showGuides) { - mShowGuides = showGuides; - if (mPassword != null && mPassword.length() > 0) { - generatePasswordScore(); - } else { - mCurrentScore = 0; - } - - invalidate(); - requestLayout(); - } - - /** - * Determine whether the view is showing the guides for the password score - * - * @return True if the guides are being shown - */ - public boolean isShowingGuides() { - return mShowGuides; - } -} diff --git a/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml deleted file mode 100644 index 9368aa1ef..000000000 --- a/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml index 9ce8f01fa..c2330f31d 100644 --- a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml +++ b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml @@ -15,36 +15,17 @@ android:layout_height="wrap_content" android:text="@string/label_no_passphrase" /> - - - - - - - + android:layout_marginBottom="8dp" + android:imeOptions="actionNext" + android:hint="@string/label_passphrase" + android:inputType="textPassword" + android:ems="10" + android:layout_gravity="center_horizontal" /> - - - - - - - - - - - - -