diff options
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 |