diff options
author | 2023-09-19 19:50:21 +0000 | |
---|---|---|
committer | 2023-09-19 21:01:31 +0000 | |
commit | 5fba6ecb07c70dfc229a63249bf105c09ebea5b3 (patch) | |
tree | 3b96fc8e2cf0cacb7db9934c994c0007d5e60302 | |
parent | 710ffbed47e9afd56d7571e67c65b1755879c8a5 (diff) |
Updated: always show the keyguard on device lockdown
Additionally, don't hide keyguard when it's disabled if the user has locked
down the device.
Manual test steps:
1. Enable app pinning and disable "Ask for PIN before unpinning" setting
2. Pin an app (ie: Settings)
3. Lockdown from the power menu
4. Observe: user is brought to the keyguard, primary auth is
required to enter the device.
=> After entering correct credential, the device is still in
app pinning mode.
=> After entering an incorrect credential, the keyguard remains
showing and the user can attempt again up to the limit
Bug: 300463732
Bug: 218495634
Test: atest KeyguardViewMediatorTest
Test: manual
Change-Id: I70fdae80f717712b3dfc9df54b9649959b4bb8f0
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java | 14 | ||||
-rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java | 45 |
2 files changed, 58 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 2414ef982fb0..5eb7ba1e9fb3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -763,6 +763,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } } } + + @Override + public void onStrongAuthStateChanged(int userId) { + if (mLockPatternUtils.isUserInLockdown(KeyguardUpdateMonitor.getCurrentUser())) { + doKeyguardLocked(null); + } + } }; ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() { @@ -1957,6 +1964,10 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mExternallyEnabled = enabled; if (!enabled && mShowing) { + if (mLockPatternUtils.isUserInLockdown(KeyguardUpdateMonitor.getCurrentUser())) { + Log.d(TAG, "keyguardEnabled(false) overridden by user lockdown"); + return; + } // hiding keyguard that is showing, remember to reshow later if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, " + "disabling status bar expansion"); @@ -2178,7 +2189,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, */ private void doKeyguardLocked(Bundle options) { // if another app is disabling us, don't show - if (!mExternallyEnabled) { + if (!mExternallyEnabled + && !mLockPatternUtils.isUserInLockdown(KeyguardUpdateMonitor.getCurrentUser())) { if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); mNeedToReshowWhenReenabled = true; 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 e568c244390c..fdeed9fddf7a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -177,6 +177,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock ShadeWindowLogger mShadeWindowLogger; private @Captor ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateControllerCallback; + private @Captor ArgumentCaptor<KeyguardUpdateMonitorCallback> + mKeyguardUpdateMonitorCallbackCaptor; private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake(); private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -237,6 +239,45 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { } @Test + @TestableLooper.RunWithLooper(setAsMainLooper = true) + public void onLockdown_showKeyguard_evenIfKeyguardIsNotEnabledExternally() { + // GIVEN keyguard is not enabled and isn't showing + mViewMediator.onSystemReady(); + mViewMediator.setKeyguardEnabled(false); + TestableLooper.get(this).processAllMessages(); + captureKeyguardUpdateMonitorCallback(); + assertFalse(mViewMediator.isShowingAndNotOccluded()); + + // WHEN lockdown occurs + when(mLockPatternUtils.isUserInLockdown(anyInt())).thenReturn(true); + mKeyguardUpdateMonitorCallbackCaptor.getValue().onStrongAuthStateChanged(0); + + // THEN keyguard is shown + TestableLooper.get(this).processAllMessages(); + assertTrue(mViewMediator.isShowingAndNotOccluded()); + } + + @Test + @TestableLooper.RunWithLooper(setAsMainLooper = true) + public void doNotHideKeyguard_whenLockdown_onKeyguardNotEnabledExternally() { + // GIVEN keyguard is enabled and lockdown occurred so the keyguard is showing + mViewMediator.onSystemReady(); + mViewMediator.setKeyguardEnabled(true); + TestableLooper.get(this).processAllMessages(); + captureKeyguardUpdateMonitorCallback(); + when(mLockPatternUtils.isUserInLockdown(anyInt())).thenReturn(true); + mKeyguardUpdateMonitorCallbackCaptor.getValue().onStrongAuthStateChanged(0); + assertTrue(mViewMediator.isShowingAndNotOccluded()); + + // WHEN keyguard is externally not enabled anymore + mViewMediator.setKeyguardEnabled(false); + + // THEN keyguard is NOT dismissed; it continues to show + TestableLooper.get(this).processAllMessages(); + assertTrue(mViewMediator.isShowingAndNotOccluded()); + } + + @Test public void testOnGoingToSleep_UpdatesKeyguardGoingAway() { mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER); verify(mUpdateMonitor).dispatchKeyguardGoingAway(false); @@ -982,4 +1023,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private void captureKeyguardStateControllerCallback() { verify(mKeyguardStateController).addCallback(mKeyguardStateControllerCallback.capture()); } + + private void captureKeyguardUpdateMonitorCallback() { + verify(mUpdateMonitor).registerCallback(mKeyguardUpdateMonitorCallbackCaptor.capture()); + } } |