diff --git a/app/src/main/java/com/beautycoder/applicationlockscreenexample/MainActivity.java b/app/src/main/java/com/beautycoder/applicationlockscreenexample/MainActivity.java index 5e444d7..cced4c1 100644 --- a/app/src/main/java/com/beautycoder/applicationlockscreenexample/MainActivity.java +++ b/app/src/main/java/com/beautycoder/applicationlockscreenexample/MainActivity.java @@ -25,38 +25,43 @@ protected void onCreate(Bundle savedInstanceState) { private final PFLockScreenFragment.OnPFLockScreenCodeCreateListener mCodeCreateListener = new PFLockScreenFragment.OnPFLockScreenCodeCreateListener() { - @Override - public void onCodeCreated(String encodedCode) { - Toast.makeText(MainActivity.this, "Code created", Toast.LENGTH_SHORT).show(); - PreferencesSettings.saveToPref(MainActivity.this, encodedCode); - } - }; + @Override + public void onCodeCreated(String encodedCode) { + Toast.makeText(MainActivity.this, "Code created", Toast.LENGTH_SHORT).show(); + PreferencesSettings.saveToPref(MainActivity.this, encodedCode); + } + + @Override + public void onNewCodeValidationFailed() { + Toast.makeText(MainActivity.this, "Code validation error", Toast.LENGTH_SHORT).show(); + } + }; private final PFLockScreenFragment.OnPFLockScreenLoginListener mLoginListener = new PFLockScreenFragment.OnPFLockScreenLoginListener() { - @Override - public void onCodeInputSuccessful() { - Toast.makeText(MainActivity.this, "Code successfull", Toast.LENGTH_SHORT).show(); - showMainFragment(); - } + @Override + public void onCodeInputSuccessful() { + Toast.makeText(MainActivity.this, "Code successfull", Toast.LENGTH_SHORT).show(); + showMainFragment(); + } - @Override - public void onFingerprintSuccessful() { - Toast.makeText(MainActivity.this, "Fingerprint successfull", Toast.LENGTH_SHORT).show(); - showMainFragment(); - } + @Override + public void onFingerprintSuccessful() { + Toast.makeText(MainActivity.this, "Fingerprint successfull", Toast.LENGTH_SHORT).show(); + showMainFragment(); + } - @Override - public void onPinLoginFailed() { - Toast.makeText(MainActivity.this, "Pin failed", Toast.LENGTH_SHORT).show(); - } + @Override + public void onPinLoginFailed() { + Toast.makeText(MainActivity.this, "Pin failed", Toast.LENGTH_SHORT).show(); + } - @Override - public void onFingerprintLoginFailed() { - Toast.makeText(MainActivity.this, "Fingerprint failed", Toast.LENGTH_SHORT).show(); - } - }; + @Override + public void onFingerprintLoginFailed() { + Toast.makeText(MainActivity.this, "Fingerprint failed", Toast.LENGTH_SHORT).show(); + } + }; private void showLockScreenFragment() { new PFPinCodeViewModel().isPinCodeEncryptionKeyExist().observe( @@ -80,8 +85,10 @@ public void onChanged(@Nullable PFResult result) { private void showLockScreenFragment(boolean isPinExist) { final PFFLockScreenConfiguration.Builder builder = new PFFLockScreenConfiguration.Builder(this) .setTitle(isPinExist ? "Unlock with your pin code or fingerprint" : "Create Code") - .setCodeLength(6) + .setCodeLength(4) .setLeftButton("Can't remeber") + .setNewCodeValidation(true) + .setNewCodeValidationTitle("Please input code again") .setUseFingerprint(true); final PFLockScreenFragment fragment = new PFLockScreenFragment(); @@ -107,12 +114,11 @@ public void onClick(View v) { } - private void showMainFragment() { + private void showMainFragment() { final MainFragment fragment = new MainFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.container_view, fragment).commit(); } - } diff --git a/pflockscreen/src/androidTest/java/com/beautycoder/pflockscreen/PFLockScreenFragmentAuthTest.java b/pflockscreen/src/androidTest/java/com/beautycoder/pflockscreen/PFLockScreenFragmentAuthTest.java index f424c6e..0f2eb8e 100644 --- a/pflockscreen/src/androidTest/java/com/beautycoder/pflockscreen/PFLockScreenFragmentAuthTest.java +++ b/pflockscreen/src/androidTest/java/com/beautycoder/pflockscreen/PFLockScreenFragmentAuthTest.java @@ -41,15 +41,16 @@ public PFLockScreenFragment getInstance(Context context) { final PFFLockScreenConfiguration.Builder builder = new PFFLockScreenConfiguration.Builder(context) .setCodeLength(CODE_LENGTH) - .setLeftButton(LEFT_BUTTON, new View.OnClickListener() { - @Override - public void onClick(View v) { - - } - }) + .setLeftButton(LEFT_BUTTON) .setUseFingerprint(true) .setMode(PFFLockScreenConfiguration.MODE_AUTH); fragment.setConfiguration(builder.build()); + fragment.setOnLeftButtonClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); return fragment; } }; diff --git a/pflockscreen/src/main/java/com/beautycoder/pflockscreen/PFFLockScreenConfiguration.java b/pflockscreen/src/main/java/com/beautycoder/pflockscreen/PFFLockScreenConfiguration.java index b8ad852..6d0c5b5 100644 --- a/pflockscreen/src/main/java/com/beautycoder/pflockscreen/PFFLockScreenConfiguration.java +++ b/pflockscreen/src/main/java/com/beautycoder/pflockscreen/PFFLockScreenConfiguration.java @@ -23,6 +23,8 @@ public class PFFLockScreenConfiguration implements Serializable { private boolean mClearCodeOnError = false; private boolean mErrorVibration = true; private boolean mErrorAnimation = true; + private boolean mNewCodeValidation = false; + private String mNewCodeValidationTitle = ""; private PFFLockScreenConfiguration(Builder builder) { mLeftButton = builder.mLeftButton; @@ -35,6 +37,8 @@ private PFFLockScreenConfiguration(Builder builder) { mClearCodeOnError = builder.mClearCodeOnError; mErrorVibration = builder.mErrorVibration; mErrorAnimation = builder.mErrorAnimation; + mNewCodeValidation = builder.mNewCodeValidation; + mNewCodeValidationTitle = builder.mNewCodeValidationTitle; } public String getLeftButton() { @@ -73,6 +77,14 @@ public boolean isErrorAnimation() { return mErrorAnimation; } + public boolean isNewCodeValidation() { + return mNewCodeValidation; + } + + public String getNewCodeValidationTitle() { + return mNewCodeValidationTitle; + } + @PFLockScreenMode public int getMode() { return this.mMode; @@ -90,6 +102,8 @@ public static class Builder { private boolean mClearCodeOnError = false; private boolean mErrorVibration = true; private boolean mErrorAnimation = true; + private boolean mNewCodeValidation = false; + private String mNewCodeValidationTitle = ""; public Builder(Context context) { @@ -146,6 +160,16 @@ public Builder setErrorAnimation(boolean errorAnimation) { return this; } + public Builder setNewCodeValidation(boolean newCodeValidation) { + this.mNewCodeValidation = newCodeValidation; + return this; + } + + public Builder setNewCodeValidationTitle(String newCodeValidationTitle) { + this.mNewCodeValidationTitle = newCodeValidationTitle; + return this; + } + public PFFLockScreenConfiguration build() { return new PFFLockScreenConfiguration( this); diff --git a/pflockscreen/src/main/java/com/beautycoder/pflockscreen/fragments/PFLockScreenFragment.java b/pflockscreen/src/main/java/com/beautycoder/pflockscreen/fragments/PFLockScreenFragment.java index db35a3f..5ef925c 100644 --- a/pflockscreen/src/main/java/com/beautycoder/pflockscreen/fragments/PFLockScreenFragment.java +++ b/pflockscreen/src/main/java/com/beautycoder/pflockscreen/fragments/PFLockScreenFragment.java @@ -49,6 +49,7 @@ public class PFLockScreenFragment extends Fragment { private TextView mLeftButton; private Button mNextButton; private PFCodeView mCodeView; + private TextView titleView; private boolean mUseFingerPrint = true; private boolean mFingerprintHardwareDetected = false; @@ -57,6 +58,7 @@ public class PFLockScreenFragment extends Fragment { private OnPFLockScreenCodeCreateListener mCodeCreateListener; private OnPFLockScreenLoginListener mLoginListener; private String mCode = ""; + private String mCodeValidation = ""; private String mEncodedPinCode = ""; private PFFLockScreenConfiguration mConfiguration; @@ -130,7 +132,7 @@ private void applyConfiguration(PFFLockScreenConfiguration configuration) { if (mRootView == null || configuration == null) { return; } - final TextView titleView = mRootView.findViewById(R.id.title_text_view); + titleView = mRootView.findViewById(R.id.title_text_view); titleView.setText(configuration.getTitle()); if (TextUtils.isEmpty(configuration.getLeftButton())) { mLeftButton.setVisibility(View.GONE); @@ -351,6 +353,19 @@ public void onCodeNotCompleted(String code) { private final View.OnClickListener mOnNextButtonClickListener = new View.OnClickListener() { @Override public void onClick(View v) { + if (mConfiguration.isNewCodeValidation() && TextUtils.isEmpty(mCodeValidation)) { + mCodeValidation = mCode; + cleanCode(); + titleView.setText(mConfiguration.getNewCodeValidationTitle()); + return; + } + if (mConfiguration.isNewCodeValidation() && !TextUtils.isEmpty(mCodeValidation) && !mCode.equals(mCodeValidation)) { + mCodeCreateListener.onNewCodeValidationFailed(); + titleView.setText(mConfiguration.getTitle()); + cleanCode(); + return; + } + mCodeValidation = ""; mPFPinCodeViewModel.encodePin(getContext(), mCode).observe( PFLockScreenFragment.this, new Observer>() { @@ -374,6 +389,11 @@ public void onChanged(@Nullable PFResult result) { } }; + private void cleanCode() { + mCode = ""; + mCodeView.clearCode(); + } + private void deleteEncodeKey() { mPFPinCodeViewModel.delete().observe( @@ -471,6 +491,13 @@ public interface OnPFLockScreenCodeCreateListener { */ void onCodeCreated(String encodedCode); + /** + * This will be called if PFFLockScreenConfiguration#newCodeValidation is true. + * User need to input new code twice. This method will be called when second code isn't + * the same as first. + */ + void onNewCodeValidationFailed(); + }