From 25e1b4d88b6f7cc7b37d46e3b1f7054418f5ff7f Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Mon, 24 Jun 2024 12:35:14 +0000 Subject: [PATCH] Show disabled add actions in COPE mode Before this change these actions were hidden. After this change, they are displayed but disabled which makes it more intuitive. Bug: 336762423 Test: atest UserSettingsTest && atest UserDetailsSettingsTest Flag: android.multiuser.new_multiuser_settings_ux Change-Id: Ie07816b7d3817d12e78e1ec2692fcddea9328933 --- ...AddUserWhenLockedPreferenceController.java | 4 +- .../GuestTelephonyPreferenceController.java | 37 +++++++++++++++++-- ...RemoveGuestOnExitPreferenceController.java | 11 +++++- .../android/settings/users/UserSettings.java | 35 ++++++++++++++++-- .../settings/users/UserSettingsTest.java | 28 ++++++++++++++ 5 files changed, 105 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java index 861e69d08e8..fe90a2a25b8 100644 --- a/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java +++ b/src/com/android/settings/users/AddUserWhenLockedPreferenceController.java @@ -43,10 +43,12 @@ public class AddUserWhenLockedPreferenceController extends TogglePreferenceContr restrictedSwitchPreference.setVisible(false); } else { if (android.multiuser.Flags.newMultiuserSettingsUx()) { + restrictedSwitchPreference.setVisible(true); if (mUserCaps.mDisallowAddUserSetByAdmin) { restrictedSwitchPreference.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); + } else if (mUserCaps.mDisallowAddUser) { + restrictedSwitchPreference.setVisible(false); } - restrictedSwitchPreference.setVisible(true); } else { restrictedSwitchPreference.setDisabledByAdmin( mUserCaps.disallowAddUser() ? mUserCaps.getEnforcedAdmin() : null); diff --git a/src/com/android/settings/users/GuestTelephonyPreferenceController.java b/src/com/android/settings/users/GuestTelephonyPreferenceController.java index 7cd8287547c..e730cbf075f 100644 --- a/src/com/android/settings/users/GuestTelephonyPreferenceController.java +++ b/src/com/android/settings/users/GuestTelephonyPreferenceController.java @@ -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,6 +47,10 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll @Override public int getAvailabilityStatus() { + 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; @@ -81,8 +89,31 @@ public class GuestTelephonyPreferenceController extends TogglePreferenceControll public void updateState(Preference preference) { super.updateState(preference); mUserCaps.updateAddUserCapabilities(mContext); - preference.setVisible(isAvailable() - && 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()); + } + } } } diff --git a/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java b/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java index 263a51b8ae0..345b5068788 100644 --- a/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java +++ b/src/com/android/settings/users/RemoveGuestOnExitPreferenceController.java @@ -74,11 +74,18 @@ public class RemoveGuestOnExitPreferenceController extends BasePreferenceControl 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()); - restrictedSwitchPreference.setDisabledByAdmin(disallowRemoveUserAdmin); - restrictedSwitchPreference.setVisible(true); + 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); diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 39d9139cb2e..0cf01e311e1 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -1469,7 +1469,7 @@ public class UserSettings extends SettingsPreferenceFragment private boolean updateAddGuestPreference(Context context, boolean isGuestAlreadyCreated) { boolean isVisible = false; if (!isGuestAlreadyCreated && (mUserCaps.mCanAddGuest - || (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin)) + || (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser)) && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST) && WizardManagerHelper.isDeviceProvisioned(context) && (mUserCaps.mUserSwitcherEnabled || Flags.newMultiuserSettingsUx())) { @@ -1488,6 +1488,19 @@ public class UserSettings extends SettingsPreferenceFragment if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) { mAddGuest.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); + } else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) { + final List 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()); } @@ -1518,7 +1531,8 @@ 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 || Flags.newMultiuserSettingsUx())) { addUser.setVisible(true); @@ -1539,10 +1553,23 @@ public class UserSettings extends SettingsPreferenceFragment addUser.setDisabledByAdmin( mUserCaps.mDisallowAddUser ? mUserCaps.mEnforcedAdmin : null); } - } else if (Flags.newMultiuserSettingsUx() - && mUserCaps.mDisallowAddUserSetByAdmin) { + } else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUserSetByAdmin) { addUser.setVisible(true); addUser.setDisabledByAdmin(mUserCaps.mEnforcedAdmin); + } else if (Flags.newMultiuserSettingsUx() && mUserCaps.mDisallowAddUser) { + final List 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); } diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java index 5bb84e12504..85db0bd88b9 100644 --- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java +++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.app.settings.SettingsEnums; @@ -450,6 +451,33 @@ public class UserSettingsTest { verify(mAddUserPreference).setEnabled(true); } + @Test + @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) + public void updateUserList_disallowAddUser_shouldShowButDisableAddActions() { + givenUsers(getAdminUser(true)); + mUserCapabilities.mCanAddGuest = true; + mUserCapabilities.mCanAddUser = false; + mUserCapabilities.mDisallowAddUser = true; + mUserCapabilities.mDisallowAddUserSetByAdmin = false; + List enforcingUsers = new ArrayList<>(); + enforcingUsers.add(new UserManager.EnforcingUser(UserHandle.myUserId(), + UserManager.RESTRICTION_SOURCE_SYSTEM)); + when(mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER, + UserHandle.of(UserHandle.myUserId()))).thenReturn(enforcingUsers); + + 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(false); + verify(mAddUserPreference).setVisible(true); + verify(mAddUserPreference).setEnabled(false); + } + @Test @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX}) public void updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser() {