From 9f248e08023d2c0cf1ccb18a0313214c9b1312cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Sch=C3=A4ttgen?= Date: Mon, 14 Oct 2019 22:51:20 +0200 Subject: [PATCH] Add checkbox to toggle visibility in password fields Make string translatable --- .../com/beemdevelopment/aegis/ui/Dialogs.java | 19 +++++++++++++-- .../ui/slides/CustomAuthenticatedSlide.java | 24 +++++++++++++++++-- app/src/main/res/layout/dialog_password.xml | 10 +++++++- .../layout/fragment_authenticated_slide.xml | 7 ++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java index aa67dc09..bf47dfa2 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java @@ -9,10 +9,13 @@ import android.os.Build; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; +import android.text.method.PasswordTransformationMethod; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.NumberPicker; import android.widget.TextView; @@ -78,6 +81,18 @@ public class Dialogs { View view = activity.getLayoutInflater().inflate(R.layout.dialog_password, null); EditText textPassword = view.findViewById(R.id.text_password); EditText textPasswordConfirm = view.findViewById(R.id.text_password_confirm); + CheckBox switchToggleVisibility = view.findViewById(R.id.check_toggle_visibility); + + switchToggleVisibility.setOnCheckedChangeListener((CompoundButton.OnCheckedChangeListener) (buttonView, isChecked) -> { + if (isChecked) { + textPassword.setTransformationMethod(null); + textPassword.clearFocus(); + textPasswordConfirm.setEnabled(false); + } else { + textPassword.setTransformationMethod(new PasswordTransformationMethod()); + textPasswordConfirm.setEnabled(true); + } + }); AlertDialog dialog = new AlertDialog.Builder(activity) .setTitle(R.string.set_password) @@ -94,7 +109,7 @@ public class Dialogs { // replace the default listener button.setOnClickListener(v -> { - if (!EditTextHelper.areEditTextsEqual(textPassword, textPasswordConfirm)) { + if (!EditTextHelper.areEditTextsEqual(textPassword, textPasswordConfirm) && !switchToggleVisibility.isChecked()) { return; } @@ -119,7 +134,7 @@ public class Dialogs { TextWatcher watcher = new TextWatcher() { public void onTextChanged(CharSequence c, int start, int before, int count) { boolean equal = EditTextHelper.areEditTextsEqual(textPassword, textPasswordConfirm); - buttonOK.get().setEnabled(equal); + buttonOK.get().setEnabled(equal || switchToggleVisibility.isChecked()); } public void beforeTextChanged(CharSequence c, int start, int count, int after) { diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java index 84fc2908..dbb782f3 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java @@ -6,9 +6,12 @@ import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.Bundle; +import android.text.method.PasswordTransformationMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; @@ -34,6 +37,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH private int _cryptType; private EditText _textPassword; private EditText _textPasswordConfirm; + private CheckBox _checkPasswordVisibility; private int _bgColor; private LinearLayout _boxFingerprint; @@ -50,6 +54,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH final View view = inflater.inflate(R.layout.fragment_authenticated_slide, container, false); _textPassword = view.findViewById(R.id.text_password); _textPasswordConfirm = view.findViewById(R.id.text_password_confirm); + _checkPasswordVisibility = view.findViewById(R.id.check_toggle_visibility); _boxFingerprint = view.findViewById(R.id.box_fingerprint); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -58,6 +63,17 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH insertPoint.addView(_imgFingerprint, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); } + _checkPasswordVisibility.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + _textPassword.setTransformationMethod(null); + _textPassword.clearFocus(); + _textPasswordConfirm.setEnabled(false); + } else { + _textPassword.setTransformationMethod(new PasswordTransformationMethod()); + _textPasswordConfirm.setEnabled(true); + } + }); + _textFingerprint = view.findViewById(R.id.text_fingerprint); view.findViewById(R.id.main).setBackgroundColor(_bgColor); return view; @@ -147,7 +163,11 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH } // intentional fallthrough case CustomAuthenticationSlide.CRYPT_TYPE_PASS: - return EditTextHelper.areEditTextsEqual(_textPassword, _textPasswordConfirm); + if (EditTextHelper.getEditTextChars(_textPassword).length > 0) { + return EditTextHelper.areEditTextsEqual(_textPassword, _textPasswordConfirm) || _checkPasswordVisibility.isChecked(); + } + + return false; default: throw new RuntimeException(); } @@ -156,7 +176,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH @Override public void onUserIllegallyRequestedNextPage() { String message; - if (!EditTextHelper.areEditTextsEqual(_textPassword, _textPasswordConfirm)) { + if (!EditTextHelper.areEditTextsEqual(_textPassword, _textPasswordConfirm) && !_checkPasswordVisibility.isChecked()) { message = getString(R.string.password_equality_error); } else if (!_fingerAuthenticated) { message = getString(R.string.register_fingerprint); diff --git a/app/src/main/res/layout/dialog_password.xml b/app/src/main/res/layout/dialog_password.xml index d73ae2c7..63e5094b 100644 --- a/app/src/main/res/layout/dialog_password.xml +++ b/app/src/main/res/layout/dialog_password.xml @@ -4,8 +4,9 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:paddingStart="20dp" + android:paddingBottom="10dp" android:paddingEnd="20dp" - android:paddingTop="20dp"> + android:paddingTop="10dp"> + + diff --git a/app/src/main/res/layout/fragment_authenticated_slide.xml b/app/src/main/res/layout/fragment_authenticated_slide.xml index 8c14b03a..40b3b847 100644 --- a/app/src/main/res/layout/fragment_authenticated_slide.xml +++ b/app/src/main/res/layout/fragment_authenticated_slide.xml @@ -59,6 +59,13 @@ android:layout_alignParentStart="true" android:layout_alignParentEnd="true"/> + + Delete Password Confirm password + Show password New profile Add new profile Couldn\'t unlock vault