diff options
| author | 2024-10-02 17:33:03 +0000 | |
|---|---|---|
| committer | 2024-10-02 17:33:03 +0000 | |
| commit | 303f6160fe0ef1ef3dbf3569b6061ef9f76343be (patch) | |
| tree | d75bf9cd8a0d731e558ed97026e2380bcb57b79f | |
| parent | e0fa05baff020b1381aff31fdeef015b2ddf4907 (diff) | |
| parent | 453f286ba27ec7a97d1d589165da3a4c63a6cc13 (diff) | |
Merge "Flexiglass: use Interactor for device public logic in LS user manager" into main
2 files changed, 87 insertions, 5 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 523a89ad5740..5b0b59de47c2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -71,7 +71,11 @@ import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor; +import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus; import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.DisableSceneContainer; +import com.android.systemui.flags.EnableSceneContainer; import com.android.systemui.flags.FakeFeatureFlagsClassic; import com.android.systemui.log.LogWtfHandlerRule; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -90,6 +94,10 @@ import com.android.systemui.util.time.FakeSystemClock; import com.google.android.collect.Lists; +import dagger.Lazy; + +import kotlinx.coroutines.flow.StateFlow; + import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -152,6 +160,12 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { private BroadcastDispatcher mBroadcastDispatcher; @Mock private KeyguardStateController mKeyguardStateController; + @Mock + private Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy; + @Mock + private DeviceUnlockedInteractor mDeviceUnlockedInteractor; + @Mock + private StateFlow<DeviceUnlockStatus> mDeviceUnlockStatusStateFlow; private UserInfo mCurrentUser; private UserInfo mSecondaryUser; @@ -238,6 +252,9 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { mLockscreenUserManager = new TestNotificationLockscreenUserManager(mContext); mLockscreenUserManager.setUpWithPresenter(mPresenter); + when(mDeviceUnlockedInteractor.getDeviceUnlockStatus()) + .thenReturn(mDeviceUnlockStatusStateFlow); + mBackgroundExecutor.runAllReady(); } @@ -493,7 +510,8 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { } @Test - public void testUpdateIsPublicMode() { + @DisableSceneContainer + public void testUpdateIsPublicMode_sceneContainerDisabled() { when(mKeyguardStateController.isMethodSecure()).thenReturn(true); when(mKeyguardStateController.isShowing()).thenReturn(false); @@ -527,6 +545,57 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { mBackgroundExecutor.runAllReady(); assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0)); verify(listener, never()).onNotificationStateChanged(); + + verify(mDeviceUnlockedInteractorLazy, never()).get(); + } + + @Test + @EnableSceneContainer + public void testUpdateIsPublicMode_sceneContainerEnabled() { + when(mDeviceUnlockedInteractorLazy.get()).thenReturn(mDeviceUnlockedInteractor); + + // device is unlocked + when(mDeviceUnlockStatusStateFlow.getValue()).thenReturn(new DeviceUnlockStatus( + /* isUnlocked = */ true, + /* deviceUnlockSource = */ null + )); + + NotificationStateChangedListener listener = mock(NotificationStateChangedListener.class); + mLockscreenUserManager.addNotificationStateChangedListener(listener); + mLockscreenUserManager.mCurrentProfiles.append(0, mock(UserInfo.class)); + + // first call explicitly sets user 0 to not public; notifies + mLockscreenUserManager.updatePublicMode(); + mBackgroundExecutor.runAllReady(); + assertFalse(mLockscreenUserManager.isLockscreenPublicMode(0)); + verify(listener).onNotificationStateChanged(); + clearInvocations(listener); + + // calling again has no changes; does not notify + mLockscreenUserManager.updatePublicMode(); + mBackgroundExecutor.runAllReady(); + assertFalse(mLockscreenUserManager.isLockscreenPublicMode(0)); + verify(listener, never()).onNotificationStateChanged(); + + // device is not unlocked + when(mDeviceUnlockStatusStateFlow.getValue()).thenReturn(new DeviceUnlockStatus( + /* isUnlocked = */ false, + /* deviceUnlockSource = */ null + )); + + // Calling again with device now not unlocked makes user 0 public; notifies + when(mKeyguardStateController.isShowing()).thenReturn(true); + mLockscreenUserManager.updatePublicMode(); + mBackgroundExecutor.runAllReady(); + assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0)); + verify(listener).onNotificationStateChanged(); + clearInvocations(listener); + + // calling again has no changes; does not notify + mLockscreenUserManager.updatePublicMode(); + mBackgroundExecutor.runAllReady(); + assertTrue(mLockscreenUserManager.isLockscreenPublicMode(0)); + verify(listener, never()).onNotificationStateChanged(); } @Test @@ -972,7 +1041,9 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { mSettings, mock(DumpManager.class), mock(LockPatternUtils.class), - mFakeFeatureFlags); + mFakeFeatureFlags, + mDeviceUnlockedInteractorLazy + ); } public BroadcastReceiver getBaseBroadcastReceiverForTest() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 7244f8a64c19..e47952fd6c4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -62,11 +62,13 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlagsClassic; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; @@ -286,6 +288,8 @@ public class NotificationLockscreenUserManagerImpl implements protected ContentObserver mLockscreenSettingsObserver; protected ContentObserver mSettingsObserver; + private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy; + @Inject public NotificationLockscreenUserManagerImpl(Context context, BroadcastDispatcher broadcastDispatcher, @@ -305,7 +309,8 @@ public class NotificationLockscreenUserManagerImpl implements SecureSettings secureSettings, DumpManager dumpManager, LockPatternUtils lockPatternUtils, - FeatureFlagsClassic featureFlags) { + FeatureFlagsClassic featureFlags, + Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy) { mContext = context; mMainExecutor = mainExecutor; mBackgroundExecutor = backgroundExecutor; @@ -325,6 +330,7 @@ public class NotificationLockscreenUserManagerImpl implements mSecureSettings = secureSettings; mKeyguardStateController = keyguardStateController; mFeatureFlags = featureFlags; + mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy; mLockScreenUris.add(SHOW_LOCKSCREEN); mLockScreenUris.add(SHOW_PRIVATE_LOCKSCREEN); @@ -748,8 +754,13 @@ public class NotificationLockscreenUserManagerImpl implements // camera on the keyguard has a state of SHADE but the keyguard is still showing. final boolean showingKeyguard = mState != StatusBarState.SHADE || mKeyguardStateController.isShowing(); - final boolean devicePublic = showingKeyguard && mKeyguardStateController.isMethodSecure(); - + final boolean devicePublic; + if (SceneContainerFlag.isEnabled()) { + devicePublic = !mDeviceUnlockedInteractorLazy.get() + .getDeviceUnlockStatus().getValue().isUnlocked(); + } else { + devicePublic = showingKeyguard && mKeyguardStateController.isMethodSecure(); + } // Look for public mode users. Users are considered public in either case of: // - device keyguard is shown in secure mode; |