Add UI for multiple admins on Headless

In a series of CLs under topic add_ui_for_hsum_admins UI and functionality for allowing multiple admins on HSUM build is added. In User settings and User switcher when creating a new user there is a new dialog prompting to choose admin status of the user to be created. In User details view there is a toggle that is visible to admin users that allows to modify admin status of existing users. This toggle is only applicable to full users that are not supervised, guests or a main device user.

Bug: 252790451
Test: croot && make RunSettingsRoboTests -j40 ROBOTEST_FILTER="com.android.settings.users.UserDetailsSettingsTest"
Change-Id: I447dc168be30aa614aeb3f8b71ad14a7223fd7c1
This commit is contained in:
Tetiana Meronyk
2022-11-24 16:04:16 +00:00
parent ecbb3a2933
commit e5acef9034
7 changed files with 170 additions and 11 deletions

View File

@@ -61,6 +61,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
private static final String KEY_SWITCH_USER = "switch_user";
private static final String KEY_ENABLE_TELEPHONY = "enable_calling";
private static final String KEY_REMOVE_USER = "remove_user";
private static final String KEY_GRANT_ADMIN = "user_grant_admin";
private static final String KEY_APP_AND_CONTENT_ACCESS = "app_and_content_access";
private static final String KEY_APP_COPYING = "app_copying";
@@ -72,6 +73,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
private static final int DIALOG_SETUP_USER = 3;
private static final int DIALOG_CONFIRM_RESET_GUEST = 4;
private static final int DIALOG_CONFIRM_RESET_GUEST_AND_SWITCH_USER = 5;
private static final int DIALOG_CONFIRM_REVOKE_ADMIN = 6;
/** Whether to enable the app_copying fragment. */
private static final boolean SHOW_APP_COPYING_PREF = false;
@@ -91,6 +93,8 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
Preference mAppCopyingPref;
@VisibleForTesting
Preference mRemoveUserPref;
@VisibleForTesting
SwitchPreference mGrantAdminPref;
@VisibleForTesting
/** The user being studied (not the user doing the studying). */
@@ -179,6 +183,12 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mMetricsFeatureProvider.action(getActivity(),
SettingsEnums.ACTION_DISABLE_USER_CALL);
enableCallsAndSms(false);
} else if (preference == mGrantAdminPref) {
if (Boolean.FALSE.equals(newValue)) {
showDialog(DIALOG_CONFIRM_REVOKE_ADMIN);
return false;
}
updateUserAdminStatus(true);
}
return true;
}
@@ -192,6 +202,8 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
return SettingsEnums.DIALOG_USER_REMOVE;
case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
return SettingsEnums.DIALOG_USER_ENABLE_CALLING_AND_SMS;
case DIALOG_CONFIRM_REVOKE_ADMIN:
return SettingsEnums.DIALOG_REVOKE_USER_ADMIN;
case DIALOG_SETUP_USER:
return SettingsEnums.DIALOG_USER_SETUP;
default:
@@ -235,6 +247,9 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
return UserDialogs.createRemoveGuestDialog(getActivity(),
(dialog, which) -> switchUser());
}
case DIALOG_CONFIRM_REVOKE_ADMIN:
return UserDialogs.createConfirmRevokeAdmin(getActivity(),
(dialog, which) -> updateUserAdminStatus(false));
}
throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
}
@@ -277,6 +292,9 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mRemoveUserPref = findPreference(KEY_REMOVE_USER);
mAppAndContentAccessPref = findPreference(KEY_APP_AND_CONTENT_ACCESS);
mAppCopyingPref = findPreference(KEY_APP_COPYING);
mGrantAdminPref = findPreference(KEY_GRANT_ADMIN);
mGrantAdminPref.setChecked(mUserInfo.isAdmin());
mSwitchUserPref.setTitle(
context.getString(com.android.settingslib.R.string.user_switch_to_user,
@@ -289,10 +307,15 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mSwitchUserPref.setSelectable(true);
mSwitchUserPref.setOnPreferenceClickListener(this);
}
//TODO(b/261700461): remove preference for supervised user
//TODO(b/262371063): check whether multiple admins allowed, not for HSUM
if (mUserInfo.isMain() || mUserInfo.isGuest() || !UserManager.isHeadlessSystemUserMode()) {
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);
removePreference(KEY_GRANT_ADMIN);
removePreference(KEY_APP_AND_CONTENT_ACCESS);
removePreference(KEY_APP_COPYING);
} else {
@@ -339,6 +362,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mRemoveUserPref.setOnPreferenceClickListener(this);
mPhonePref.setOnPreferenceChangeListener(this);
mGrantAdminPref.setOnPreferenceChangeListener(this);
mAppAndContentAccessPref.setOnPreferenceClickListener(this);
mAppCopyingPref.setOnPreferenceClickListener(this);
}
@@ -401,6 +425,20 @@ public class UserDetailsSettings extends SettingsPreferenceFragment
mUserManager.setUserRestriction(UserManager.DISALLOW_SMS, !enabled, userHandle);
}
/**
* Sets admin status of selected user. Method is called when toggle in
* user details settings is switched.
* @param isSetAdmin indicates if user admin status needs to be set to true.
*/
private void updateUserAdminStatus(boolean isSetAdmin) {
mGrantAdminPref.setChecked(isSetAdmin);
if (!isSetAdmin) {
mUserManager.revokeUserAdmin(mUserInfo.id);
} else if ((mUserInfo.flags & UserInfo.FLAG_ADMIN) == 0) {
mUserManager.setUserAdmin(mUserInfo.id);
}
}
private void removeUser() {
mUserManager.removeUser(mUserInfo.id);
finishFragment();