diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 6f87b2939cfbe..f3ae50b4ca237 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -108,6 +108,7 @@ public class KeyguardIndicationController implements StateListener, private ColorStateList mTransientTextColorState; private ColorStateList mInitialTextColorState; private boolean mVisible; + private boolean mHideTransientMessageOnScreenOff; private boolean mPowerPluggedIn; private boolean mPowerPluggedInWired; @@ -317,15 +318,17 @@ public class KeyguardIndicationController implements StateListener, * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}. */ public void showTransientIndication(CharSequence transientIndication) { - showTransientIndication(transientIndication, mInitialTextColorState); + showTransientIndication(transientIndication, mInitialTextColorState, + false /* hideOnScreenOff */); } /** * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}. */ - public void showTransientIndication(CharSequence transientIndication, - ColorStateList textColorState) { + private void showTransientIndication(CharSequence transientIndication, + ColorStateList textColorState, boolean hideOnScreenOff) { mTransientIndication = transientIndication; + mHideTransientMessageOnScreenOff = hideOnScreenOff && transientIndication != null; mTransientTextColorState = textColorState; mHandler.removeMessages(MSG_HIDE_TRANSIENT); mHandler.removeMessages(MSG_SWIPE_UP_TO_UNLOCK); @@ -344,6 +347,7 @@ public class KeyguardIndicationController implements StateListener, public void hideTransientIndication() { if (mTransientIndication != null) { mTransientIndication = null; + mHideTransientMessageOnScreenOff = false; mHandler.removeMessages(MSG_HIDE_TRANSIENT); updateIndication(false); } @@ -566,7 +570,8 @@ public class KeyguardIndicationController implements StateListener, String message = mContext.getString(R.string.keyguard_retry); mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState); } else if (mKeyguardUpdateMonitor.isScreenOn()) { - showTransientIndication(mContext.getString(R.string.keyguard_unlock)); + showTransientIndication(mContext.getString(R.string.keyguard_unlock), + mInitialTextColorState, true /* hideOnScreenOff */); hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS); } } @@ -576,7 +581,11 @@ public class KeyguardIndicationController implements StateListener, return; } mDozing = dozing; - updateIndication(false); + if (mHideTransientMessageOnScreenOff && mDozing) { + hideTransientIndication(); + } else { + updateIndication(false); + } updateDisclosure(); } @@ -646,8 +655,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricHelp(int msgId, String helpString, BiometricSourceType biometricSourceType) { - KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); - if (!updateMonitor.isUnlockingWithBiometricAllowed()) { + if (!mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()) { return; } boolean showSwipeToUnlock = @@ -655,8 +663,8 @@ public class KeyguardIndicationController implements StateListener, if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.showBouncerMessage(helpString, mInitialTextColorState); - } else if (updateMonitor.isScreenOn()) { - showTransientIndication(helpString); + } else if (mKeyguardUpdateMonitor.isScreenOn()) { + showTransientIndication(helpString, mInitialTextColorState, showSwipeToUnlock); if (!showSwipeToUnlock) { hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); } @@ -670,8 +678,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricError(int msgId, String errString, BiometricSourceType biometricSourceType) { - KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); - if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) { + if (shouldSuppressBiometricError(msgId, biometricSourceType, mKeyguardUpdateMonitor)) { return; } animatePadlockError(); @@ -681,7 +688,7 @@ public class KeyguardIndicationController implements StateListener, showSwipeUpToUnlock(); } else if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.showBouncerMessage(errString, mInitialTextColorState); - } else if (updateMonitor.isScreenOn()) { + } else if (mKeyguardUpdateMonitor.isScreenOn()) { showTransientIndication(errString); // We want to keep this message around in case the screen was off hideTransientIndicationDelayed(HIDE_DELAY_MS); @@ -721,13 +728,15 @@ public class KeyguardIndicationController implements StateListener, @Override public void onTrustAgentErrorMessage(CharSequence message) { - showTransientIndication(message, Utils.getColorError(mContext)); + showTransientIndication(message, Utils.getColorError(mContext), + false /* hideOnScreenOff */); } @Override public void onScreenTurnedOn() { if (mMessageToShowOnScreenOn != null) { - showTransientIndication(mMessageToShowOnScreenOn, Utils.getColorError(mContext)); + showTransientIndication(mMessageToShowOnScreenOn, Utils.getColorError(mContext), + false /* hideOnScreenOff */); // We want to keep this message around in case the screen was off hideTransientIndicationDelayed(HIDE_DELAY_MS); mMessageToShowOnScreenOn = null; 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 daee55bd3d618..c85e51545bc1e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -35,8 +35,11 @@ import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.Context; import android.graphics.Color; +import android.hardware.biometrics.BiometricSourceType; +import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.os.Looper; +import android.os.UserManager; import android.view.View; import android.view.ViewGroup; @@ -53,6 +56,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.ShadeController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.util.wakelock.WakeLockFake; @@ -92,6 +96,10 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private StatusBarStateController mStatusBarStateController; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + @Mock + private UserManager mUserManager; private KeyguardIndicationTextView mTextView; private KeyguardIndicationController mController; @@ -105,14 +113,18 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mTextView = new KeyguardIndicationTextView(mContext); mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager); + mContext.addMockSystemService(UserManager.class, mUserManager); mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class)); mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class)); mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name, ORGANIZATION_NAME); + when(mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); + when(mKeyguardUpdateMonitor.isScreenOn()).thenReturn(true); when(mIndicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure)) .thenReturn(mDisclosure); when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); + when(mUserManager.isUserUnlocked(anyInt())).thenReturn(true); mWakeLock = new WakeLockFake(); } @@ -124,6 +136,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon, mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController, mUnlockMethodCache, mStatusBarStateController, mKeyguardUpdateMonitor); + mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @Test @@ -244,6 +257,49 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { assertThat(mTextView.getAlpha()).isEqualTo(1f); } + @Test + public void transientIndication_visibleWhenDozing_unlessSwipeUp_fromHelp() { + createController(); + String message = "A message"; + + mController.setVisible(true); + mController.getKeyguardCallback().onBiometricHelp( + KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED, message, + BiometricSourceType.FACE); + assertThat(mTextView.getText()).isEqualTo(message); + mController.setDozing(true); + + assertThat(mTextView.getText()).isNotEqualTo(message); + } + + @Test + public void transientIndication_visibleWhenDozing_unlessSwipeUp_fromError() { + createController(); + String message = mContext.getString(R.string.keyguard_unlock); + + mController.setVisible(true); + mController.getKeyguardCallback().onBiometricError(FaceManager.FACE_ERROR_TIMEOUT, + "A message", BiometricSourceType.FACE); + + assertThat(mTextView.getText()).isEqualTo(message); + mController.setDozing(true); + + assertThat(mTextView.getText()).isNotEqualTo(message); + } + + @Test + public void transientIndication_swipeUpToRetry() { + createController(); + String message = mContext.getString(R.string.keyguard_retry); + when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true); + + mController.setVisible(true); + mController.getKeyguardCallback().onBiometricError(FaceManager.FACE_ERROR_TIMEOUT, + "A message", BiometricSourceType.FACE); + + verify(mStatusBarKeyguardViewManager).showBouncerMessage(eq(message), any()); + } + @Test public void lockIcon_click() { createController();