Merge "User switcher - Update when multiple users enabled/disabled" into tm-dev

This commit is contained in:
Matt Pietal
2022-04-12 17:18:09 +00:00
committed by Android (Google) Code Review
3 changed files with 82 additions and 13 deletions

View File

@@ -63,7 +63,6 @@ public final class Prefs {
Key.QS_WORK_ADDED, Key.QS_WORK_ADDED,
Key.QS_NIGHTDISPLAY_ADDED, Key.QS_NIGHTDISPLAY_ADDED,
Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
Key.SEEN_MULTI_USER,
Key.SEEN_RINGER_GUIDANCE_COUNT, Key.SEEN_RINGER_GUIDANCE_COUNT,
Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.QS_HAS_TURNED_OFF_MOBILE_DATA,
Key.TOUCHED_RINGER_TOGGLE, Key.TOUCHED_RINGER_TOGGLE,
@@ -106,7 +105,6 @@ public final class Prefs {
* Settings panel. * Settings panel.
*/ */
String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount"; String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount";
String SEEN_MULTI_USER = "HasSeenMultiUser";
String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount"; String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed"; String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed";
String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData"; String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData";

View File

@@ -64,8 +64,6 @@ import com.android.settingslib.users.UserCreatingDialog;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.GuestResumeSessionReceiver; 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.R;
import com.android.systemui.SystemUISecondaryUserService; import com.android.systemui.SystemUISecondaryUserService;
import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.animation.DialogLaunchAnimator;
@@ -84,6 +82,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.user.CreateUserActivity; import com.android.systemui.user.CreateUserActivity;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.settings.SecureSettings;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -144,6 +143,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 // When false, there won't be any visual affordance to add a new user from the keyguard even if
// the user is unlocked // the user is unlocked
private boolean mAddUsersFromLockScreen; private boolean mAddUsersFromLockScreen;
private boolean mUserSwitcherEnabled;
@VisibleForTesting @VisibleForTesting
boolean mPauseRefreshUsers; boolean mPauseRefreshUsers;
private int mSecondaryUser = UserHandle.USER_NULL; private int mSecondaryUser = UserHandle.USER_NULL;
@@ -160,6 +160,7 @@ public class UserSwitcherController implements Dumpable {
private FalsingManager mFalsingManager; private FalsingManager mFalsingManager;
private View mView; private View mView;
private String mCreateSupervisedUserPackage; private String mCreateSupervisedUserPackage;
private GlobalSettings mGlobalSettings;
@Inject @Inject
public UserSwitcherController(Context context, public UserSwitcherController(Context context,
@@ -177,6 +178,7 @@ public class UserSwitcherController implements Dumpable {
FalsingManager falsingManager, FalsingManager falsingManager,
TelephonyListenerManager telephonyListenerManager, TelephonyListenerManager telephonyListenerManager,
SecureSettings secureSettings, SecureSettings secureSettings,
GlobalSettings globalSettings,
@Background Executor bgExecutor, @Background Executor bgExecutor,
@LongRunning Executor longRunningExecutor, @LongRunning Executor longRunningExecutor,
@Main Executor uiExecutor, @Main Executor uiExecutor,
@@ -194,6 +196,7 @@ public class UserSwitcherController implements Dumpable {
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mInteractionJankMonitor = interactionJankMonitor; mInteractionJankMonitor = interactionJankMonitor;
mLatencyTracker = latencyTracker; mLatencyTracker = latencyTracker;
mGlobalSettings = globalSettings;
mGuestResumeSessionReceiver = new GuestResumeSessionReceiver( mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
this, mUserTracker, mUiEventLogger, secureSettings); this, mUserTracker, mUiEventLogger, secureSettings);
mBgExecutor = bgExecutor; mBgExecutor = bgExecutor;
@@ -237,14 +240,19 @@ public class UserSwitcherController implements Dumpable {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
mSimpleUserSwitcher = shouldUseSimpleUserSwitcher(); mSimpleUserSwitcher = shouldUseSimpleUserSwitcher();
mAddUsersFromLockScreen = Settings.Global.getInt(mContext.getContentResolver(), mAddUsersFromLockScreen = mGlobalSettings.getIntForUser(
Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0; 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); refreshUsers(UserHandle.USER_NULL);
}; };
}; };
mContext.getContentResolver().registerContentObserver( mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true, Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
mSettingsObserver); mSettingsObserver);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.USER_SWITCHER_ENABLED), true,
mSettingsObserver);
mContext.getContentResolver().registerContentObserver( mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true, Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true,
mSettingsObserver); mSettingsObserver);
@@ -314,6 +322,10 @@ public class UserSwitcherController implements Dumpable {
for (UserInfo info : infos) { for (UserInfo info : infos) {
boolean isCurrent = currentId == info.id; boolean isCurrent = currentId == info.id;
boolean switchToEnabled = canSwitchUsers || isCurrent; boolean switchToEnabled = canSwitchUsers || isCurrent;
if (!mUserSwitcherEnabled && !info.isPrimary()) {
continue;
}
if (info.isEnabled()) { if (info.isEnabled()) {
if (info.isGuest()) { if (info.isGuest()) {
// Tapping guest icon triggers remove and a user switch therefore // Tapping guest icon triggers remove and a user switch therefore
@@ -340,9 +352,6 @@ public class UserSwitcherController implements Dumpable {
} }
} }
} }
if (records.size() > 1 || guestRecord != null) {
Prefs.putBoolean(mContext, Key.SEEN_MULTI_USER, true);
}
if (guestRecord == null) { if (guestRecord == null) {
if (mGuestUserAutoCreated) { if (mGuestUserAutoCreated) {
@@ -411,12 +420,14 @@ public class UserSwitcherController implements Dumpable {
} }
boolean canCreateGuest(boolean hasExistingGuest) { boolean canCreateGuest(boolean hasExistingGuest) {
return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled
&& (currentUserCanCreateUsers() || anyoneCanCreateUsers())
&& !hasExistingGuest; && !hasExistingGuest;
} }
boolean canCreateUser() { boolean canCreateUser() {
return (currentUserCanCreateUsers() || anyoneCanCreateUsers()) return mUserSwitcherEnabled
&& (currentUserCanCreateUsers() || anyoneCanCreateUsers())
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY); && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY);
} }
@@ -1034,8 +1045,8 @@ public class UserSwitcherController implements Dumpable {
private boolean shouldUseSimpleUserSwitcher() { private boolean shouldUseSimpleUserSwitcher() {
int defaultSimpleUserSwitcher = mContext.getResources().getBoolean( int defaultSimpleUserSwitcher = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0; com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0;
return Settings.Global.getInt(mContext.getContentResolver(), return mGlobalSettings.getIntForUser(SIMPLE_USER_SWITCHER_GLOBAL_SETTING,
SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher) != 0; defaultSimpleUserSwitcher, UserHandle.USER_SYSTEM) != 0;
} }
public void startActivity(Intent intent) { public void startActivity(Intent intent) {

View File

@@ -28,6 +28,7 @@ import android.hardware.fingerprint.FingerprintManager
import android.os.Handler import android.os.Handler
import android.os.UserHandle import android.os.UserHandle
import android.os.UserManager import android.os.UserManager
import android.provider.Settings
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.testing.TestableLooper import android.testing.TestableLooper
import android.view.ThreadedRenderer import android.view.ThreadedRenderer
@@ -51,6 +52,7 @@ import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.NotificationShadeWindowView import com.android.systemui.statusbar.phone.NotificationShadeWindowView
import com.android.systemui.telephony.TelephonyListenerManager import com.android.systemui.telephony.TelephonyListenerManager
import com.android.systemui.util.concurrency.FakeExecutor 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.settings.SecureSettings
import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.FakeSystemClock
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@@ -67,6 +69,7 @@ import org.mockito.Mockito.`when`
import org.mockito.Mockito.any import org.mockito.Mockito.any
import org.mockito.Mockito.doNothing import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doReturn import org.mockito.Mockito.doReturn
import org.mockito.Mockito.eq
import org.mockito.Mockito.mock import org.mockito.Mockito.mock
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -95,6 +98,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
@Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView @Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView
@Mock private lateinit var threadedRenderer: ThreadedRenderer @Mock private lateinit var threadedRenderer: ThreadedRenderer
@Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
@Mock private lateinit var globalSettings: GlobalSettings
private lateinit var testableLooper: TestableLooper private lateinit var testableLooper: TestableLooper
private lateinit var bgExecutor: FakeExecutor private lateinit var bgExecutor: FakeExecutor
private lateinit var longRunningExecutor: FakeExecutor private lateinit var longRunningExecutor: FakeExecutor
@@ -148,6 +152,22 @@ class UserSwitcherControllerTest : SysuiTestCase() {
`when`(userTracker.userId).thenReturn(ownerId) `when`(userTracker.userId).thenReturn(ownerId)
`when`(userTracker.userInfo).thenReturn(ownerInfo) `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() setupController()
} }
@@ -168,6 +188,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
falsingManager, falsingManager,
telephonyListenerManager, telephonyListenerManager,
secureSettings, secureSettings,
globalSettings,
bgExecutor, bgExecutor,
longRunningExecutor, longRunningExecutor,
uiExecutor, uiExecutor,
@@ -469,4 +490,43 @@ class UserSwitcherControllerTest : SysuiTestCase() {
// THEN a supervised user can NOT be constructed // THEN a supervised user can NOT be constructed
assertFalse(userSwitcherController.canCreateSupervisedUser()) 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())
}
} }