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

Commit 4deea911 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactored some UserManagerService methods to use UserFilter" into main

parents 3768d8fe 5b8c6f04
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -469,3 +469,10 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
     name: "user_filter_refactoring"
     namespace: "multiuser"
     description: "Refactored some getUsers() methods to use a UserFilter object"
     bug: "419086491"
}
+25 −1
Original line number Diff line number Diff line
@@ -999,6 +999,9 @@ public class UserManagerService extends IUserManager.Stub {
    @GuardedBy("mUsersLock")
    private @CanBeNULL @UserIdInt int mBootUser = UserHandle.USER_NULL;

    /** Converter used on calls to {@link #getUsersInternal(UserFilter, Function)}. */
    private final Function<UserInfo, UserInfo> mNameConverter = user -> userWithName(user);

    private static UserManagerService sInstance;

    public static UserManagerService getInstance() {
@@ -1662,8 +1665,11 @@ public class UserManagerService extends IUserManager.Stub {
    List<UserInfo> getUsersWithUnresolvedNames(boolean excludePartial,
            boolean excludeDying) {
        checkCreateUsersPermission("get users with unresolved names");
        if (!android.multiuser.Flags.userFilterRefactoring()) {
            return getUsersInternal(excludePartial, excludeDying, /* resolveNullNames= */ false);
        }
        return getUsers(getFilter(excludePartial, excludeDying));
    }

    /**
     * @deprecated should use {@link #getUsers(UserFilter)} instead.
@@ -1672,6 +1678,8 @@ public class UserManagerService extends IUserManager.Stub {
    @VisibleForTesting
    List<UserInfo> getUsersInternal(boolean excludePartial, boolean excludeDying,
            boolean resolveNullNames) {
        if (!android.multiuser.Flags.userFilterRefactoring()) {
            // NOTE: not indented on purpose (to minimize git changes)
        synchronized (mUsersLock) {
            ArrayList<UserInfo> users = new ArrayList<>(mUsers.size());
            final int userSize = mUsers.size();
@@ -1689,6 +1697,22 @@ public class UserManagerService extends IUserManager.Stub {
            return users;
        }
        }
        UserFilter filter = getFilter(excludePartial, excludeDying);
        Function<UserInfo, UserInfo> converter = resolveNullNames ? mNameConverter : null;
        return getUsersInternal(filter, converter);
    }

    // TODO(b/419086491): use cached filters
    private static UserFilter getFilter(boolean excludePartial, boolean excludeDying) {
        var builder = UserFilter.builder();
        if (!excludePartial) {
            builder.withPartialUsers();
        }
        if (!excludeDying) {
            builder.withDyingUsers();
        }
        return builder.build();
    }

    /** Gets the users that match the given {@code filter}. */
    List<UserInfo> getUsers(UserFilter filter) {
+25 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES;
import static android.multiuser.Flags.FLAG_HSU_NOT_ADMIN;
import static android.multiuser.Flags.FLAG_LOGOUT_USER_API;
import static android.multiuser.Flags.FLAG_UNICORN_MODE_REFACTORING_FOR_HSUM_READ_ONLY;
import static android.multiuser.Flags.FLAG_USER_FILTER_REFACTORING;
import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
import static android.os.UserHandle.USER_NULL;
import static android.os.UserHandle.USER_SYSTEM;
@@ -1392,6 +1393,7 @@ public final class UserManagerServiceMockedTest {
    }

    @Test
    @DisableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersWithUnresolvedNames() {
        var headlessSystemUser = addUser(new UserInfo(USER_SYSTEM, A_USER_HAS_NO_NAME, FLAG_ADMIN));
        var adminUser = addUser(new UserInfo(USER_ID, A_USER_HAS_NO_NAME, FLAG_FULL | FLAG_ADMIN));
@@ -1425,6 +1427,14 @@ public final class UserManagerServiceMockedTest {
    }

    @Test
    @EnableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersWithUnresolvedNames_refactored() {
        // Should behave exactly the same ways as without the flag
        testGetUsersWithUnresolvedNames();
    }

    @Test
    @DisableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersInternal_nonHsum() {
        var fullSystemUser =
                addUser(new UserInfo(USER_SYSTEM, A_USER_HAS_NO_NAME, FLAG_FULL | FLAG_ADMIN));
@@ -1432,11 +1442,26 @@ public final class UserManagerServiceMockedTest {
    }

    @Test
    @EnableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersInternal_nonHsum_refactored() {
        // Should behave exactly the same ways as without the flag
        testGetUsersInternal_nonHsum();
    }

    @Test
    @DisableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersInternal_hsum() {
        var headlessSystemUser = addUser(new UserInfo(USER_SYSTEM, A_USER_HAS_NO_NAME, FLAG_ADMIN));
        testGetUsersInternal(headlessSystemUser);
    }

    @Test
    @EnableFlags(FLAG_USER_FILTER_REFACTORING)
    public void testGetUsersInternal_hsum_refactored() {
        // Should behave exactly the same ways as without the flag
        testGetUsersInternal_hsum();
    }

    private void testGetUsersInternal(UserInfo systemUser) {
        var adminUser = addUser(new UserInfo(USER_ID, A_USER_HAS_NO_NAME, FLAG_FULL | FLAG_ADMIN));
        var nonAdminUser = addUser(new UserInfo(USER_ID2, A_USER_HAS_NO_NAME, FLAG_FULL));