Merge changes Ie07816b7,I1b5aeeee,Id9d50703 into main

* changes:
  Show disabled add actions in COPE mode
  Add handling of admin enforced restrictions in Users Settings
  Refactor multiuser toggle to control user switch feature
This commit is contained in:
Tetiana Meronyk
2024-06-25 12:49:25 +00:00
committed by Android (Google) Code Review
9 changed files with 306 additions and 45 deletions

View File

@@ -42,9 +42,18 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
if (!isAvailable()) {
restrictedSwitchPreference.setVisible(false);
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
restrictedSwitchPreference.setVisible(true);
if (mUserCaps.mDisallowAddUserSetByAdmin) {
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else if (mUserCaps.mDisallowAddUser) {
restrictedSwitchPreference.setVisible(false);
}
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
}
}
}
@@ -52,6 +61,8 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr
public int getAvailabilityStatus() {
if (!mUserCaps.isAdmin()) {
return DISABLED_FOR_USER;
} else if (android.multiuser.Flags.newMultiuserSettingsUx()) {
return AVAILABLE;
} else if (mUserCaps.disallowAddUser() || mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
} else {

View File

@@ -19,12 +19,16 @@ package com.android.settings.users;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedSwitchPreference;
/**
* Controls the preference on the user settings screen which determines whether the guest user
@@ -43,10 +47,21 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
@Override
public int getAvailabilityStatus() {
if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
|| UserManager.isHeadlessSystemUserMode()) {
return DISABLED_FOR_USER;
}
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
if (!mUserCaps.isAdmin()) {
return DISABLED_FOR_USER;
}
return AVAILABLE;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) {
return DISABLED_FOR_USER;
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}
}
@@ -74,8 +89,31 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll
public void updateState(Preference preference) {
super.updateState(preference);
mUserCaps.updateAddUserCapabilities(mContext);
preference.setVisible(isAvailable() && mUserCaps.mUserSwitcherEnabled
&& mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
&& !UserManager.isHeadlessSystemUserMode());
final RestrictedSwitchPreference restrictedSwitchPreference =
(RestrictedSwitchPreference) preference;
restrictedSwitchPreference.setChecked(isChecked());
if (!isAvailable()) {
restrictedSwitchPreference.setVisible(false);
} else {
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
restrictedSwitchPreference.setVisible(true);
final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin =
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
if (disallowRemoveUserAdmin != null) {
restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin);
} else if (mUserCaps.mDisallowAddUserSetByAdmin) {
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else if (mUserCaps.mDisallowAddUser) {
// Adding user is restricted by system
restrictedSwitchPreference.setVisible(false);
}
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled
&& isAvailable());
}
}
}
}

View File

@@ -57,11 +57,6 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw
mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_USER_SWITCH,
UserHandle.myUserId()));
} else if (mUserCapabilities.mDisallowAddUser) {
mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal
.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_ADD_USER,
UserHandle.myUserId()));
} else {
mSwitchBar.setEnabled(mUserCapabilities.mIsMain);
}

View File

@@ -22,6 +22,7 @@ import android.content.DialogInterface;
import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
@@ -33,6 +34,8 @@ import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedSwitchPreference;
/**
@@ -70,9 +73,24 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
if (!isAvailable()) {
restrictedSwitchPreference.setVisible(false);
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
restrictedSwitchPreference.setVisible(true);
final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin =
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
if (disallowRemoveUserAdmin != null) {
restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin);
} else if (mUserCaps.mDisallowAddUserSetByAdmin) {
restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else if (mUserCaps.mDisallowAddUser) {
// Adding user is restricted by system
restrictedSwitchPreference.setVisible(false);
}
} else {
restrictedSwitchPreference.setDisabledByAdmin(
mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null);
restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled);
}
}
}
@@ -82,14 +100,24 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl
// then disable this controller
// also disable this controller for non-admin users
// also disable when config_guestUserAllowEphemeralStateChange is false
if (mUserManager.isGuestUserAlwaysEphemeral()
|| !UserManager.isGuestUserAllowEphemeralStateChange()
|| !mUserCaps.isAdmin()
|| mUserCaps.disallowAddUser()
|| mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
if (android.multiuser.Flags.newMultiuserSettingsUx()) {
if (mUserManager.isGuestUserAlwaysEphemeral()
|| !UserManager.isGuestUserAllowEphemeralStateChange()
|| !mUserCaps.isAdmin()) {
return DISABLED_FOR_USER;
} else {
return AVAILABLE;
}
} else {
return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
if (mUserManager.isGuestUserAlwaysEphemeral()
|| !UserManager.isGuestUserAllowEphemeralStateChange()
|| !mUserCaps.isAdmin()
|| mUserCaps.disallowAddUser()
|| mUserCaps.disallowAddUserSetByAdmin()) {
return DISABLED_FOR_USER;
} 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

@@ -463,7 +463,8 @@ public class UserSettings extends SettingsPreferenceFragment
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
int pos = 0;
if (!isCurrentUserAdmin() && canSwitchUserNow() && !isCurrentUserGuest()) {
if (!isCurrentUserAdmin() && (canSwitchUserNow() || Flags.newMultiuserSettingsUx())
&& !isCurrentUserGuest()) {
String nickname = mUserManager.getUserName();
MenuItem removeThisUser = menu.add(0, MENU_REMOVE_USER, pos++,
getResources().getString(R.string.user_remove_user_menu, nickname));
@@ -1198,15 +1199,23 @@ public class UserSettings extends SettingsPreferenceFragment
}
List<UserInfo> users;
if (mUserCaps.mUserSwitcherEnabled) {
if (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<>();
@@ -1257,7 +1266,10 @@ public class UserSettings extends SettingsPreferenceFragment
pref.setSummary(R.string.user_summary_not_set_up);
// Disallow setting up user which results in user switching when the
// restriction is set.
pref.setEnabled(!mUserCaps.mDisallowSwitchUser && canSwitchUserNow());
// If newMultiuserSettingsUx flag is enabled, allow opening user details page
// since switch to user will be disabled
pref.setEnabled((!mUserCaps.mDisallowSwitchUser && canSwitchUserNow())
|| Flags.newMultiuserSettingsUx());
}
} else if (user.isRestricted()) {
pref.setSummary(R.string.user_summary_restricted_profile);
@@ -1417,16 +1429,22 @@ public class UserSettings extends SettingsPreferenceFragment
getContext().getResources(), icon)));
pref.setKey(KEY_USER_GUEST);
pref.setOrder(Preference.DEFAULT_ORDER);
if (mUserCaps.mDisallowSwitchUser) {
if (mUserCaps.mDisallowSwitchUser && !Flags.newMultiuserSettingsUx()) {
pref.setDisabledByAdmin(
RestrictedLockUtilsInternal.getDeviceOwner(context));
} else {
pref.setDisabledByAdmin(null);
}
if (mUserCaps.mUserSwitcherEnabled) {
if (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;
}
@@ -1450,10 +1468,11 @@ public class UserSettings extends SettingsPreferenceFragment
private boolean updateAddGuestPreference(Context context, boolean isGuestAlreadyCreated) {
boolean isVisible = false;
if (!isGuestAlreadyCreated && mUserCaps.mCanAddGuest
if (!isGuestAlreadyCreated && (mUserCaps.mCanAddGuest
|| (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser))
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST)
&& WizardManagerHelper.isDeviceProvisioned(context)
&& mUserCaps.mUserSwitcherEnabled) {
&& (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
Drawable icon = context.getDrawable(
com.android.settingslib.R.drawable.ic_account_circle);
mAddGuest.setIcon(centerAndTint(icon));
@@ -1466,7 +1485,25 @@ public class UserSettings extends SettingsPreferenceFragment
mAddGuest.setEnabled(false);
} else {
mAddGuest.setTitle(com.android.settingslib.R.string.guest_new_guest);
mAddGuest.setEnabled(canSwitchUserNow());
if (Flags.newMultiuserSettingsUx()
&& mUserCaps.mDisallowAddUserSetByAdmin) {
mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) {
final List<UserManager.EnforcingUser> enforcingUsers =
mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
UserHandle.of(UserHandle.myUserId()));
if (!enforcingUsers.isEmpty()) {
final UserManager.EnforcingUser enforcingUser = enforcingUsers.get(0);
final int restrictionSource = enforcingUser.getUserRestrictionSource();
if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
mAddGuest.setEnabled(false);
} else {
mAddGuest.setVisible(false);
}
}
} else {
mAddGuest.setEnabled(canSwitchUserNow() || Flags.newMultiuserSettingsUx());
}
}
} else {
mAddGuest.setVisible(false);
@@ -1494,16 +1531,18 @@ public class UserSettings extends SettingsPreferenceFragment
private void updateAddUserCommon(Context context, RestrictedPreference addUser,
boolean canAddRestrictedProfile) {
if ((mUserCaps.mCanAddUser && !mUserCaps.mDisallowAddUserSetByAdmin)
if ((mUserCaps.mCanAddUser
&& !(mUserCaps.mDisallowAddUserSetByAdmin && Flags.newMultiuserSettingsUx()))
&& WizardManagerHelper.isDeviceProvisioned(context)
&& mUserCaps.mUserSwitcherEnabled) {
&& (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) {
addUser.setVisible(true);
addUser.setSelectable(true);
final boolean canAddMoreUsers =
mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY)
|| (canAddRestrictedProfile
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_RESTRICTED));
addUser.setEnabled(canAddMoreUsers && !mAddingUser && canSwitchUserNow());
addUser.setEnabled(canAddMoreUsers && !mAddingUser
&& (canSwitchUserNow() || Flags.newMultiuserSettingsUx()));
if (!canAddMoreUsers) {
addUser.setSummary(getString(R.string.user_add_max_count));
@@ -1514,6 +1553,23 @@ public class UserSettings extends SettingsPreferenceFragment
addUser.setDisabledByAdmin(
mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null);
}
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) {
addUser.setVisible(true);
addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
} else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) {
final List<UserManager.EnforcingUser> enforcingUsers =
mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
UserHandle.of(UserHandle.myUserId()));
if (!enforcingUsers.isEmpty()) {
final UserManager.EnforcingUser enforcingUser = enforcingUsers.get(0);
final int restrictionSource = enforcingUser.getUserRestrictionSource();
if (restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
addUser.setVisible(true);
addUser.setEnabled(false);
} else {
addUser.setVisible(false);
}
}
} else {
addUser.setVisible(false);
}