From 7968047fc56e4fd0789e510e463abb03d7c61886 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Mon, 14 Aug 2023 18:33:01 +0000 Subject: [PATCH] Disable multiuser toggle when more than 1 user is created It makes more sense to have the toggle as on permanently as long as there are other users on the device. Otherwise if we toggle off "Allow multiple users", other users get hidden. Also with current behaviour the any admin can switch the toggle and this can block any other user, including main, from being able to use the device. Bug: 295183792 Test: atest MultiUserSwitchBarControllerTest && UserSettingsTest Change-Id: I8cb0671d780f45c17a9bb7c9a9d3b108128ead9d --- .../users/MultiUserSwitchBarController.java | 10 +++++-- .../android/settings/users/UserSettings.java | 6 +++- .../MultiUserSwitchBarControllerTest.java | 28 +++++++++++++++++-- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/users/MultiUserSwitchBarController.java b/src/com/android/settings/users/MultiUserSwitchBarController.java index 33651c31fc4..3697bb036cd 100644 --- a/src/com/android/settings/users/MultiUserSwitchBarController.java +++ b/src/com/android/settings/users/MultiUserSwitchBarController.java @@ -46,13 +46,18 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw MultiUserSwitchBarController(Context context, SwitchWidgetController switchBar, - OnMultiUserSwitchChangedListener listener) { + boolean canUserSwitchToggle, OnMultiUserSwitchChangedListener listener) { mContext = context; mSwitchBar = switchBar; mListener = listener; mUserCapabilities = UserCapabilities.create(context); mSwitchBar.setChecked(mUserCapabilities.mUserSwitcherEnabled); + setToggleEnabled(canUserSwitchToggle); + mSwitchBar.setListener(this); + } + + void setToggleEnabled(boolean canUserSwitchToggle) { if (mUserCapabilities.mDisallowSwitchUser) { mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal .checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH, @@ -64,9 +69,8 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw UserHandle.myUserId())); } else { mSwitchBar.setEnabled(!mUserCapabilities.mDisallowSwitchUser - && !mUserCapabilities.mIsGuest && mUserCapabilities.isAdmin()); + && !mUserCapabilities.mIsGuest && canUserSwitchToggle); } - mSwitchBar.setListener(this); } @Override diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 64699ffa238..c63517de447 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -290,8 +290,9 @@ public class UserSettings extends SettingsPreferenceFragment } else { switchBar.hide(); } + boolean isToggleEnabled = mUserManager.getFullUserCount() == 1; mSwitchBarController = new MultiUserSwitchBarController(activity, - new MainSwitchBarController(switchBar), this /* listener */); + new MainSwitchBarController(switchBar), isToggleEnabled, this /* listener */); getSettingsLifecycle().addObserver(mSwitchBarController); boolean openUserEditDialog = getIntent().getBooleanExtra( EXTRA_OPEN_DIALOG_USER_PROFILE_EDITOR, false); @@ -422,6 +423,9 @@ public class UserSettings extends SettingsPreferenceFragment mRemoveGuestOnExitPreferenceController.getPreferenceKey())); if (mShouldUpdateUserList) { updateUI(); + // Update state of "Allow multiple users" toggle when list of users updates + boolean isToggleEnabled = mUserManager.getFullUserCount() == 1; + mSwitchBarController.setToggleEnabled(isToggleEnabled); } } diff --git a/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java index 718e01bebe0..89319c4dbc9 100644 --- a/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/users/MultiUserSwitchBarControllerTest.java @@ -65,7 +65,7 @@ public class MultiUserSwitchBarControllerTest { UserManager.DISALLOW_USER_SWITCH, true); final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, - mSwitchBarController, null); + mSwitchBarController, true, null); verify(mSwitchBarController).setDisabledByAdmin(any()); } @@ -76,8 +76,32 @@ public class MultiUserSwitchBarControllerTest { UserManager.DISALLOW_USER_SWITCH, false); final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, - mSwitchBarController, null); + mSwitchBarController, true, null); verify(mSwitchBarController, never()).setDisabledByAdmin(any()); } + + @Test + public void onStart_allowUserSwitch_setDisabledAfterInitialization_shouldBeDisabled() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, false); + + final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, + mSwitchBarController, true, null); + verify(mSwitchBarController).setEnabled(true); + controller.setToggleEnabled(false); + verify(mSwitchBarController).setEnabled(false); + } + + @Test + public void onStart_allowUserSwitch_setEnabledAfterInitialization_shouldBeEnabled() { + mUserManager.setUserRestriction(UserHandle.of(UserHandle.myUserId()), + UserManager.DISALLOW_USER_SWITCH, false); + + final MultiUserSwitchBarController controller = new MultiUserSwitchBarController(mContext, + mSwitchBarController, false, null); + verify(mSwitchBarController).setEnabled(false); + controller.setToggleEnabled(true); + verify(mSwitchBarController).setEnabled(true); + } }