Enable Name and Avatar change without turning on multi-user

Primary user will be displayed in user list even when the
multi-user settings is disabled.
This will allow users to change the name and avatar of
primary user without enabling the multi-user feature.

Test: croot && make RunSettingsRoboTests -j40
ROBOTEST_FILTER="com.android.settings.users.UserSettingsTest"

Bug: 246732754
Change-Id: I4eb5aaf97630135960410bea7cdddc52b5848a1e
This commit is contained in:
Nikhil Kumar
2022-09-20 14:00:38 +01:00
parent 535667b5eb
commit 0661a7640f
2 changed files with 59 additions and 12 deletions

View File

@@ -1196,11 +1196,19 @@ public class UserSettings extends SettingsPreferenceFragment
if (context == null) { if (context == null) {
return; return;
} }
final List<UserInfo> users = mUserManager.getAliveUsers()
// Only users that can be switched to should show up here. List<UserInfo> users;
// e.g. Managed profiles appear under Accounts Settings instead if (mUserCaps.mUserSwitcherEnabled) {
.stream().filter(UserInfo::supportsSwitchToByUser) // Only users that can be switched to should show up here.
.collect(Collectors.toList()); // 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<>(); final ArrayList<Integer> missingIcons = new ArrayList<>();
final ArrayList<UserPreference> userPreferences = new ArrayList<>(); final ArrayList<UserPreference> userPreferences = new ArrayList<>();
@@ -1276,7 +1284,6 @@ public class UserSettings extends SettingsPreferenceFragment
userPreferences.add(pref); userPreferences.add(pref);
} }
// Sort list of users by serialNum // Sort list of users by serialNum
Collections.sort(userPreferences, UserPreference.SERIAL_NUMBER_COMPARATOR); Collections.sort(userPreferences, UserPreference.SERIAL_NUMBER_COMPARATOR);
@@ -1299,7 +1306,6 @@ public class UserSettings extends SettingsPreferenceFragment
// Remove everything from mUserListCategory and add new users. // Remove everything from mUserListCategory and add new users.
mUserListCategory.removeAll(); mUserListCategory.removeAll();
// If multi-user is disabled, just show top info and return.
final Preference addUserOnLockScreen = getPreferenceScreen().findPreference( final Preference addUserOnLockScreen = getPreferenceScreen().findPreference(
mAddUserWhenLockedPreferenceController.getPreferenceKey()); mAddUserWhenLockedPreferenceController.getPreferenceKey());
mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen); mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen);
@@ -1311,16 +1317,11 @@ public class UserSettings extends SettingsPreferenceFragment
final Preference multiUserTopIntroPreference = getPreferenceScreen().findPreference( final Preference multiUserTopIntroPreference = getPreferenceScreen().findPreference(
mMultiUserTopIntroPreferenceController.getPreferenceKey()); mMultiUserTopIntroPreferenceController.getPreferenceKey());
mMultiUserTopIntroPreferenceController.updateState(multiUserTopIntroPreference); mMultiUserTopIntroPreferenceController.updateState(multiUserTopIntroPreference);
mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled);
updateGuestPreferences(); updateGuestPreferences();
updateGuestCategory(context, users); updateGuestCategory(context, users);
updateAddUser(context); updateAddUser(context);
updateAddSupervisedUser(context); updateAddSupervisedUser(context);
if (!mUserCaps.mUserSwitcherEnabled) {
return;
}
for (UserPreference userPreference : userPreferences) { for (UserPreference userPreference : userPreferences) {
userPreference.setOrder(Preference.DEFAULT_ORDER); userPreference.setOrder(Preference.DEFAULT_ORDER);
mUserListCategory.addPreference(userPreference); mUserListCategory.addPreference(userPreference);

View File

@@ -177,6 +177,7 @@ public class UserSettingsTest {
doReturn(prefs).when(mMockPreferenceManager).getSharedPreferences(); doReturn(prefs).when(mMockPreferenceManager).getSharedPreferences();
doReturn(mContext).when(mMockPreferenceManager).getContext(); doReturn(mContext).when(mMockPreferenceManager).getContext();
doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
doReturn(ACTIVE_USER_ID).when(mContext).getUserId();
mFragment.mMePreference = mMePreference; mFragment.mMePreference = mMePreference;
mFragment.mAddUser = mAddUserPreference; mFragment.mAddUser = mAddUserPreference;
@@ -443,6 +444,7 @@ public class UserSettingsTest {
@Test @Test
public void updateUserList_userSwitcherDisabled_shouldNotShowAddUser() { public void updateUserList_userSwitcherDisabled_shouldNotShowAddUser() {
givenUsers(getAdminUser(true));
mUserCapabilities.mCanAddUser = true; mUserCapabilities.mCanAddUser = true;
mUserCapabilities.mUserSwitcherEnabled = false; mUserCapabilities.mUserSwitcherEnabled = false;
@@ -453,6 +455,7 @@ public class UserSettingsTest {
@Test @Test
public void updateUserList_userSwitcherDisabled_shouldNotShowAddGuest() { public void updateUserList_userSwitcherDisabled_shouldNotShowAddGuest() {
givenUsers(getAdminUser(true));
mUserCapabilities.mCanAddGuest = true; mUserCapabilities.mCanAddGuest = true;
mUserCapabilities.mUserSwitcherEnabled = false; mUserCapabilities.mUserSwitcherEnabled = false;
@@ -511,6 +514,47 @@ public class UserSettingsTest {
assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment); assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
} }
@Test
public void updateUserList_existingSecondaryUser_shouldAddOnlyCurrUser_MultiUserIsDisabled() {
givenUsers(getAdminUser(true), getSecondaryUser(false));
mUserCapabilities.mUserSwitcherEnabled = false;
mFragment.updateUserList();
ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
verify(mFragment.mUserListCategory, times(1))
.addPreference(captor.capture());
List<UserPreference> userPrefs = captor.getAllValues();
assertThat(userPrefs.size()).isEqualTo(1);
assertThat(userPrefs.get(0)).isSameInstanceAs(mMePreference);
}
@Test
public void updateUserList_existingSecondaryUser_shouldAddSecondaryUser_MultiUserIsEnabled() {
givenUsers(getAdminUser(true), getSecondaryUser(false));
mFragment.updateUserList();
ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
verify(mFragment.mUserListCategory, times(2))
.addPreference(captor.capture());
List<UserPreference> userPrefs = captor.getAllValues();
UserPreference adminPref = userPrefs.get(0);
UserPreference secondaryPref = userPrefs.get(1);
assertThat(userPrefs.size()).isEqualTo(2);
assertThat(adminPref).isSameInstanceAs(mMePreference);
assertThat(secondaryPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
assertThat(secondaryPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
assertThat(secondaryPref.getIcon()).isNotNull();
assertThat(secondaryPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
assertThat(secondaryPref.isEnabled()).isEqualTo(true);
assertThat(secondaryPref.isSelectable()).isEqualTo(true);
assertThat(secondaryPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
}
@Test @Test
public void updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference() { public void updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference() {
givenUsers(getAdminUser(true), getRestrictedUser(false)); givenUsers(getAdminUser(true), getRestrictedUser(false));
@@ -800,6 +844,8 @@ public class UserSettingsTest {
List<UserInfo> users = Arrays.asList(userInfo); List<UserInfo> users = Arrays.asList(userInfo);
doReturn(users).when(mUserManager).getUsers(); doReturn(users).when(mUserManager).getUsers();
doReturn(users).when(mUserManager).getAliveUsers(); doReturn(users).when(mUserManager).getAliveUsers();
users.forEach(user ->
doReturn(user).when(mUserManager).getUserInfo(user.id));
} }
private static void removeFlag(UserInfo userInfo, int flag) { private static void removeFlag(UserInfo userInfo, int flag) {