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

Commit 6e5ce492 authored by Anna Bauza's avatar Anna Bauza
Browse files

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
parent 80c29640
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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);
        }
+19 −0
Original line number Diff line number Diff line
@@ -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