diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index f23bb0ae11f69..1adaafb10e768 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -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()); } } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java index 6ae80a62891be..ebd234fd08464 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java @@ -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 { diff --git a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java index 540001135543e..8e8ee48aba831 100644 --- a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java +++ b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java @@ -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; diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt index 70476aa088dc1..d3b41902499c7 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt @@ -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()) } }