diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index 588f01aaa79..66c278ed733 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -370,11 +370,18 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
}
mSwitchUserPref.setOnPreferenceClickListener(this);
}
- if (mUserInfo.isMain() || mUserInfo.isGuest() || !UserManager.isMultipleAdminEnabled()
- || mUserManager.hasUserRestrictionForUser(UserManager.DISALLOW_GRANT_ADMIN,
- mUserInfo.getUserHandle()) || !mUserManager.isAdminUser()) {
- removePreference(KEY_GRANT_ADMIN);
+ if (android.multiuser.Flags.unicornModeRefactoringForHsumReadOnly()) {
+ if (isChangingAdminStatusRestricted()) {
+ removePreference(KEY_GRANT_ADMIN);
+ }
+ } else {
+ if (mUserInfo.isMain() || mUserInfo.isGuest() || !UserManager.isMultipleAdminEnabled()
+ || mUserManager.hasUserRestrictionForUser(UserManager.DISALLOW_GRANT_ADMIN,
+ mUserInfo.getUserHandle()) || !mUserManager.isAdminUser()) {
+ removePreference(KEY_GRANT_ADMIN);
+ }
}
+
if (!mUserManager.isAdminUser()) { // non admin users can't remove users and allow calls
removePreference(KEY_ENABLE_TELEPHONY);
removePreference(KEY_REMOVE_USER);
@@ -552,4 +559,33 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
// return true so there will be no setup prompt dialog shown to the user anymore.
return isSecondaryUser(mUserInfo) && !mUserInfo.isInitialized();
}
+
+ /**
+ * Determines if changing admin status is restricted.
+ *
+ *
Admin status change is restricted under the following conditions of current & target user.
+ *
+ *
+ * - The current user is NOT an admin user.
+ * - OR multiple admin support is NOT enabled.
+ * - OR the current user has DISALLOW_GRANT_ADMIN restriction applied
+ *
+ * - OR the target user ('mUserInfo') is a main user OR a guest user.
+ * - OR the target user ('mUserInfo') has DISALLOW_GRANT_ADMIN restriction.
+ *
+ *
+ * @return true if changing admin status is restricted, false otherwise
+ */
+ private boolean isChangingAdminStatusRestricted() {
+ boolean currentUserRestricted = !mUserManager.isAdminUser()
+ || !UserManager.isMultipleAdminEnabled()
+ || mUserManager.hasUserRestriction(UserManager.DISALLOW_GRANT_ADMIN);
+
+ boolean targetUserRestricted = mUserInfo.isMain()
+ || mUserInfo.isGuest()
+ || mUserManager.hasUserRestrictionForUser(UserManager.DISALLOW_GRANT_ADMIN,
+ mUserInfo.getUserHandle());
+
+ return currentUserRestricted || targetUserRestricted;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
index e035274a5de..482aa5d5b93 100644
--- a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
@@ -729,12 +729,25 @@ public class UserDetailsSettingsTest {
public void initialize_restrictUserSelected_shouldNotShowGrantAdminPref_MultipleAdminEnabled() {
setupSelectedUser();
ShadowUserManager.setIsMultipleAdminEnabled(true);
+ // target user has DISALLOW_GRANT_ADMIN restriction
mUserManager.setUserRestriction(mUserInfo.getUserHandle(),
UserManager.DISALLOW_GRANT_ADMIN, true);
mFragment.initialize(mActivity, mArguments);
verify(mFragment).removePreference(KEY_GRANT_ADMIN);
}
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_UNICORN_MODE_REFACTORING_FOR_HSUM_READ_ONLY)
+ public void initialize_currentUserRestrict_shouldNotShowGrantAdminPref_MultipleAdminEnabled() {
+ setupSelectedUser();
+ ShadowUserManager.setIsMultipleAdminEnabled(true);
+ // current user has DISALLOW_GRANT_ADMIN restriction
+ mUserManager.setUserRestriction(mContext.getUser(),
+ UserManager.DISALLOW_GRANT_ADMIN, true);
+ mFragment.initialize(mActivity, mArguments);
+ verify(mFragment).removePreference(KEY_GRANT_ADMIN);
+ }
+
@Test
public void initialize_mainUserSelected_shouldShowGrantAdminPref_MultipleAdminEnabled() {
setupSelectedMainUser();