Fix lockout state for auto pin confirm
In Autoconfirmation, if we lockout, we want to have the backspace key have the same behavior as the enter key. We also want to remove pin hinting. Fixes: 281661030 Test: autoconfirmation, long press backspace key Test: autoconfirmation lockout and regular authenticate Change-Id: Ia1128b9d2f98b1758b23e3a75909900810fd051a
This commit is contained in:
@@ -16,8 +16,6 @@
|
||||
|
||||
package com.android.keyguard;
|
||||
|
||||
import static com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants.DEFAULT_PIN_LENGTH;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import com.android.internal.util.LatencyTracker;
|
||||
@@ -42,10 +40,9 @@ public class KeyguardPinViewController
|
||||
private NumPadButton mBackspaceKey;
|
||||
private View mOkButton = mView.findViewById(R.id.key_enter);
|
||||
|
||||
private int mUserId;
|
||||
private long mPinLength;
|
||||
|
||||
private int mPasswordFailedAttempts;
|
||||
private boolean mDisabledAutoConfirmation;
|
||||
|
||||
protected KeyguardPinViewController(KeyguardPINView view,
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
@@ -84,9 +81,8 @@ public class KeyguardPinViewController
|
||||
|
||||
protected void onUserInput() {
|
||||
super.onUserInput();
|
||||
if (isAutoConfirmation()) {
|
||||
updateOKButtonVisibility();
|
||||
updateBackSpaceVisibility();
|
||||
if (isAutoPinConfirmEnabledInSettings()) {
|
||||
updateAutoConfirmationState();
|
||||
if (mPasswordEntry.getText().length() == mPinLength
|
||||
&& mOkButton.getVisibility() == View.INVISIBLE) {
|
||||
verifyPasswordAndUnlock();
|
||||
@@ -103,13 +99,9 @@ public class KeyguardPinViewController
|
||||
@Override
|
||||
public void startAppearAnimation() {
|
||||
if (mFeatureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)) {
|
||||
mUserId = KeyguardUpdateMonitor.getCurrentUser();
|
||||
mPinLength = mLockPatternUtils.getPinLength(mUserId);
|
||||
mBackspaceKey.setTransparentMode(/* isTransparentMode= */ isAutoConfirmation());
|
||||
updateOKButtonVisibility();
|
||||
updateBackSpaceVisibility();
|
||||
mPinLength = mLockPatternUtils.getPinLength(KeyguardUpdateMonitor.getCurrentUser());
|
||||
mPasswordEntry.setUsePinShapes(true);
|
||||
mPasswordEntry.setIsPinHinting(isAutoConfirmation() && isPinHinting());
|
||||
updateAutoConfirmationState();
|
||||
}
|
||||
super.startAppearAnimation();
|
||||
}
|
||||
@@ -120,13 +112,25 @@ public class KeyguardPinViewController
|
||||
mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleAttemptLockout(long elapsedRealtimeDeadline) {
|
||||
super.handleAttemptLockout(elapsedRealtimeDeadline);
|
||||
updateAutoConfirmationState();
|
||||
}
|
||||
|
||||
private void updateAutoConfirmationState() {
|
||||
mDisabledAutoConfirmation = mLockPatternUtils.getCurrentFailedPasswordAttempts(
|
||||
KeyguardUpdateMonitor.getCurrentUser()) >= MIN_FAILED_PIN_ATTEMPTS;
|
||||
updateOKButtonVisibility();
|
||||
updateBackSpaceVisibility();
|
||||
updatePinHinting();
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the visibility of the OK button for auto confirm feature
|
||||
*/
|
||||
private void updateOKButtonVisibility() {
|
||||
mPasswordFailedAttempts = mLockPatternUtils.getCurrentFailedPasswordAttempts(mUserId);
|
||||
if (isAutoConfirmation() && mPasswordFailedAttempts < MIN_FAILED_PIN_ATTEMPTS) {
|
||||
if (isAutoPinConfirmEnabledInSettings() && !mDisabledAutoConfirmation) {
|
||||
mOkButton.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
mOkButton.setVisibility(View.VISIBLE);
|
||||
@@ -134,33 +138,41 @@ public class KeyguardPinViewController
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the visibility and the enabled state of the backspace.
|
||||
* Updates the visibility and the enabled state of the backspace.
|
||||
* Visibility changes are only for auto confirmation configuration.
|
||||
*/
|
||||
private void updateBackSpaceVisibility() {
|
||||
if (!isAutoConfirmation()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mPasswordEntry.getText().length() > 0) {
|
||||
mBackspaceKey.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mBackspaceKey.setVisibility(View.INVISIBLE);
|
||||
boolean isAutoConfirmation = isAutoPinConfirmEnabledInSettings();
|
||||
mBackspaceKey.setTransparentMode(/* isTransparentMode= */
|
||||
isAutoConfirmation && !mDisabledAutoConfirmation);
|
||||
if (isAutoConfirmation) {
|
||||
if (mPasswordEntry.getText().length() > 0
|
||||
|| mDisabledAutoConfirmation) {
|
||||
mBackspaceKey.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mBackspaceKey.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Updates whether to use pin hinting or not. */
|
||||
void updatePinHinting() {
|
||||
mPasswordEntry.setIsPinHinting(isAutoPinConfirmEnabledInSettings() && isPinHinting()
|
||||
&& !mDisabledAutoConfirmation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Responsible for identifying if PIN hinting is to be enabled or not
|
||||
* Responsible for identifying if PIN hinting is to be enabled or not
|
||||
*/
|
||||
private boolean isPinHinting() {
|
||||
return mLockPatternUtils.getPinLength(mUserId) == DEFAULT_PIN_LENGTH;
|
||||
return mLockPatternUtils.getPinLength(KeyguardUpdateMonitor.getCurrentUser())
|
||||
== DEFAULT_PIN_LENGTH;
|
||||
}
|
||||
|
||||
/**
|
||||
* Responsible for identifying if auto confirm is enabled or not in Settings
|
||||
* Responsible for identifying if auto confirm is enabled or not in Settings
|
||||
*/
|
||||
private boolean isAutoConfirmation() {
|
||||
private boolean isAutoPinConfirmEnabledInSettings() {
|
||||
//Checks if user has enabled the auto confirm in Settings
|
||||
return mLockPatternUtils.isAutoPinConfirmEnabled(mUserId);
|
||||
return mLockPatternUtils.isAutoPinConfirmEnabled(KeyguardUpdateMonitor.getCurrentUser());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +116,12 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni
|
||||
* @param isTransparentMode
|
||||
*/
|
||||
public void setTransparentMode(boolean isTransparentMode) {
|
||||
if (mIsTransparentMode == isTransparentMode) {
|
||||
return;
|
||||
}
|
||||
|
||||
mIsTransparentMode = isTransparentMode;
|
||||
|
||||
if (isTransparentMode) {
|
||||
setBackgroundColor(getResources().getColor(android.R.color.transparent));
|
||||
} else {
|
||||
|
||||
@@ -101,6 +101,7 @@ public class PasswordTextView extends FrameLayout {
|
||||
private Interpolator mFastOutSlowInInterpolator;
|
||||
private boolean mShowPassword = true;
|
||||
private UserActivityListener mUserActivityListener;
|
||||
private boolean mIsPinHinting;
|
||||
private PinShapeInput mPinShapeInput;
|
||||
private boolean mUsePinShapes = false;
|
||||
|
||||
@@ -419,10 +420,15 @@ public class PasswordTextView extends FrameLayout {
|
||||
/**
|
||||
* Determines whether AutoConfirmation feature is on.
|
||||
*
|
||||
* @param usePinShapes
|
||||
* @param isPinHinting
|
||||
*/
|
||||
public void setIsPinHinting(boolean isPinHinting) {
|
||||
// Do not reinflate the view if we are using the same one.
|
||||
if (mPinShapeInput != null && mIsPinHinting == isPinHinting) {
|
||||
return;
|
||||
}
|
||||
mIsPinHinting = isPinHinting;
|
||||
|
||||
if (mPinShapeInput != null) {
|
||||
removeView(mPinShapeInput.getView());
|
||||
mPinShapeInput = null;
|
||||
|
||||
@@ -152,9 +152,15 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
|
||||
`when`(passwordTextView.text).thenReturn("")
|
||||
|
||||
pinViewController.startAppearAnimation()
|
||||
verify(deleteButton).visibility = View.INVISIBLE
|
||||
verify(deleteButton).visibility = View.VISIBLE
|
||||
verify(enterButton).visibility = View.VISIBLE
|
||||
verify(passwordTextView).setUsePinShapes(true)
|
||||
verify(passwordTextView).setIsPinHinting(true)
|
||||
verify(passwordTextView).setIsPinHinting(false)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun handleLockout_readsNumberOfErrorAttempts() {
|
||||
pinViewController.handleAttemptLockout(0)
|
||||
verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user