diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 15f4b12ba10e5..a4b809d00a594 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -196,7 +196,9 @@ public class KeyguardIndicationController { public void onScreenTurnedOn() { mHandler.removeMessages(MSG_RESET_ERROR_MESSAGE_ON_SCREEN_ON); if (mBiometricErrorMessageToShowOnScreenOn != null) { - showBiometricMessage(mBiometricErrorMessageToShowOnScreenOn); + String followUpMessage = mFaceLockedOutThisAuthSession + ? faceLockedOutFollowupMessage() : null; + showBiometricMessage(mBiometricErrorMessageToShowOnScreenOn, followUpMessage); // We want to keep this message around in case the screen was off hideBiometricMessageDelayed(DEFAULT_HIDE_DELAY_MS); mBiometricErrorMessageToShowOnScreenOn = null; @@ -1256,9 +1258,7 @@ public class KeyguardIndicationController { } private void handleFaceLockoutError(String errString) { - int followupMsgId = canUnlockWithFingerprint() ? R.string.keyguard_suggest_fingerprint - : R.string.keyguard_unlock; - String followupMessage = mContext.getString(followupMsgId); + String followupMessage = faceLockedOutFollowupMessage(); // Lockout error can happen multiple times in a session because we trigger face auth // even when it is locked out so that the user is aware that face unlock would have // triggered but didn't because it is locked out. @@ -1276,6 +1276,12 @@ public class KeyguardIndicationController { } } + private String faceLockedOutFollowupMessage() { + int followupMsgId = canUnlockWithFingerprint() ? R.string.keyguard_suggest_fingerprint + : R.string.keyguard_unlock; + return mContext.getString(followupMsgId); + } + private static boolean isLockoutError(int msgId) { return msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT || msgId == FaceManager.FACE_ERROR_LOCKOUT; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 1598dbb7d29ea..1ebca129ff8ed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -38,6 +38,7 @@ import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewCont import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_USER_LOCKED; import static com.android.systemui.keyguard.ScreenLifecycle.SCREEN_OFF; import static com.android.systemui.keyguard.ScreenLifecycle.SCREEN_ON; +import static com.android.systemui.keyguard.ScreenLifecycle.SCREEN_TURNING_ON; import static com.google.common.truth.Truth.assertThat; @@ -1497,6 +1498,44 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mContext.getString(R.string.keyguard_face_unlock_unavailable)); } + @Test + public void onBiometricError_screenIsTurningOn_faceLockedOutFpIsNotAvailable_showsMessage() { + createController(); + screenIsTurningOn(); + fingerprintUnlockIsNotPossible(); + + onFaceLockoutError("lockout error"); + verifyNoMoreInteractions(mRotateTextViewController); + + mScreenObserver.onScreenTurnedOn(); + + verifyIndicationShown(INDICATION_TYPE_BIOMETRIC_MESSAGE, + "lockout error"); + verifyIndicationShown(INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP, + mContext.getString(R.string.keyguard_unlock)); + } + + @Test + public void onBiometricError_screenIsTurningOn_faceLockedOutFpIsAvailable_showsMessage() { + createController(); + screenIsTurningOn(); + fingerprintUnlockIsPossible(); + + onFaceLockoutError("lockout error"); + verifyNoMoreInteractions(mRotateTextViewController); + + mScreenObserver.onScreenTurnedOn(); + + verifyIndicationShown(INDICATION_TYPE_BIOMETRIC_MESSAGE, + "lockout error"); + verifyIndicationShown(INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP, + mContext.getString(R.string.keyguard_suggest_fingerprint)); + } + + private void screenIsTurningOn() { + when(mScreenLifecycle.getScreenState()).thenReturn(SCREEN_TURNING_ON); + } + private void sendUpdateDisclosureBroadcast() { mBroadcastReceiver.onReceive(mContext, new Intent()); }