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

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

Cache getProfileParent to reduce high volume of binder calls.

Test: atest UserManagerTest
Flag: android.multiuser.cache_profile_parent_read_only
Bug: 350417399
Change-Id: I2555d4e7495f0a73734ae22f0d7aa246bf2cc44e
parent d104ae4b
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -5600,15 +5600,31 @@ public class UserManager {
            android.Manifest.permission.MANAGE_USERS,
            android.Manifest.permission.INTERACT_ACROSS_USERS
    })
    @CachedProperty(api = "user_manager_users")
    public @Nullable UserHandle getProfileParent(@NonNull UserHandle user) {
        if (android.multiuser.Flags.cacheProfileParentReadOnly()) {
            final UserHandle userHandle = UserManagerCache.getProfileParent(
                    (UserHandle query) -> {
                        UserInfo info = getProfileParent(query.getIdentifier());
                        // TODO: Remove when b/372923336 is fixed
                        if (info == null) {
                            return UserHandle.of(UserHandle.USER_NULL);
                        }
                        return UserHandle.of(info.id);
                    },
                    user);
            if (userHandle.getIdentifier() == UserHandle.USER_NULL) {
                return null;
            }
            return userHandle;
        } else {
            UserInfo info = getProfileParent(user.getIdentifier());

            if (info == null) {
                return null;
            }

            return UserHandle.of(info.id);
        }
    }

    /**
     * Enables or disables quiet mode for a profile. If quiet mode is enabled, apps in the profile
@@ -6422,6 +6438,9 @@ public class UserManager {
     */
    public static final void invalidateCacheOnUserListChange() {
        UserManagerCache.invalidateUserSerialNumber();
        if (android.multiuser.Flags.cacheProfileParentReadOnly()) {
            UserManagerCache.invalidateProfileParent();
        }
    }

    /**
+6 −0
Original line number Diff line number Diff line
@@ -5789,6 +5789,9 @@ public class UserManagerService extends IUserManager.Stub {
            }

            userInfo.partial = false;
            if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) {
                UserManager.invalidateCacheOnUserListChange();
            }
            synchronized (mPackagesLock) {
                writeUserLP(userData);
            }
@@ -6367,6 +6370,9 @@ public class UserManagerService extends IUserManager.Stub {
                // on next startup, in case the runtime stops now before stopping and
                // removing the user completely.
                userData.info.partial = true;
                if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) {
                    UserManager.invalidateCacheOnUserListChange();
                }
                // Mark it as disabled, so that it isn't returned any more when
                // profiles are queried.
                userData.info.flags |= UserInfo.FLAG_DISABLED;