diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 0e0cf74ba463c..a70cc388c6d23 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1201,7 +1201,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void onPrimaryBouncerShowingChanged() { synchronized (KeyguardViewMediator.this) { - if (mKeyguardStateController.isPrimaryBouncerShowing()) { + if (mKeyguardStateController.isPrimaryBouncerShowing() + && !mKeyguardStateController.isKeyguardGoingAway()) { mPendingPinLock = false; } adjustStatusBarLocked(mKeyguardStateController.isPrimaryBouncerShowing(), false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index f31ac00051f68..f2f15a1a55351 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -148,6 +148,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock ShadeWindowLogger mShadeWindowLogger; private @Captor ArgumentCaptor mKeyguardUpdateMonitorCallbackCaptor; + private @Captor ArgumentCaptor + mKeyguardStateControllerCallback; private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake(); private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -595,6 +597,33 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { ); } + @Test + @TestableLooper.RunWithLooper(setAsMainLooper = true) + public void pendingPinLockOnKeyguardGoingAway_doKeyguardLockedOnKeyguardVisibilityChanged() { + // GIVEN SIM_STATE_PIN_REQUIRED + mViewMediator.onSystemReady(); + final KeyguardUpdateMonitorCallback keyguardUpdateMonitorCallback = + mViewMediator.mUpdateCallback; + keyguardUpdateMonitorCallback.onSimStateChanged(0, 0, + TelephonyManager.SIM_STATE_PIN_REQUIRED); + TestableLooper.get(this).processAllMessages(); + + // ...and then the primary bouncer shows while the keyguard is going away + captureKeyguardStateControllerCallback(); + when(mKeyguardStateController.isPrimaryBouncerShowing()).thenReturn(true); + when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true); + mKeyguardStateControllerCallback.getValue().onPrimaryBouncerShowingChanged(); + TestableLooper.get(this).processAllMessages(); + + // WHEN keyguard visibility becomes FALSE + mViewMediator.setShowingLocked(false); + keyguardUpdateMonitorCallback.onKeyguardVisibilityChanged(false); + TestableLooper.get(this).processAllMessages(); + + // THEN keyguard shows due to the pending SIM PIN lock + assertTrue(mViewMediator.isShowingAndNotOccluded()); + } + private void createAndStartViewMediator() { mViewMediator = new KeyguardViewMediator( mContext, @@ -638,4 +667,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private void captureKeyguardUpdateMonitorCallback() { verify(mUpdateMonitor).registerCallback(mKeyguardUpdateMonitorCallbackCaptor.capture()); } + + private void captureKeyguardStateControllerCallback() { + verify(mKeyguardStateController).addCallback(mKeyguardStateControllerCallback.capture()); + } }