diff options
| author | 2023-03-14 18:44:02 -0700 | |
|---|---|---|
| committer | 2023-03-20 22:41:13 +0000 | |
| commit | 8b9bb7712d1dc6a31f3f32ffbc1597dd9e10aa5d (patch) | |
| tree | af436362e057db024fc73f349a2d8be8e782998d | |
| parent | 71f29f316b50b94905813743f56a522322792e55 (diff) | |
Change KeyguardIndicationController to use UserTracker instead of KeyguardUpdateMonitor to get the current user id.
Fixes: 269196016
Test: atest KeyguardIndicationControllerTest
Test: manually
1. Enroll Face and disable skip lockscreen option
2. Enable multiple users on the device
3. Create a second user for the device.
4. Switch to the user new user and enroll face & and disable skip lockscreen option
5. Switch between the users and unlock the phone using face.
6. Repeat previous step several times
7. Device should not display unlock for all features and data at any point after the device is unlocked.
Change-Id: I6156899357095c66e8d93ad5a56e65ebdc30835f
3 files changed, 43 insertions, 22 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f2f0c597b86c..085f202861bb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -480,6 +480,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab sCurrentUser = currentUser; } + /** + * @deprecated This can potentially return unexpected values in a multi user scenario + * as this state is managed by another component. Consider using {@link UserTracker}. + */ + @Deprecated public synchronized static int getCurrentUser() { return sCurrentUser; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 779be2b102a6..fda227795915 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -28,7 +28,6 @@ import static android.view.View.VISIBLE; import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_AVAILABLE; import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED; import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED; -import static com.android.keyguard.KeyguardUpdateMonitor.getCurrentUser; import static com.android.systemui.DejankUtils.whitelistIpcs; import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.IMPORTANT_MSG_MIN_DURATION; import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ALIGNMENT; @@ -99,6 +98,7 @@ import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteracto import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -146,6 +146,7 @@ public class KeyguardIndicationController { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final AuthController mAuthController; private final KeyguardLogger mKeyguardLogger; + private final UserTracker mUserTracker; private ViewGroup mIndicationArea; private KeyguardIndicationTextView mTopIndicationView; private KeyguardIndicationTextView mLockScreenIndicationView; @@ -251,7 +252,8 @@ public class KeyguardIndicationController { FaceHelpMessageDeferral faceHelpMessageDeferral, KeyguardLogger keyguardLogger, AlternateBouncerInteractor alternateBouncerInteractor, - AlarmManager alarmManager + AlarmManager alarmManager, + UserTracker userTracker ) { mContext = context; mBroadcastDispatcher = broadcastDispatcher; @@ -275,6 +277,7 @@ public class KeyguardIndicationController { mKeyguardLogger = keyguardLogger; mScreenLifecycle.addObserver(mScreenObserver); mAlternateBouncerInteractor = alternateBouncerInteractor; + mUserTracker = userTracker; mFaceAcquiredMessageDeferral = faceHelpMessageDeferral; mCoExFaceAcquisitionMsgIdsToShow = new HashSet<>(); @@ -475,6 +478,10 @@ public class KeyguardIndicationController { } } + private int getCurrentUser() { + return mUserTracker.getUserId(); + } + private void updateLockScreenOwnerInfo() { // Check device owner info on a bg thread. // It makes multiple IPCs that could block the thread it's run on. @@ -1166,8 +1173,7 @@ public class KeyguardIndicationController { mContext.getString(R.string.keyguard_unlock) ); } else if (fpAuthFailed - && mKeyguardUpdateMonitor.getUserHasTrust( - KeyguardUpdateMonitor.getCurrentUser())) { + && mKeyguardUpdateMonitor.getUserHasTrust(getCurrentUser())) { showBiometricMessage( getTrustGrantedIndication(), mContext.getString(R.string.keyguard_unlock) @@ -1421,7 +1427,7 @@ public class KeyguardIndicationController { private boolean canUnlockWithFingerprint() { return mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - KeyguardUpdateMonitor.getCurrentUser()); + getCurrentUser()); } private void showErrorMessageNowOrLater(String errString, @Nullable String followUpMsg) { 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 251acedcc66e..569f90b64609 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -105,6 +105,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -188,6 +189,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private AuthController mAuthController; @Mock private AlarmManager mAlarmManager; + @Mock + private UserTracker mUserTracker; @Captor private ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener; @Captor @@ -209,6 +212,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private BroadcastReceiver mBroadcastReceiver; private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); private TestableLooper mTestableLooper; + private final int mCurrentUserId = 1; private KeyguardIndicationTextView mTextView; // AOD text @@ -260,6 +264,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { .thenReturn(mDisclosureGeneric); when(mDevicePolicyResourcesManager.getString(anyString(), any(), anyString())) .thenReturn(mDisclosureWithOrganization); + when(mUserTracker.getUserId()).thenReturn(mCurrentUserId); mWakeLock = new WakeLockFake(); mWakeLockBuilder = new WakeLockFake.Builder(mContext); @@ -291,7 +296,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mKeyguardBypassController, mAccessibilityManager, mFaceHelpMessageDeferral, mock(KeyguardLogger.class), mAlternateBouncerInteractor, - mAlarmManager + mAlarmManager, + mUserTracker ); mController.init(); mController.setIndicationArea(mIndicationArea); @@ -813,7 +819,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void faceErrorTimeout_whenFingerprintEnrolled_doesNotShowMessage() { createController(); when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(true); + getCurrentUser())).thenReturn(true); String message = "A message"; mController.setVisible(true); @@ -828,7 +834,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN fingerprint enrolled when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(true); + getCurrentUser())).thenReturn(true); // WHEN help messages received that are allowed to show final String helpString = "helpString"; @@ -855,7 +861,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN fingerprint enrolled when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(true); + getCurrentUser())).thenReturn(true); // WHEN help messages received that aren't supposed to show final String helpString = "helpString"; @@ -882,7 +888,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN fingerprint NOT enrolled when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(false); + getCurrentUser())).thenReturn(false); // WHEN help messages received final Set<CharSequence> helpStrings = new HashSet<>(); @@ -913,7 +919,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN fingerprint NOT enrolled when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(false); + getCurrentUser())).thenReturn(false); // WHEN help message received and deferred message is valid final String helpString = "helpMsg"; @@ -944,7 +950,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN fingerprint enrolled when(mKeyguardUpdateMonitor.getCachedIsUnlockWithFingerprintPossible( - 0)).thenReturn(true); + getCurrentUser())).thenReturn(true); // WHEN help message received and deferredMessage is valid final String helpString = "helpMsg"; @@ -1173,7 +1179,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // WHEN trust is granted when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true); - mKeyguardUpdateMonitorCallback.onTrustChanged(KeyguardUpdateMonitor.getCurrentUser()); + mKeyguardUpdateMonitorCallback.onTrustChanged(getCurrentUser()); // THEN verify the trust granted message shows verifyIndicationMessage( @@ -1238,7 +1244,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void coEx_faceSuccess_showsPressToOpen() { // GIVEN bouncer isn't showing, can skip bouncer, udfps is supported, no a11y enabled when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); when(mAccessibilityManager.isEnabled()).thenReturn(false); @@ -1262,7 +1268,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void coEx_faceSuccess_touchExplorationEnabled_showsFaceUnlockedSwipeToOpen() { // GIVEN bouncer isn't showing, can skip bouncer, udfps is supported, a11y enabled when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); when(mAccessibilityManager.isEnabled()).thenReturn(true); @@ -1286,7 +1292,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void coEx_faceSuccess_a11yEnabled_showsFaceUnlockedSwipeToOpen() { // GIVEN bouncer isn't showing, can skip bouncer, udfps is supported, a11y is enabled when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); when(mAccessibilityManager.isEnabled()).thenReturn(true); @@ -1309,7 +1315,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void faceOnly_faceSuccess_showsFaceUnlockedSwipeToOpen() { // GIVEN bouncer isn't showing, can skip bouncer, no udfps supported when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false); createController(); @@ -1331,7 +1337,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void udfpsOnly_a11yEnabled_showsSwipeToOpen() { // GIVEN bouncer isn't showing, can skip bouncer, udfps is supported, a11y is enabled when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); when(mAccessibilityManager.isEnabled()).thenReturn(true); @@ -1351,7 +1357,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void udfpsOnly_showsPressToOpen() { // GIVEN bouncer isn't showing, udfps is supported, a11y is NOT enabled, can skip bouncer when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true); when(mAccessibilityManager.isEnabled()).thenReturn(false); @@ -1372,7 +1378,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { // GIVEN bouncer isn't showing, can skip bouncer, no security (udfps isn't supported, // face wasn't authenticated) when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(true); when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false); createController(); @@ -1390,7 +1396,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { public void cannotSkipBouncer_showSwipeToUnlockHint() { // GIVEN bouncer isn't showing and cannot skip bouncer when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); - when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(KeyguardUpdateMonitor.getCurrentUser())) + when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())) .thenReturn(false); createController(); mController.setVisible(true); @@ -1746,10 +1752,14 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private void setupFingerprintUnlockPossible(boolean possible) { when(mKeyguardUpdateMonitor - .getCachedIsUnlockWithFingerprintPossible(KeyguardUpdateMonitor.getCurrentUser())) + .getCachedIsUnlockWithFingerprintPossible(getCurrentUser())) .thenReturn(possible); } + private int getCurrentUser() { + return mCurrentUserId; + } + private void onFaceLockoutError(String errMsg) { mKeyguardUpdateMonitorCallback.onBiometricError(FACE_ERROR_LOCKOUT_PERMANENT, errMsg, |