Loading core/java/android/os/UserManager.java +19 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading services/core/java/com/android/server/pm/UserManagerService.java +12 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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) { Loading @@ -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) { Loading @@ -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 { Loading Loading @@ -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; Loading Loading
core/java/android/os/UserManager.java +19 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading
services/core/java/com/android/server/pm/UserManagerService.java +12 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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) { Loading @@ -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) { Loading @@ -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 { Loading Loading @@ -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; Loading