Loading packages/SystemUI/src/com/android/systemui/Prefs.java +0 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,6 @@ public final class Prefs { Key.QS_WORK_ADDED, Key.QS_NIGHTDISPLAY_ADDED, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.SEEN_MULTI_USER, Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, Loading Loading @@ -106,7 +105,6 @@ public final class Prefs { * Settings panel. */ String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount"; String SEEN_MULTI_USER = "HasSeenMultiUser"; String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount"; String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed"; String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData"; Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +22 −11 Original line number Diff line number Diff line Loading @@ -66,8 +66,6 @@ import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Dumpable; import com.android.systemui.GuestResetOrExitSessionReceiver; import com.android.systemui.GuestResumeSessionReceiver; import com.android.systemui.Prefs; import com.android.systemui.Prefs.Key; import com.android.systemui.R; import com.android.systemui.SystemUISecondaryUserService; import com.android.systemui.animation.DialogLaunchAnimator; Loading @@ -86,6 +84,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.user.CreateUserActivity; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; Loading Loading @@ -148,6 +147,7 @@ public class UserSwitcherController implements Dumpable { // When false, there won't be any visual affordance to add a new user from the keyguard even if // the user is unlocked private boolean mAddUsersFromLockScreen; private boolean mUserSwitcherEnabled; @VisibleForTesting boolean mPauseRefreshUsers; private int mSecondaryUser = UserHandle.USER_NULL; Loading @@ -164,6 +164,7 @@ public class UserSwitcherController implements Dumpable { private FalsingManager mFalsingManager; private View mView; private String mCreateSupervisedUserPackage; private GlobalSettings mGlobalSettings; @Inject public UserSwitcherController(Context context, Loading @@ -181,6 +182,7 @@ public class UserSwitcherController implements Dumpable { FalsingManager falsingManager, TelephonyListenerManager telephonyListenerManager, SecureSettings secureSettings, GlobalSettings globalSettings, @Background Executor bgExecutor, @LongRunning Executor longRunningExecutor, @Main Executor uiExecutor, Loading @@ -202,6 +204,7 @@ public class UserSwitcherController implements Dumpable { mLatencyTracker = latencyTracker; mGuestResumeSessionReceiver = guestResumeSessionReceiver; mGuestResetOrExitSessionReceiver = guestResetOrExitSessionReceiver; mGlobalSettings = globalSettings; mBgExecutor = bgExecutor; mLongRunningExecutor = longRunningExecutor; mUiExecutor = uiExecutor; Loading Loading @@ -242,14 +245,19 @@ public class UserSwitcherController implements Dumpable { @Override public void onChange(boolean selfChange) { mSimpleUserSwitcher = shouldUseSimpleUserSwitcher(); mAddUsersFromLockScreen = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0; mAddUsersFromLockScreen = mGlobalSettings.getIntForUser( Settings.Global.ADD_USERS_WHEN_LOCKED, 0, UserHandle.USER_SYSTEM) != 0; mUserSwitcherEnabled = mGlobalSettings.getIntForUser( Settings.Global.USER_SWITCHER_ENABLED, 0, UserHandle.USER_SYSTEM) != 0; refreshUsers(UserHandle.USER_NULL); }; }; mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true, mSettingsObserver); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.USER_SWITCHER_ENABLED), true, mSettingsObserver); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true, mSettingsObserver); Loading Loading @@ -323,6 +331,10 @@ public class UserSwitcherController implements Dumpable { for (UserInfo info : infos) { boolean isCurrent = currentId == info.id; boolean switchToEnabled = canSwitchUsers || isCurrent; if (!mUserSwitcherEnabled && !info.isPrimary()) { continue; } if (info.isEnabled()) { if (info.isGuest()) { // Tapping guest icon triggers remove and a user switch therefore Loading @@ -349,9 +361,6 @@ public class UserSwitcherController implements Dumpable { } } } if (records.size() > 1 || guestRecord != null) { Prefs.putBoolean(mContext, Key.SEEN_MULTI_USER, true); } if (guestRecord == null) { if (mGuestUserAutoCreated) { Loading Loading @@ -420,12 +429,14 @@ public class UserSwitcherController implements Dumpable { } boolean canCreateGuest(boolean hasExistingGuest) { return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled && (currentUserCanCreateUsers() || anyoneCanCreateUsers()) && !hasExistingGuest; } boolean canCreateUser() { return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled && (currentUserCanCreateUsers() || anyoneCanCreateUsers()) && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY); } Loading Loading @@ -1115,8 +1126,8 @@ public class UserSwitcherController implements Dumpable { private boolean shouldUseSimpleUserSwitcher() { int defaultSimpleUserSwitcher = mContext.getResources().getBoolean( com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0; return Settings.Global.getInt(mContext.getContentResolver(), SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher) != 0; return mGlobalSettings.getIntForUser(SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher, UserHandle.USER_SYSTEM) != 0; } public void startActivity(Intent intent) { Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +60 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.hardware.fingerprint.FingerprintManager import android.os.Handler import android.os.UserHandle import android.os.UserManager import android.provider.Settings import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.ThreadedRenderer Loading @@ -54,6 +55,7 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.NotificationShadeWindowView import com.android.systemui.telephony.TelephonyListenerManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock import org.junit.Assert.assertEquals Loading @@ -70,6 +72,7 @@ import org.mockito.Mockito.`when` import org.mockito.Mockito.any import org.mockito.Mockito.doNothing import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading Loading @@ -98,6 +101,7 @@ class UserSwitcherControllerTest : SysuiTestCase() { @Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView @Mock private lateinit var threadedRenderer: ThreadedRenderer @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator @Mock private lateinit var globalSettings: GlobalSettings @Mock private lateinit var guestSessionNotification: GuestSessionNotification @Mock private lateinit var guestResetOrExitSessionReceiver: GuestResetOrExitSessionReceiver private lateinit var resetSessionDialogFactory: Loading Loading @@ -175,6 +179,22 @@ class UserSwitcherControllerTest : SysuiTestCase() { `when`(userTracker.userId).thenReturn(ownerId) `when`(userTracker.userInfo).thenReturn(ownerInfo) `when`( globalSettings.getIntForUser( eq(Settings.Global.ADD_USERS_WHEN_LOCKED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(1) setupController() } Loading @@ -195,6 +215,7 @@ class UserSwitcherControllerTest : SysuiTestCase() { falsingManager, telephonyListenerManager, secureSettings, globalSettings, bgExecutor, longRunningExecutor, uiExecutor, Loading Loading @@ -501,4 +522,43 @@ class UserSwitcherControllerTest : SysuiTestCase() { // THEN a supervised user can NOT be constructed assertFalse(userSwitcherController.canCreateSupervisedUser()) } @Test fun testCannotCreateUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateUser()) } @Test fun testCannotCreateGuestUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateGuest(false)) } @Test fun testCannotCreateSupervisedUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateSupervisedUser()) } } Loading
packages/SystemUI/src/com/android/systemui/Prefs.java +0 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,6 @@ public final class Prefs { Key.QS_WORK_ADDED, Key.QS_NIGHTDISPLAY_ADDED, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.SEEN_MULTI_USER, Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, Loading Loading @@ -106,7 +105,6 @@ public final class Prefs { * Settings panel. */ String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount"; String SEEN_MULTI_USER = "HasSeenMultiUser"; String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount"; String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed"; String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData"; Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +22 −11 Original line number Diff line number Diff line Loading @@ -66,8 +66,6 @@ import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.Dumpable; import com.android.systemui.GuestResetOrExitSessionReceiver; import com.android.systemui.GuestResumeSessionReceiver; import com.android.systemui.Prefs; import com.android.systemui.Prefs.Key; import com.android.systemui.R; import com.android.systemui.SystemUISecondaryUserService; import com.android.systemui.animation.DialogLaunchAnimator; Loading @@ -86,6 +84,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.user.CreateUserActivity; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; Loading Loading @@ -148,6 +147,7 @@ public class UserSwitcherController implements Dumpable { // When false, there won't be any visual affordance to add a new user from the keyguard even if // the user is unlocked private boolean mAddUsersFromLockScreen; private boolean mUserSwitcherEnabled; @VisibleForTesting boolean mPauseRefreshUsers; private int mSecondaryUser = UserHandle.USER_NULL; Loading @@ -164,6 +164,7 @@ public class UserSwitcherController implements Dumpable { private FalsingManager mFalsingManager; private View mView; private String mCreateSupervisedUserPackage; private GlobalSettings mGlobalSettings; @Inject public UserSwitcherController(Context context, Loading @@ -181,6 +182,7 @@ public class UserSwitcherController implements Dumpable { FalsingManager falsingManager, TelephonyListenerManager telephonyListenerManager, SecureSettings secureSettings, GlobalSettings globalSettings, @Background Executor bgExecutor, @LongRunning Executor longRunningExecutor, @Main Executor uiExecutor, Loading @@ -202,6 +204,7 @@ public class UserSwitcherController implements Dumpable { mLatencyTracker = latencyTracker; mGuestResumeSessionReceiver = guestResumeSessionReceiver; mGuestResetOrExitSessionReceiver = guestResetOrExitSessionReceiver; mGlobalSettings = globalSettings; mBgExecutor = bgExecutor; mLongRunningExecutor = longRunningExecutor; mUiExecutor = uiExecutor; Loading Loading @@ -242,14 +245,19 @@ public class UserSwitcherController implements Dumpable { @Override public void onChange(boolean selfChange) { mSimpleUserSwitcher = shouldUseSimpleUserSwitcher(); mAddUsersFromLockScreen = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0; mAddUsersFromLockScreen = mGlobalSettings.getIntForUser( Settings.Global.ADD_USERS_WHEN_LOCKED, 0, UserHandle.USER_SYSTEM) != 0; mUserSwitcherEnabled = mGlobalSettings.getIntForUser( Settings.Global.USER_SWITCHER_ENABLED, 0, UserHandle.USER_SYSTEM) != 0; refreshUsers(UserHandle.USER_NULL); }; }; mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true, mSettingsObserver); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.USER_SWITCHER_ENABLED), true, mSettingsObserver); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true, mSettingsObserver); Loading Loading @@ -323,6 +331,10 @@ public class UserSwitcherController implements Dumpable { for (UserInfo info : infos) { boolean isCurrent = currentId == info.id; boolean switchToEnabled = canSwitchUsers || isCurrent; if (!mUserSwitcherEnabled && !info.isPrimary()) { continue; } if (info.isEnabled()) { if (info.isGuest()) { // Tapping guest icon triggers remove and a user switch therefore Loading @@ -349,9 +361,6 @@ public class UserSwitcherController implements Dumpable { } } } if (records.size() > 1 || guestRecord != null) { Prefs.putBoolean(mContext, Key.SEEN_MULTI_USER, true); } if (guestRecord == null) { if (mGuestUserAutoCreated) { Loading Loading @@ -420,12 +429,14 @@ public class UserSwitcherController implements Dumpable { } boolean canCreateGuest(boolean hasExistingGuest) { return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled && (currentUserCanCreateUsers() || anyoneCanCreateUsers()) && !hasExistingGuest; } boolean canCreateUser() { return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled && (currentUserCanCreateUsers() || anyoneCanCreateUsers()) && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY); } Loading Loading @@ -1115,8 +1126,8 @@ public class UserSwitcherController implements Dumpable { private boolean shouldUseSimpleUserSwitcher() { int defaultSimpleUserSwitcher = mContext.getResources().getBoolean( com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0; return Settings.Global.getInt(mContext.getContentResolver(), SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher) != 0; return mGlobalSettings.getIntForUser(SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher, UserHandle.USER_SYSTEM) != 0; } public void startActivity(Intent intent) { Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +60 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.hardware.fingerprint.FingerprintManager import android.os.Handler import android.os.UserHandle import android.os.UserManager import android.provider.Settings import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.ThreadedRenderer Loading @@ -54,6 +55,7 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.NotificationShadeWindowView import com.android.systemui.telephony.TelephonyListenerManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.SecureSettings import com.android.systemui.util.time.FakeSystemClock import org.junit.Assert.assertEquals Loading @@ -70,6 +72,7 @@ import org.mockito.Mockito.`when` import org.mockito.Mockito.any import org.mockito.Mockito.doNothing import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading Loading @@ -98,6 +101,7 @@ class UserSwitcherControllerTest : SysuiTestCase() { @Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView @Mock private lateinit var threadedRenderer: ThreadedRenderer @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator @Mock private lateinit var globalSettings: GlobalSettings @Mock private lateinit var guestSessionNotification: GuestSessionNotification @Mock private lateinit var guestResetOrExitSessionReceiver: GuestResetOrExitSessionReceiver private lateinit var resetSessionDialogFactory: Loading Loading @@ -175,6 +179,22 @@ class UserSwitcherControllerTest : SysuiTestCase() { `when`(userTracker.userId).thenReturn(ownerId) `when`(userTracker.userInfo).thenReturn(ownerInfo) `when`( globalSettings.getIntForUser( eq(Settings.Global.ADD_USERS_WHEN_LOCKED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(1) setupController() } Loading @@ -195,6 +215,7 @@ class UserSwitcherControllerTest : SysuiTestCase() { falsingManager, telephonyListenerManager, secureSettings, globalSettings, bgExecutor, longRunningExecutor, uiExecutor, Loading Loading @@ -501,4 +522,43 @@ class UserSwitcherControllerTest : SysuiTestCase() { // THEN a supervised user can NOT be constructed assertFalse(userSwitcherController.canCreateSupervisedUser()) } @Test fun testCannotCreateUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateUser()) } @Test fun testCannotCreateGuestUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateGuest(false)) } @Test fun testCannotCreateSupervisedUserWhenUserSwitcherDisabled() { `when`( globalSettings.getIntForUser( eq(Settings.Global.USER_SWITCHER_ENABLED), anyInt(), eq(UserHandle.USER_SYSTEM) ) ).thenReturn(0) setupController() assertFalse(userSwitcherController.canCreateSupervisedUser()) } }