diff options
| author | 2024-10-21 10:46:21 +0000 | |
|---|---|---|
| committer | 2024-10-21 10:46:21 +0000 | |
| commit | f7cb1922483c9509f82bb41f855d9f7e1651a576 (patch) | |
| tree | e5bd678400cac72259cab05e8dccd037d8052ea8 | |
| parent | a994119a5aa6a5fa31f522ff17930beceefdef97 (diff) | |
| parent | c08c296025a17b72e9a7ac15df8936080505d17e (diff) | |
Merge "Cache getProfileParent to reduce high volume of binder calls." into main
| -rw-r--r-- | core/java/android/os/UserManager.java | 31 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 6 |
2 files changed, 31 insertions, 6 deletions
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index acf4a2f3ec71..fa99f3563de9 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -5602,14 +5602,30 @@ 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) { - UserInfo info = getProfileParent(user.getIdentifier()); - - if (info == null) { - return null; + 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); } - - return UserHandle.of(info.id); } /** @@ -6424,6 +6440,9 @@ public class UserManager { */ public static final void invalidateCacheOnUserListChange() { UserManagerCache.invalidateUserSerialNumber(); + if (android.multiuser.Flags.cacheProfileParentReadOnly()) { + UserManagerCache.invalidateProfileParent(); + } } /** diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 6ac8b221b21f..6c03214a2610 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -5790,6 +5790,9 @@ public class UserManagerService extends IUserManager.Stub { } userInfo.partial = false; + if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) { + UserManager.invalidateCacheOnUserListChange(); + } synchronized (mPackagesLock) { writeUserLP(userData); } @@ -6382,6 +6385,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; |