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

Commit 5b8c6f04 authored by Felipe Leme's avatar Felipe Leme
Browse files

Refactored some UserManagerService methods to use UserFilter

Flag: android.multiuser.user_filter_refactoring
Bug: 419086491
Test: atest FrameworksMockingServicesTests --test-filter=".*UserManagerServiceMockedTest#testGetUsers.*"

Change-Id: Id0cba5f4873740db050e0a524e1ed7efb2016f14
parent cfa0e727
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));