diff options
| author | 2024-07-10 11:58:02 +0000 | |
|---|---|---|
| committer | 2024-07-11 11:12:37 +0000 | |
| commit | 6e5ce492cc94de3c1fde0f7b16141538b3ecd60f (patch) | |
| tree | 5c39fd9b5a9ee53e62e0159d1d2e3732a05ba4a2 | |
| parent | 80c29640352eb71b000adc516b1b060bcca9520a (diff) | |
Cache quiet mode state in UserManager
This CL adds a cache for the quiet mode state in UserManager. The cache is invalidated when the quiet mode state is changed. This change should improve the performance of the isQuietModeEnabled method.
Bug: 350420769
Change-Id: Iba99b30f36447dd1998fc418b8d59b80076ba8b9
Test: atest QuietModeTest
Test: atest ManagedProfileQuietModeEnablerTest
Flag: android.multiuser.cache_quiet_mode_state
3 files changed, 54 insertions, 0 deletions
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 984bf650a1b8..3aa42c6bb594 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -5668,6 +5668,33 @@ public class UserManager { } } + private static final String CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY = + PropertyInvalidatedCache.createPropertyName( + PropertyInvalidatedCache.MODULE_SYSTEM, "quiet_mode_enabled"); + + private final PropertyInvalidatedCache<Integer, Boolean> mQuietModeEnabledCache = + new PropertyInvalidatedCache<Integer, Boolean>( + 32, CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY) { + @Override + public Boolean recompute(Integer query) { + try { + return mService.isQuietModeEnabled(query); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + @Override + public boolean bypass(Integer query) { + return query < 0; + } + }; + + + /** @hide */ + public static final void invalidateQuietModeEnabledCache() { + PropertyInvalidatedCache.invalidateCache(CACHE_KEY_QUIET_MODE_ENABLED_PROPERTY); + } + /** * Returns whether the given profile is in quiet mode or not. * @@ -5675,6 +5702,13 @@ public class UserManager { * @return true if the profile is in quiet mode, false otherwise. */ public boolean isQuietModeEnabled(UserHandle userHandle) { + if (android.multiuser.Flags.cacheQuietModeState()){ + final int userId = userHandle.getIdentifier(); + if (userId < 0) { + return false; + } + return mQuietModeEnabledCache.query(userId); + } try { return mService.isQuietModeEnabled(userHandle.getIdentifier()); } catch (RemoteException re) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index b9a9d64fc50e..2c233f84d083 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1901,6 +1901,7 @@ public class UserManagerService extends IUserManager.Stub { Slog.i(LOG_TAG, "Quiet mode is already " + enableQuietMode); return; } + UserManager.invalidateQuietModeEnabledCache(); profile.flags ^= UserInfo.FLAG_QUIET_MODE; profileUserData = getUserDataLU(profile.id); } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java index 9003ab67327a..d714db99f18f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java @@ -1862,6 +1862,25 @@ public final class UserManagerTest { assertThat(profilesExcludingHidden).asList().doesNotContain(profile.id); } + /** + * Test that UserManager.isQuietModeEnabled return false for unsupported + * arguments such as UserHandle.NULL, UserHandle.CURRENT or UserHandle.ALL. + **/ + @MediumTest + @Test + public void testQuietModeEnabledForUnsupportedUserHandles() throws Exception { + assumeManagedUsersSupported(); + final int mainUserId = mUserManager.getMainUser().getIdentifier(); + UserInfo userInfo = createProfileForUser("Profile", + UserManager.USER_TYPE_PROFILE_MANAGED, mainUserId); + mUserManager.requestQuietModeEnabled(true, userInfo.getUserHandle()); + assertThat(mUserManager.isQuietModeEnabled(userInfo.getUserHandle())).isTrue(); + assertThat(mUserManager.isQuietModeEnabled(UserHandle.of(UserHandle.USER_NULL))).isFalse(); + assertThat(mUserManager.isQuietModeEnabled(UserHandle.CURRENT)).isFalse(); + assertThat(mUserManager.isQuietModeEnabled(UserHandle.CURRENT_OR_SELF)).isFalse(); + assertThat(mUserManager.isQuietModeEnabled(UserHandle.ALL)).isFalse(); + } + private String generateLongString() { String partialString = "Test Name Test Name Test Name Test Name Test Name Test Name Test " + "Name Test Name Test Name Test Name "; //String of length 100 |