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

Commit 1f9e503a authored by Yunke Zhou's avatar Yunke Zhou Committed by Android (Google) Code Review
Browse files

Merge "Hide users in Settings based on configuration" into main

parents 26989b8f 12aa494b
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -10,3 +10,10 @@ flag {
        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 Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.users;

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

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

        boolean canOpenUserDetails =
                isCurrentUserAdmin() || (canSwitchUserNow() && !mUserCaps.mDisallowSwitchUser);
        boolean shouldShowOnlySelf =
                hideUserListForNonAdmins()
                        && !isCurrentUserAdmin()
                        && getPrefContext()
                                .getResources()
                                .getBoolean(
                                        com.android.internal.R.bool
                                                .config_userSwitchingMustGoThroughLoginScreen);
        for (UserInfo user : users) {
            if (user.isGuest()) {
                // Guest user is added to guest category via updateGuestCategory
                // and not to user list so skip guest here
                continue;
            }
            if (shouldShowOnlySelf && user.id != UserHandle.myUserId()) {
                continue;
            }
            UserPreference pref;
            if (user.id == UserHandle.myUserId()) {
                pref = mMePreference;
+83 −0
Original line number 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_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.REQUEST_DELETE_USER;

@@ -57,10 +58,13 @@ import android.os.Bundle;
import android.os.Looper;
import android.os.UserHandle;
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.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.text.SpannableStringBuilder;
import android.view.Menu;
@@ -163,6 +167,8 @@ public class UserSettingsTest {
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

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

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -991,6 +997,83 @@ public class UserSettingsTest {
        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
    public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() {
        UserInfo createdGuest = getGuest(false);