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

Commit e8a500fa authored by Anna Bauza's avatar Anna Bauza
Browse files

Cache list of UserInfo for getProfiles method in UserManager.

The cache require to be invalidated every time data for UserInfo change
or when user is added or removed.

Flag: android.multiuser.cache_profiles_read_only
Bug: 350419395
Test: atest UserManagerTest
Change-Id: Iaed12a3b6402729780fa4839730dcddc4941e001
parent c7ebd302
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -5308,7 +5308,13 @@ public class UserManager {
            Manifest.permission.MANAGE_USERS,
            Manifest.permission.CREATE_USERS,
            Manifest.permission.QUERY_USERS}, conditional = true)
    @CachedProperty(api = "user_manager_user_data")
    public List<UserInfo> getProfiles(@UserIdInt int userId) {
        if (android.multiuser.Flags.cacheProfilesReadOnly()) {
            return UserManagerCache.getProfiles(
                    (Integer userIdentifier) -> mService.getProfiles(userIdentifier, false),
                    userId);
        }
        try {
            return mService.getProfiles(userId, false /* enabledOnly */);
        } catch (RemoteException re) {
@@ -6483,6 +6489,19 @@ public class UserManager {
        }
    }

    /**
     * This method is used to invalidate caches, when UserManagerService.mUsers
     * {@link UserManagerService.UserData} is modified, including changes to {@link UserInfo}.
     * In practice we determine modification by when that data is persisted, or scheduled to be
     * presisted, to xml.
     * @hide
     */
    public static final void invalidateCacheOnUserDataChanged() {
        if (android.multiuser.Flags.cacheProfilesReadOnly()) {
            UserManagerCache.invalidateProfiles();
        }
    }

    /**
     * Returns a serial number on this device for a given userId. User handles can be recycled
     * when deleting and creating users, but serial numbers are not reused until the device is
+12 −0
Original line number Diff line number Diff line
@@ -4984,7 +4984,10 @@ public class UserManagerService extends IUserManager.Stub {
            res.getValue(com.android.internal.R.string.owner_name, mOwnerNameTypedValue, true);
            final CharSequence ownerName = mOwnerNameTypedValue.coerceToString();
            mOwnerName.set(ownerName != null ? ownerName.toString() : null);
            // Invalidate when owners name changes due to config change.
            UserManager.invalidateCacheOnUserDataChanged();
        }

    }

    private void scheduleWriteUserList() {
@@ -4997,6 +5000,8 @@ public class UserManagerService extends IUserManager.Stub {
            Message msg = mHandler.obtainMessage(WRITE_USER_LIST_MSG);
            mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
        }
        // Invalidate cache when {@link UserData} changed, but write was scheduled for later.
        UserManager.invalidateCacheOnUserDataChanged();
    }

    private void scheduleWriteUser(@UserIdInt int userId) {
@@ -5009,6 +5014,8 @@ public class UserManagerService extends IUserManager.Stub {
            Message msg = mHandler.obtainMessage(WRITE_USER_MSG, userId);
            mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
        }
        // Invalidate cache when {@link Data} changed, but write was scheduled for later.
        UserManager.invalidateCacheOnUserDataChanged();
    }

    private ResilientAtomicFile getUserFile(int userId) {
@@ -5032,6 +5039,9 @@ public class UserManagerService extends IUserManager.Stub {
        if (DBG) {
            debug("writeUserLP " + userData);
        }
        // invalidate caches related to any {@link UserData} change.
        UserManager.invalidateCacheOnUserDataChanged();

        try (ResilientAtomicFile userFile = getUserFile(userData.info.id)) {
            FileOutputStream fos = null;
            try {
@@ -5196,6 +5206,8 @@ public class UserManagerService extends IUserManager.Stub {
        if (DBG) {
            debug("writeUserList");
        }
        // invalidate caches related to any {@link UserData} change.
        UserManager.invalidateCacheOnUserDataChanged();

        try (ResilientAtomicFile file = getUserListFile()) {
            FileOutputStream fos = null;