From 0f311e11959650c8490b85b185cbd955db399c32 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Tue, 18 Jun 2024 18:10:25 +0000 Subject: [PATCH] Add handling of admin enforced restrictions in Users Settings Before, when the restrictions were applied, the preferences that were restricted were hidden. After this change, if admin applies a restriction, the preference is displayed as disabled and Policy Transparency Dialog is displayed Bug: 338226475 Test: atest UserSettingsTest && atest UserDetailsSettingsTest Flag: android.multiuser.new_multiuser_settings_ux Change-Id: I1b5aeeeec7accde278ff3e46ea3d64c91d8400db --- ...AddUserWhenLockedPreferenceController.java | 15 ++++---- .../GuestTelephonyPreferenceController.java | 13 +++++-- .../users/MultiUserSwitchBarController.java | 5 --- ...RemoveGuestOnExitPreferenceController.java | 33 ++++++++++++----- .../android/settings/users/UserSettings.java | 32 +++++++++------- .../settings/users/UserSettingsTest.java | 37 +++++++++++++++++++ 6 files changed, 95 insertions(+), 40 deletions(-) diff --git a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java index 4830fd700f7..861e69d08e8 100644 --- a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java +++ b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java @@ -42,11 +42,14 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr if (!isAvailable()) { restrictedSwitchPreference.setVisible(false); } else { - restrictedSwitchPreference.setDisabledByAdmin( - mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null); if (android.multiuser.Flags.newMultiuserSettingsUx()) { + if (mUserCaps.mDisallowAddUserSetByAdmin) { + restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); + } restrictedSwitchPreference.setVisible(true); } else { + restrictedSwitchPreference.setDisabledByAdmin( + mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null); restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled); } } @@ -56,14 +59,12 @@ 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 { - if (android.multiuser.Flags.newMultiuserSettingsUx()) { - return AVAILABLE; - } else { - return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; - } + return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } } diff --git a/src/com/android/settings/users/GuestTelephonyPreferenceController.java b/src/com/android/settings/users/GuestTelephonyPreferenceController.java index 64563df548d..7cd8287547c 100644 --- a/src/com/android/settings/users/GuestTelephonyPreferenceController.java +++ b/src/com/android/settings/users/GuestTelephonyPreferenceController.java @@ -43,12 +43,17 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll @Override public int getAvailabilityStatus() { - if (!mUserCaps.isAdmin() || !mUserCaps.mCanAddGuest) { - return DISABLED_FOR_USER; - } else if (android.multiuser.Flags.newMultiuserSettingsUx()) { + 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; + } } } diff --git a/src/com/android/settings/users/MultiUserSwitchBarController.java b/src/com/android/settings/users/MultiUserSwitchBarController.java index f57b7959c37..641ae51c9e3 100644 --- a/src/com/android/settings/users/MultiUserSwitchBarController.java +++ b/src/com/android/settings/users/MultiUserSwitchBarController.java @@ -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); } diff --git a/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java b/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java index 94fad9782b3..263a51b8ae0 100644 --- a/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java +++ b/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java @@ -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,11 +73,15 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl if (!isAvailable()) { restrictedSwitchPreference.setVisible(false); } else { - restrictedSwitchPreference.setDisabledByAdmin( - mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null); if (android.multiuser.Flags.newMultiuserSettingsUx()) { + final RestrictedLockUtils.EnforcedAdmin disallowRemoveUserAdmin = + RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext, + UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId()); + restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin); restrictedSwitchPreference.setVisible(true); } else { + restrictedSwitchPreference.setDisabledByAdmin( + mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null); restrictedSwitchPreference.setVisible(mUserCaps.mUserSwitcherEnabled); } } @@ -86,15 +93,21 @@ 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; - } else { - if (android.multiuser.Flags.newMultiuserSettingsUx()) { + if (android.multiuser.Flags.newMultiuserSettingsUx()) { + if (mUserManager.isGuestUserAlwaysEphemeral() + || !UserManager.isGuestUserAllowEphemeralStateChange() + || !mUserCaps.isAdmin()) { + return DISABLED_FOR_USER; + } else { return AVAILABLE; + } + } else { + if (mUserManager.isGuestUserAlwaysEphemeral() + || !UserManager.isGuestUserAllowEphemeralStateChange() + || !mUserCaps.isAdmin() + || mUserCaps.disallowAddUser() + || mUserCaps.disallowAddUserSetByAdmin()) { + return DISABLED_FOR_USER; } else { return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 6fe79da8f08..39d9139cb2e 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -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,7 +1199,7 @@ public class UserSettings extends SettingsPreferenceFragment } List users; - if (android.multiuser.Flags.newMultiuserSettingsUx()) { + 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() @@ -1265,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); @@ -1425,13 +1429,13 @@ 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 (android.multiuser.Flags.newMultiuserSettingsUx()) { + if (Flags.newMultiuserSettingsUx()) { mGuestUserCategory.addPreference(pref); // guest user preference is shown hence also make guest category visible mGuestUserCategory.setVisible(true); @@ -1464,11 +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.mDisallowAddUserSetByAdmin)) && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST) && WizardManagerHelper.isDeviceProvisioned(context) - && (mUserCaps.mUserSwitcherEnabled - || android.multiuser.Flags.newMultiuserSettingsUx())) { + && (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) { Drawable icon = context.getDrawable( com.android.settingslib.R.drawable.ic_account_circle); mAddGuest.setIcon(centerAndTint(icon)); @@ -1481,11 +1485,11 @@ public class UserSettings extends SettingsPreferenceFragment mAddGuest.setEnabled(false); } else { mAddGuest.setTitle(com.android.settingslib.R.string.guest_new_guest); - if (android.multiuser.Flags.newMultiuserSettingsUx() + if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) { mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); } else { - mAddGuest.setEnabled(canSwitchUserNow()); + mAddGuest.setEnabled(canSwitchUserNow() || Flags.newMultiuserSettingsUx()); } } } else { @@ -1516,15 +1520,15 @@ public class UserSettings extends SettingsPreferenceFragment boolean canAddRestrictedProfile) { if ((mUserCaps.mCanAddUser && !mUserCaps.mDisallowAddUserSetByAdmin) && WizardManagerHelper.isDeviceProvisioned(context) - && (mUserCaps.mUserSwitcherEnabled - || android.multiuser.Flags.newMultiuserSettingsUx())) { + && (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)); @@ -1535,7 +1539,7 @@ public class UserSettings extends SettingsPreferenceFragment addUser.setDisabledByAdmin( mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null); } - } else if (android.multiuser.Flags.newMultiuserSettingsUx() + } else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) { addUser.setVisible(true); addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java index f35b64ecf04..5bb84e12504 100644 --- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java +++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java @@ -368,6 +368,7 @@ public class UserSettingsTest { } @Test + @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) public void updateUserList_cannotSwitchUser_shouldDisableAddUser() { mUserCapabilities.mCanAddUser = true; doReturn(true).when(mUserManager).canAddMoreUsers(anyString()); @@ -383,6 +384,20 @@ public class UserSettingsTest { verify(mAddUserPreference).setSelectable(true); } + @Test + @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) + public void updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest() { + mUserCapabilities.mDisallowAddUserSetByAdmin = true; + doReturn(true).when(mUserManager).canAddMoreUsers(anyString()); + doReturn(SWITCHABILITY_STATUS_OK) + .when(mUserManager).getUserSwitchability(); + + mFragment.updateUserList(); + + verify(mAddUserPreference).setVisible(true); + verify(mAddUserPreference).setDisabledByAdmin(any()); + } + @Test public void updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary() { mUserCapabilities.mCanAddUser = true; @@ -401,6 +416,7 @@ public class UserSettingsTest { } @Test + @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) public void updateUserList_cannotSwitchUser_shouldDisableAddGuest() { mUserCapabilities.mCanAddGuest = true; doReturn(true) @@ -414,6 +430,26 @@ public class UserSettingsTest { verify(mAddGuestPreference).setSelectable(true); } + @Test + @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) + public void updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled() { + givenUsers(getAdminUser(true)); + mUserCapabilities.mCanAddGuest = true; + mUserCapabilities.mCanAddUser = true; + mUserCapabilities.mDisallowSwitchUser = true; + doReturn(true) + .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST)); + doReturn(true) + .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY)); + + mFragment.updateUserList(); + + verify(mAddGuestPreference).setVisible(true); + verify(mAddGuestPreference).setEnabled(true); + verify(mAddUserPreference).setVisible(true); + verify(mAddUserPreference).setEnabled(true); + } + @Test @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) public void updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser() { @@ -670,6 +706,7 @@ public class UserSettingsTest { } @Test + @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) public void updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref() { UserInfo uninitializedUser = getSecondaryUser(false); removeFlag(uninitializedUser, UserInfo.FLAG_INITIALIZED);