Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +23 −14 Original line number Diff line number Diff line Loading @@ -107,6 +107,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 @@ -295,15 +296,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 @@ -322,6 +325,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 @@ -544,7 +548,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 @@ -554,8 +559,12 @@ public class KeyguardIndicationController implements StateListener, return; } mDozing = dozing; if (mHideTransientMessageOnScreenOff && mDozing) { hideTransientIndication(); } else { updateIndication(false); } } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("KeyguardIndicationController:"); Loading Loading @@ -616,8 +625,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricHelp(int msgId, String helpString, BiometricSourceType biometricSourceType) { KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class); if (!updateMonitor.isUnlockingWithBiometricAllowed()) { if (!mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()) { return; } boolean showSwipeToUnlock = Loading @@ -625,8 +633,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 @@ -640,8 +648,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricError(int msgId, String errString, BiometricSourceType biometricSourceType) { KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class); if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) { if (shouldSuppressBiometricError(msgId, biometricSourceType, mKeyguardUpdateMonitor)) { return; } animatePadlockError(); Loading @@ -651,7 +658,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 @@ -691,13 +698,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 +57 −0 Original line number Diff line number Diff line Loading @@ -34,8 +34,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 @@ -51,6 +54,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.policy.AccessibilityController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.wakelock.WakeLockFake; Loading Loading @@ -84,6 +88,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 @@ -97,9 +105,13 @@ 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)); when(mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); when(mKeyguardUpdateMonitor.isScreenOn()).thenReturn(true); when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true); when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); mWakeLock = new WakeLockFake(); Loading @@ -112,6 +124,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon, mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController, mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor); mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @Test Loading Loading @@ -166,6 +179,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 @@ -190,6 +246,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void updateMonitor_listenerUpdatesIndication() { createController(); String restingIndication = "Resting indication"; reset(mKeyguardUpdateMonitor); mController.setVisible(true); assertThat(mTextView.getText()).isEqualTo( Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +23 −14 Original line number Diff line number Diff line Loading @@ -107,6 +107,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 @@ -295,15 +296,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 @@ -322,6 +325,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 @@ -544,7 +548,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 @@ -554,8 +559,12 @@ public class KeyguardIndicationController implements StateListener, return; } mDozing = dozing; if (mHideTransientMessageOnScreenOff && mDozing) { hideTransientIndication(); } else { updateIndication(false); } } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("KeyguardIndicationController:"); Loading Loading @@ -616,8 +625,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricHelp(int msgId, String helpString, BiometricSourceType biometricSourceType) { KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class); if (!updateMonitor.isUnlockingWithBiometricAllowed()) { if (!mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()) { return; } boolean showSwipeToUnlock = Loading @@ -625,8 +633,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 @@ -640,8 +648,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onBiometricError(int msgId, String errString, BiometricSourceType biometricSourceType) { KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class); if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) { if (shouldSuppressBiometricError(msgId, biometricSourceType, mKeyguardUpdateMonitor)) { return; } animatePadlockError(); Loading @@ -651,7 +658,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 @@ -691,13 +698,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 +57 −0 Original line number Diff line number Diff line Loading @@ -34,8 +34,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 @@ -51,6 +54,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.policy.AccessibilityController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.wakelock.WakeLockFake; Loading Loading @@ -84,6 +88,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 @@ -97,9 +105,13 @@ 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)); when(mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); when(mKeyguardUpdateMonitor.isScreenOn()).thenReturn(true); when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true); when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); mWakeLock = new WakeLockFake(); Loading @@ -112,6 +124,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon, mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController, mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor); mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @Test Loading Loading @@ -166,6 +179,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 @@ -190,6 +246,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void updateMonitor_listenerUpdatesIndication() { createController(); String restingIndication = "Resting indication"; reset(mKeyguardUpdateMonitor); mController.setVisible(true); assertThat(mTextView.getText()).isEqualTo( Loading