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

Commit 4c87f19f authored by Felipe Leme's avatar Felipe Leme
Browse files

Changed UMS so it resolve null names for all users on HSUM.

Prior to this change, it would only resolve it for system, main,
and guest users, which would be confusing for HSUM devices that
don't set the initial user as the main user.

Fixes: 432508642
Test: atest FrameworksMockingServicesTests:UserManagerServiceMockedTest
Test: adb shell dumpsys user |grep 'Unnamed user name'
Flag: android.multiuser.create_initial_user

Change-Id: I62a63051bc8fb6bd03a4d20acba0afff38433089
parent 1e1cafe7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5093,6 +5093,8 @@
    <!-- Default name of the headless system user, on HSUM devices. This users hosts the system, but
    is not a human user. [CHAR LIMIT=35] -->
    <string name="headless_system_user_name">System User</string>
    <!-- Used when the name of a user is not explicitly set [CHAR LIMIT=35] -->
    <string name="unnamed_user_name">User</string>
    <!-- Error message title [CHAR LIMIT=35] -->
    <string name="error_message_title">Error</string>
    <!-- Message informing user that the change was disallowed by an administrator. [CHAR LIMIT=none] -->
+1 −0
Original line number Diff line number Diff line
@@ -1126,6 +1126,7 @@
  <java-symbol type="string" name="owner_name" />
  <java-symbol type="string" name="guest_name" />
  <java-symbol type="string" name="headless_system_user_name" />
  <java-symbol type="string" name="unnamed_user_name" />
  <java-symbol type="string" name="config_chooseAccountActivity" />
  <java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
  <java-symbol type="string" name="config_chooserActivity" />
+7 −1
Original line number Diff line number Diff line
@@ -2537,7 +2537,7 @@ public class UserManagerService extends IUserManager.Stub {
        if (user.isGuest()) {
            return getGuestName();
        }
        return null;
        return getUnnamedUserName();
    }

    /** Returns whether the given user type is one of the FULL user types. */
@@ -5410,6 +5410,11 @@ public class UserManagerService extends IUserManager.Stub {
        return mContext.getString(com.android.internal.R.string.guest_name);
    }

    @VisibleForTesting
    String getUnnamedUserName() {
        return mContext.getString(com.android.internal.R.string.unnamed_user_name);
    }

    String getHeadlessSystemUserName() {
        return mContext.getString(com.android.internal.R.string.headless_system_user_name);
    }
@@ -8045,6 +8050,7 @@ public class UserManagerService extends IUserManager.Stub {
        pw.println("  User version: " + mUserVersion);
        pw.println("  Owner name: " + getOwnerName());
        pw.println("  Guest name: " + getGuestName());
        pw.println("  Unnamed user name: " + getUnnamedUserName());
        if (DBG_ALLOCATION) {
            pw.println("  System user allocations: " + mUser0Allocations.get());
        }
+50 −15
Original line number Diff line number Diff line
@@ -120,8 +120,11 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Run as {@code atest
@@ -1166,8 +1169,9 @@ public final class UserManagerServiceMockedTest {
        UserInfo normalUserWithName = mUms.userWithName(normalUser);
        assertWithMessage("userWithName(normalUser)").that(normalUserWithName).isNotNull();
        expect.withMessage("userWithName(normalUser)").that(normalUserWithName)
                .isSameInstanceAs(normalUser);
        expect.withMessage("normalUserWithName.name").that(normalUserWithName.name).isNull();
                .isNotSameInstanceAs(normalUser);
        expect.withMessage("normalUserWithName.name").that(normalUserWithName.name)
                .isEqualTo(mUms.getUnnamedUserName());
        expect.withMessage("normalUser.name").that(normalUser.name).isNull();
        expect.withMessage("number of system user allocations after non-systemUser call")
                .that(getCurrentNumberOfUser0Allocations()).isEqualTo(expectedAllocations);
@@ -1229,7 +1233,8 @@ public final class UserManagerServiceMockedTest {
                .isEqualTo(mUms.getGuestName());

        var normalUser = new UserInfo(42, /* name= */ null, /* flags= */ 0);
        expect.withMessage("name of normal user").that(mUms.getName(normalUser)).isNull();
        expect.withMessage("name of normal user").that(mUms.getName(normalUser))
                .isEqualTo(mUms.getUnnamedUserName());
    }

    @Test
@@ -1250,7 +1255,8 @@ public final class UserManagerServiceMockedTest {
                .isEqualTo(mUms.getGuestName());

        var normalUser = new UserInfo(42, /* name= */ null, /* flags= */ 0);
        expect.withMessage("name of normal user").that(mUms.getName(normalUser)).isNull();
        expect.withMessage("name of normal user").that(mUms.getName(normalUser))
                .isEqualTo(mUms.getUnnamedUserName());
    }

    @Test
@@ -1383,6 +1389,18 @@ public final class UserManagerServiceMockedTest {
        }
    }

    private void assertDefaultNewUserName(List<UserInfo> users, int... userIds) {
        Set<Integer> userIdsSet = Arrays.stream(userIds).boxed().collect(Collectors.toSet());
        var newUserName = mUms.getUnnamedUserName();
        for (var user : users) {
            if (userIdsSet.contains(user.id)) {
                expect.withMessage("name on user (%s)", user.toFullString())
                        .that(user.name)
                        .isEqualTo(newUserName);
            }
        }
    }

    @Test
    public void testGetUsersWithUnresolvedNames() {
        var headlessSystemUser = addUser(new UserInfo(USER_SYSTEM, /* name= */ null, FLAG_ADMIN));
@@ -1418,8 +1436,19 @@ public final class UserManagerServiceMockedTest {
    }

    @Test
    public void testGetUsersInternal() {
    public void testGetUsersInternal_nonHsum() {
        var fullSystemUser =
                addUser(new UserInfo(USER_SYSTEM, /* name= */ null, FLAG_FULL | FLAG_ADMIN));
        testGetUsersInternal(fullSystemUser);
    }

    @Test
    public void testGetUsersInternal_hsum() {
        var headlessSystemUser = addUser(new UserInfo(USER_SYSTEM, /* name= */ null, FLAG_ADMIN));
        testGetUsersInternal(headlessSystemUser);
    }

    private void testGetUsersInternal(UserInfo systemUser) {
        var adminUser = addUser(new UserInfo(/* id= */ 4, /* name= */ null,
                FLAG_FULL | FLAG_ADMIN));
        var nonAdminUser = addUser(new UserInfo(/* id= */ 8, /* name= */ null, FLAG_FULL));
@@ -1435,28 +1464,28 @@ public final class UserManagerServiceMockedTest {
                DONT_RESOLVE_NULL_NAMES)
                .that(mUms.getUsersInternal(EXCLUDE_PARTIAL, EXCLUDE_DYING,
                        DONT_RESOLVE_NULL_NAMES))
                .containsExactly(headlessSystemUser, adminUser, nonAdminUser, namedUser);
                .containsExactly(systemUser, adminUser, nonAdminUser, namedUser);
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL, EXCLUDE_DYING,
                DONT_RESOLVE_NULL_NAMES)
                .that(mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, EXCLUDE_DYING,
                        DONT_RESOLVE_NULL_NAMES))
                .containsExactly(headlessSystemUser, adminUser, nonAdminUser, namedUser,
                .containsExactly(systemUser, adminUser, nonAdminUser, namedUser,
                        partialUser);
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                DONT_RESOLVE_NULL_NAMES)
                .that(mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                        DONT_RESOLVE_NULL_NAMES))
                .containsExactly(headlessSystemUser, adminUser, nonAdminUser, namedUser,
                .containsExactly(systemUser, adminUser, nonAdminUser, namedUser,
                        partialUser, dyingUser);
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                DONT_RESOLVE_NULL_NAMES)
                .that(mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                        DONT_RESOLVE_NULL_NAMES))
                .containsExactly(headlessSystemUser, adminUser, nonAdminUser, namedUser,
                .containsExactly(systemUser, adminUser, nonAdminUser, namedUser,
                        partialUser, dyingUser);

        // NOTE: cannot check for a system user with resolved name on containsExactly() because
        // UserInfo doesn't implement equals, hence checks below need to explicitly check it
        // NOTE: cannot check for users with resolved names on containsExactly() because
        // UserInfo doesn't implement equals, hence checks below need to explicitly check them
        List<UserInfo> resolvedNameUsers;

        resolvedNameUsers = mUms.getUsersInternal(EXCLUDE_PARTIAL, EXCLUDE_DYING,
@@ -1468,8 +1497,9 @@ public final class UserManagerServiceMockedTest {
        expect.withMessage("getUsersInternal(%s, %s, %s)", EXCLUDE_PARTIAL, EXCLUDE_DYING,
                RESOLVE_NULL_NAMES)
                .that(resolvedNameUsers)
                .containsAtLeast(adminUser, nonAdminUser, namedUser);
                .contains(namedUser);
        assertDefaultSystemUserName(resolvedNameUsers);
        assertDefaultNewUserName(resolvedNameUsers, adminUser.id, nonAdminUser.id);

        resolvedNameUsers = mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, EXCLUDE_DYING,
                RESOLVE_NULL_NAMES);
@@ -1480,8 +1510,9 @@ public final class UserManagerServiceMockedTest {
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL, EXCLUDE_DYING,
                RESOLVE_NULL_NAMES)
                .that(resolvedNameUsers)
                .containsAtLeast(adminUser, nonAdminUser, namedUser, partialUser);
                .contains(namedUser);
        assertDefaultSystemUserName(resolvedNameUsers);
        assertDefaultNewUserName(resolvedNameUsers, adminUser.id, nonAdminUser.id, partialUser.id);

        resolvedNameUsers = mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                RESOLVE_NULL_NAMES);
@@ -1492,8 +1523,10 @@ public final class UserManagerServiceMockedTest {
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL,
                DONT_EXCLUDE_DYING, RESOLVE_NULL_NAMES)
                .that(resolvedNameUsers)
                .containsAtLeast(adminUser, nonAdminUser, namedUser, partialUser, dyingUser);
                .contains(namedUser);
        assertDefaultSystemUserName(resolvedNameUsers);
        assertDefaultNewUserName(resolvedNameUsers, adminUser.id, nonAdminUser.id, partialUser.id,
                dyingUser.id);

        resolvedNameUsers = mUms.getUsersInternal(DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                RESOLVE_NULL_NAMES);
@@ -1504,8 +1537,10 @@ public final class UserManagerServiceMockedTest {
        expect.withMessage("getUsersInternal(%s, %s, %s)", DONT_EXCLUDE_PARTIAL, DONT_EXCLUDE_DYING,
                RESOLVE_NULL_NAMES)
                .that(resolvedNameUsers)
                .containsAtLeast(adminUser, nonAdminUser, namedUser, partialUser, dyingUser);
                .contains(namedUser);
        assertDefaultSystemUserName(resolvedNameUsers);
        assertDefaultNewUserName(resolvedNameUsers, adminUser.id, nonAdminUser.id, partialUser.id,
                dyingUser.id);
    }

    @Test