Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2614f20 authored by Aaron Liu's avatar Aaron Liu
Browse files

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
parent 0d364c73
Loading
Loading
Loading
Loading
+41 −29
Original line number Original line Diff line number Diff line
@@ -16,8 +16,6 @@


package com.android.keyguard;
package com.android.keyguard;


import static com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants.DEFAULT_PIN_LENGTH;

import android.view.View;
import android.view.View;


import com.android.internal.util.LatencyTracker;
import com.android.internal.util.LatencyTracker;
@@ -42,10 +40,9 @@ public class KeyguardPinViewController
    private NumPadButton mBackspaceKey;
    private NumPadButton mBackspaceKey;
    private View mOkButton = mView.findViewById(R.id.key_enter);
    private View mOkButton = mView.findViewById(R.id.key_enter);


    private int mUserId;
    private long mPinLength;
    private long mPinLength;


    private int mPasswordFailedAttempts;
    private boolean mDisabledAutoConfirmation;


    protected KeyguardPinViewController(KeyguardPINView view,
    protected KeyguardPinViewController(KeyguardPINView view,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -84,9 +81,8 @@ public class KeyguardPinViewController


    protected void onUserInput() {
    protected void onUserInput() {
        super.onUserInput();
        super.onUserInput();
        if (isAutoConfirmation()) {
        if (isAutoPinConfirmEnabledInSettings()) {
            updateOKButtonVisibility();
            updateAutoConfirmationState();
            updateBackSpaceVisibility();
            if (mPasswordEntry.getText().length() == mPinLength
            if (mPasswordEntry.getText().length() == mPinLength
                    && mOkButton.getVisibility() == View.INVISIBLE) {
                    && mOkButton.getVisibility() == View.INVISIBLE) {
                verifyPasswordAndUnlock();
                verifyPasswordAndUnlock();
@@ -103,13 +99,9 @@ public class KeyguardPinViewController
    @Override
    @Override
    public void startAppearAnimation() {
    public void startAppearAnimation() {
        if (mFeatureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)) {
        if (mFeatureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)) {
            mUserId = KeyguardUpdateMonitor.getCurrentUser();
            mPinLength = mLockPatternUtils.getPinLength(KeyguardUpdateMonitor.getCurrentUser());
            mPinLength = mLockPatternUtils.getPinLength(mUserId);
            mBackspaceKey.setTransparentMode(/* isTransparentMode= */ isAutoConfirmation());
            updateOKButtonVisibility();
            updateBackSpaceVisibility();
            mPasswordEntry.setUsePinShapes(true);
            mPasswordEntry.setUsePinShapes(true);
            mPasswordEntry.setIsPinHinting(isAutoConfirmation() && isPinHinting());
            updateAutoConfirmationState();
        }
        }
        super.startAppearAnimation();
        super.startAppearAnimation();
    }
    }
@@ -120,13 +112,25 @@ public class KeyguardPinViewController
                mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable);
                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
     * Updates the visibility of the OK button for auto confirm feature
     */
     */
    private void updateOKButtonVisibility() {
    private void updateOKButtonVisibility() {
        mPasswordFailedAttempts = mLockPatternUtils.getCurrentFailedPasswordAttempts(mUserId);
        if (isAutoPinConfirmEnabledInSettings() && !mDisabledAutoConfirmation) {
        if (isAutoConfirmation() && mPasswordFailedAttempts < MIN_FAILED_PIN_ATTEMPTS) {
            mOkButton.setVisibility(View.INVISIBLE);
            mOkButton.setVisibility(View.INVISIBLE);
        } else {
        } else {
            mOkButton.setVisibility(View.VISIBLE);
            mOkButton.setVisibility(View.VISIBLE);
@@ -138,29 +142,37 @@ public class KeyguardPinViewController
     * Visibility changes are only for auto confirmation configuration.
     * Visibility changes are only for auto confirmation configuration.
     */
     */
    private void updateBackSpaceVisibility() {
    private void updateBackSpaceVisibility() {
        if (!isAutoConfirmation()) {
        boolean isAutoConfirmation = isAutoPinConfirmEnabledInSettings();
            return;
        mBackspaceKey.setTransparentMode(/* isTransparentMode= */
        }
                isAutoConfirmation && !mDisabledAutoConfirmation);

        if (isAutoConfirmation) {
        if (mPasswordEntry.getText().length() > 0) {
            if (mPasswordEntry.getText().length() > 0
                    || mDisabledAutoConfirmation) {
                mBackspaceKey.setVisibility(View.VISIBLE);
                mBackspaceKey.setVisibility(View.VISIBLE);
            } else {
            } else {
                mBackspaceKey.setVisibility(View.INVISIBLE);
                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() {
    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
        //Checks if user has enabled the auto confirm in Settings
        return mLockPatternUtils.isAutoPinConfirmEnabled(mUserId);
        return mLockPatternUtils.isAutoPinConfirmEnabled(KeyguardUpdateMonitor.getCurrentUser());
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -116,7 +116,12 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni
     * @param isTransparentMode
     * @param isTransparentMode
     */
     */
    public void setTransparentMode(boolean isTransparentMode) {
    public void setTransparentMode(boolean isTransparentMode) {
        if (mIsTransparentMode == isTransparentMode) {
            return;
        }

        mIsTransparentMode = isTransparentMode;
        mIsTransparentMode = isTransparentMode;

        if (isTransparentMode) {
        if (isTransparentMode) {
            setBackgroundColor(getResources().getColor(android.R.color.transparent));
            setBackgroundColor(getResources().getColor(android.R.color.transparent));
        } else {
        } else {
+7 −1
Original line number Original line Diff line number Diff line
@@ -101,6 +101,7 @@ public class PasswordTextView extends FrameLayout {
    private Interpolator mFastOutSlowInInterpolator;
    private Interpolator mFastOutSlowInInterpolator;
    private boolean mShowPassword = true;
    private boolean mShowPassword = true;
    private UserActivityListener mUserActivityListener;
    private UserActivityListener mUserActivityListener;
    private boolean mIsPinHinting;
    private PinShapeInput mPinShapeInput;
    private PinShapeInput mPinShapeInput;
    private boolean mUsePinShapes = false;
    private boolean mUsePinShapes = false;


@@ -419,10 +420,15 @@ public class PasswordTextView extends FrameLayout {
    /**
    /**
     * Determines whether AutoConfirmation feature is on.
     * Determines whether AutoConfirmation feature is on.
     *
     *
     * @param usePinShapes
     * @param isPinHinting
     * @param isPinHinting
     */
     */
    public void setIsPinHinting(boolean 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) {
        if (mPinShapeInput != null) {
            removeView(mPinShapeInput.getView());
            removeView(mPinShapeInput.getView());
            mPinShapeInput = null;
            mPinShapeInput = null;
+8 −2
Original line number Original line Diff line number Diff line
@@ -152,9 +152,15 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
        `when`(passwordTextView.text).thenReturn("")
        `when`(passwordTextView.text).thenReturn("")


        pinViewController.startAppearAnimation()
        pinViewController.startAppearAnimation()
        verify(deleteButton).visibility = View.INVISIBLE
        verify(deleteButton).visibility = View.VISIBLE
        verify(enterButton).visibility = View.VISIBLE
        verify(enterButton).visibility = View.VISIBLE
        verify(passwordTextView).setUsePinShapes(true)
        verify(passwordTextView).setUsePinShapes(true)
        verify(passwordTextView).setIsPinHinting(true)
        verify(passwordTextView).setIsPinHinting(false)
    }

    @Test
    fun handleLockout_readsNumberOfErrorAttempts() {
        pinViewController.handleAttemptLockout(0)
        verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
    }
    }
}
}