Loading core/java/android/content/pm/multiuser.aconfig +8 −1 Original line number Diff line number Diff line Loading @@ -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" } services/core/java/com/android/server/pm/UserManagerService.java +25 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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. Loading @@ -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(); Loading @@ -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) { Loading services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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)); Loading @@ -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)); Loading Loading
core/java/android/content/pm/multiuser.aconfig +8 −1 Original line number Diff line number Diff line Loading @@ -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" }
services/core/java/com/android/server/pm/UserManagerService.java +25 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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. Loading @@ -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(); Loading @@ -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) { Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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)); Loading @@ -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)); Loading