Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12aa494b authored by Yunke Zhou's avatar Yunke Zhou
Browse files

Hide users in Settings based on configuration

Bug: 404820559
Test: create user and check the user settings in Ika
Flag: EXEMPT Desktop-only change

Change-Id: I108fd3435671710ca3dc75dda9533cfe74de6c99
parent 7222dd32
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -10,3 +10,10 @@ flag {
        purpose: PURPOSE_BUGFIX
        purpose: PURPOSE_BUGFIX
    }
    }
}
}

flag {
    name: "hide_user_list_for_non_admins"
    namespace: "desktop_users_and_accounts"
    description: "Controls whether to hide the user list in Settings for non-admins."
    bug: "406686772"
}
 No newline at end of file
+12 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.settings.users;
package com.android.settings.users;


import static com.android.settings.flags.Flags.hideUserListForNonAdmins;
import static com.android.settingslib.Utils.getColorAttrDefaultColor;
import static com.android.settingslib.Utils.getColorAttrDefaultColor;


import android.Manifest;
import android.Manifest;
@@ -1308,12 +1309,23 @@ public class UserSettings extends SettingsPreferenceFragment


        boolean canOpenUserDetails =
        boolean canOpenUserDetails =
                isCurrentUserAdmin() || (canSwitchUserNow() && !mUserCaps.mDisallowSwitchUser);
                isCurrentUserAdmin() || (canSwitchUserNow() && !mUserCaps.mDisallowSwitchUser);
        boolean shouldShowOnlySelf =
                hideUserListForNonAdmins()
                        && !isCurrentUserAdmin()
                        && getPrefContext()
                                .getResources()
                                .getBoolean(
                                        com.android.internal.R.bool
                                                .config_userSwitchingMustGoThroughLoginScreen);
        for (UserInfo user : users) {
        for (UserInfo user : users) {
            if (user.isGuest()) {
            if (user.isGuest()) {
                // Guest user is added to guest category via updateGuestCategory
                // Guest user is added to guest category via updateGuestCategory
                // and not to user list so skip guest here
                // and not to user list so skip guest here
                continue;
                continue;
            }
            }
            if (shouldShowOnlySelf && user.id != UserHandle.myUserId()) {
                continue;
            }
            UserPreference pref;
            UserPreference pref;
            if (user.id == UserHandle.myUserId()) {
            if (user.id == UserHandle.myUserId()) {
                pref = mMePreference;
                pref = mMePreference;
+83 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL;
import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL;
import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED;
import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED;


import static com.android.settings.flags.Flags.FLAG_HIDE_USER_LIST_FOR_NON_ADMINS;
import static com.android.settings.users.UserSettings.DIALOG_CONFIRM_REMOVE;
import static com.android.settings.users.UserSettings.DIALOG_CONFIRM_REMOVE;
import static com.android.settings.users.UserSettings.REQUEST_DELETE_USER;
import static com.android.settings.users.UserSettings.REQUEST_DELETE_USER;


@@ -57,10 +58,13 @@ import android.os.Bundle;
import android.os.Looper;
import android.os.Looper;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.provider.Settings;
import android.text.SpannableStringBuilder;
import android.text.SpannableStringBuilder;
import android.view.Menu;
import android.view.Menu;
@@ -163,6 +167,8 @@ public class UserSettingsTest {
    @Rule
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();


    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    @Before
    @Before
    public void setUp() {
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
@@ -989,6 +995,83 @@ public class UserSettingsTest {
        verify(mUserManager, times(2)).getAliveUsers();
        verify(mUserManager, times(2)).getAliveUsers();
    }
    }


    @Test
    @EnableFlags(FLAG_HIDE_USER_LIST_FOR_NON_ADMINS)
    public void
            updateUserList_nonAdminUsersWithSwitchingDisabledAndFeatureEnabled_userListIsHidden() {
        SettingsShadowResources.overrideResource(
                com.android.internal.R.bool.config_userSwitchingMustGoThroughLoginScreen,
                Boolean.TRUE);
        mUserCapabilities.mIsAdmin = false;
        givenUsers(getAdminUser(false), getSecondaryUser(true));

        mFragment.updateUserList();

        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
        verify(mFragment.mUserListCategory, times(1)).addPreference(captor.capture());

        UserPreference secondaryPref = captor.getAllValues().get(0);
        assertThat(secondaryPref).isSameInstanceAs(mMePreference);
    }

    @Test
    @EnableFlags(FLAG_HIDE_USER_LIST_FOR_NON_ADMINS)
    public void updateUserList_adminUsersWithSwitchingDisabledAndFeatureEnabled_userListIsShown() {
        SettingsShadowResources.overrideResource(
                com.android.internal.R.bool.config_userSwitchingMustGoThroughLoginScreen,
                Boolean.TRUE);
        mUserCapabilities.mIsAdmin = true;
        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
    @DisableFlags(FLAG_HIDE_USER_LIST_FOR_NON_ADMINS)
    public void
            updateUserList_nonAdminUsersWithSwitchingDisabledAndFeatureDisabled_userListIsShown() {
        SettingsShadowResources.overrideResource(
                com.android.internal.R.bool.config_userSwitchingMustGoThroughLoginScreen,
                Boolean.TRUE);
        mUserCapabilities.mIsAdmin = false;
        givenUsers(getAdminUser(false), getSecondaryUser(true));

        mFragment.updateUserList();

        ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
        verify(mFragment.mUserListCategory, times(2)).addPreference(captor.capture());

        List<UserPreference> userPrefs = captor.getAllValues();
        UserPreference secondaryPref = userPrefs.get(0);
        UserPreference adminPref = userPrefs.get(1);

        assertThat(secondaryPref).isSameInstanceAs(mMePreference);
        assertThat(adminPref.getUserId()).isEqualTo(INACTIVE_ADMIN_USER_ID);
        assertThat(adminPref.getTitle()).isEqualTo(ADMIN_USER_NAME);
        assertThat(adminPref.getIcon()).isNotNull();
        assertThat(adminPref.getKey()).isEqualTo("id=" + INACTIVE_ADMIN_USER_ID);
        assertThat(adminPref.isEnabled()).isEqualTo(true);
        assertThat(adminPref.isSelectable()).isEqualTo(true);
        assertThat(adminPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
    }

    @Test
    @Test
    public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() {
    public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() {
        UserInfo createdGuest = getGuest(false);
        UserInfo createdGuest = getGuest(false);