Refactor multiuser toggle to control user switch feature

The  name  "Allow multiple users" is too ambiguous. It sounds like by toggling it off, the feature is completely disabled. In fact, it only hides user switcher. In conjunction with hiding other users from the list, it makes it appear as all the users get deleted when the toggle is off. On the contrary, users might be running in background when the toggle is off.

After this change, the new name better represents the intention behind this toggle, as well as makes the UI more intuitive. The users are not being hidden anymore. But switching preference gets disabled.

Since the toggle can only be enabled or disabled by owner (after this refactoring), it means that Owner has full control over multiuser settings and is able to perform actions on users without having to enable the toggle.

Bug: 336762423
Test: atest UserSettingsTest && atest UserDetailsSettingsTest
Flag: android.multiuser.new_multiuser_settings_ux
Change-Id: Id9d507039b58d3df66fe78710409716fd4816890
This commit is contained in:
Tetiana Meronyk
2024-05-01 13:15:34 +00:00
parent 3cac411486
commit caef61b5eb
8 changed files with 132 additions and 21 deletions

View File

@@ -44,7 +44,11 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
restrictedSwitchPreference.setVisible(true);
} else {
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
}
}
}
@@ -55,7 +59,11 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
} else if (mUserCaps.disallowAddUser() || mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
return AVAILABLE;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}
}

View File

@@ -45,6 +45,8 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
public int getAvailabilityStatus() {
if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
return DISABLED_FOR_USER;
} else if (android.multiuser.Flags.newMultiuserSettingsUx()) {
return AVAILABLE;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@@ -74,7 +76,7 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
public void updateState(Preference preference) {
super.updateState(preference);
mUserCaps.updateAddUserCapabilities(mContext);
preference.setVisible(isAvailable() && mUserCaps.mUserSwitcherEnabled
preference.setVisible(isAvailable()
&& mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
&& !UserManager.isHeadlessSystemUserMode());
}

View File

@@ -72,7 +72,11 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
restrictedSwitchPreference.setVisible(true);
} else {
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
}
}
}
@@ -89,7 +93,11 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
|| mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
return AVAILABLE;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}
}

View File

@@ -126,7 +126,11 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
@Override
public void onResume() {
super.onResume();
mSwitchUserPref.setEnabled(canSwitchUserNow());
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
mSwitchUserPref.setEnabled(canSwitchUserNow() && mUserCaps.mUserSwitcherEnabled);
} else {
mSwitchUserPref.setEnabled(canSwitchUserNow());
}
if (mUserInfo.isGuest() && mGuestUserAutoCreated) {
mRemoveUserPref.setEnabled((mUserInfo.flags & UserInfo.FLAG_INITIALIZED) != 0);
}
@@ -358,7 +362,12 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mSwitchUserPref.setDisabledByAdmin(RestrictedLockUtilsInternal.getDeviceOwner(context));
} else {
mSwitchUserPref.setDisabledByAdmin(null);
mSwitchUserPref.setSelectable(true);
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
mSwitchUserPref.setEnabled(mUserCaps.mUserSwitcherEnabled);
mSwitchUserPref.setSelectable(mUserCaps.mUserSwitcherEnabled);
} else {
mSwitchUserPref.setSelectable(true);
}
mSwitchUserPref.setOnPreferenceClickListener(this);
}
if (mUserInfo.isMain() || mUserInfo.isGuest() || !UserManager.isMultipleAdminEnabled()

View File

@@ -1198,15 +1198,23 @@ public class UserSettings extends SettingsPreferenceFragment
}
List<UserInfo> users;
if (mUserCaps.mUserSwitcherEnabled) {
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
// Only users that can be switched to should show up here.
// e.g. Managed profiles appear under Accounts Settings instead
users = mUserManager.getAliveUsers().stream()
.filter(UserInfo::supportsSwitchToByUser)
.collect(Collectors.toList());
} else {
// Only current user will be displayed in case of multi-user switch is disabled
users = List.of(mUserManager.getUserInfo(context.getUserId()));
if (mUserCaps.mUserSwitcherEnabled) {
// Only users that can be switched to should show up here.
// e.g. Managed profiles appear under Accounts Settings instead
users = mUserManager.getAliveUsers().stream()
.filter(UserInfo::supportsSwitchToByUser)
.collect(Collectors.toList());
} else {
// Only current user will be displayed in case of multi-user switch is disabled
users = List.of(mUserManager.getUserInfo(context.getUserId()));
}
}
final ArrayList<Integer> missingIcons = new ArrayList<>();
@@ -1423,10 +1431,16 @@ public class UserSettings extends SettingsPreferenceFragment
} else {
pref.setDisabledByAdmin(null);
}
if (mUserCaps.mUserSwitcherEnabled) {
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
mGuestUserCategory.addPreference(pref);
// guest user preference is shown hence also make guest category visible
mGuestUserCategory.setVisible(true);
} else {
if (mUserCaps.mUserSwitcherEnabled) {
mGuestUserCategory.addPreference(pref);
// guest user preference is shown hence also make guest category visible
mGuestUserCategory.setVisible(true);
}
}
isGuestAlreadyCreated = true;
}
@@ -1453,7 +1467,8 @@ public class UserSettings extends SettingsPreferenceFragment
if (!isGuestAlreadyCreated && mUserCaps.mCanAddGuest
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST)
&& WizardManagerHelper.isDeviceProvisioned(context)
&& mUserCaps.mUserSwitcherEnabled) {
&& (mUserCaps.mUserSwitcherEnabled
|| android.multiuser.Flags.newMultiuserSettingsUx())) {
Drawable icon = context.getDrawable(
com.android.settingslib.R.drawable.ic_account_circle);
mAddGuest.setIcon(centerAndTint(icon));
@@ -1466,7 +1481,12 @@ public class UserSettings extends SettingsPreferenceFragment
mAddGuest.setEnabled(false);
} else {
mAddGuest.setTitle(com.android.settingslib.R.string.guest_new_guest);
mAddGuest.setEnabled(canSwitchUserNow());
if (android.multiuser.Flags.newMultiuserSettingsUx()
&& mUserCaps.mDisallowAddUserSetByAdmin) {
mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else {
mAddGuest.setEnabled(canSwitchUserNow());
}
}
} else {
mAddGuest.setVisible(false);
@@ -1496,7 +1516,8 @@ public class UserSettings extends SettingsPreferenceFragment
boolean canAddRestrictedProfile) {
if ((mUserCaps.mCanAddUser && !mUserCaps.mDisallowAddUserSetByAdmin)
&& WizardManagerHelper.isDeviceProvisioned(context)
&& mUserCaps.mUserSwitcherEnabled) {
&& (mUserCaps.mUserSwitcherEnabled
|| android.multiuser.Flags.newMultiuserSettingsUx())) {
addUser.setVisible(true);
addUser.setSelectable(true);
final boolean canAddMoreUsers =
@@ -1514,6 +1535,10 @@ public class UserSettings extends SettingsPreferenceFragment
addUser.setDisabledByAdmin(
mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
}
} else if (android.multiuser.Flags.newMultiuserSettingsUx()
&& mUserCaps.mDisallowAddUserSetByAdmin) {
addUser.setVisible(true);
addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else {
addUser.setVisible(false);
}