Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +23 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); } Loading Loading @@ -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); } } Loading @@ -576,7 +581,11 @@ public class KeyguardIndicationController implements StateListener, return; } mDozing = dozing; if (mHideTransientMessageOnScreenOff && mDozing) { hideTransientIndication(); } else { updateIndication(false); } updateDisclosure(); } Loading Loading @@ -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 = Loading @@ -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); } Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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; Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +56 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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(); } Loading @@ -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 Loading Loading @@ -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(); Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +23 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); } Loading Loading @@ -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); } } Loading @@ -576,7 +581,11 @@ public class KeyguardIndicationController implements StateListener, return; } mDozing = dozing; if (mHideTransientMessageOnScreenOff && mDozing) { hideTransientIndication(); } else { updateIndication(false); } updateDisclosure(); } Loading Loading @@ -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 = Loading @@ -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); } Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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; Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +56 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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(); } Loading @@ -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 Loading Loading @@ -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(); Loading