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

Commit 9257174a authored by brycelee's avatar brycelee
Browse files

Resolve missing whenToDreamSettings.

This changelist introduces a helper method that can be used
to restrict the whenToDream setting to a set of known values
(usually those presented in settings ui). If the current
setting is not found, dreams are disabled and whenToDream
is set to the default if said value is in the provided list.

Test: atest DreamBackendTest
Bug: 419323985
Flag: com.android.settings.flags.resolve_missing_when_to_dream
Change-Id: Ic234452a5f280ae2cb1ad0e336f343d807523e72
parent 24645ccc
Loading
Loading
Loading
Loading
+60 −5
Original line number Diff line number Diff line
@@ -340,16 +340,50 @@ public class DreamBackend {

    @WhenToDream
    public int getWhenToDreamSetting() {
        return isActivatedOnDock() && isActivatedOnSleep() ? WHILE_CHARGING_OR_DOCKED
                : isActivatedOnSleep() ? WHILE_CHARGING
                        : isActivatedOnDock() ? WHILE_DOCKED
                                : isActivatedOnPostured() ? WHILE_POSTURED
        return getWhenToDreamSetting(false);
    }

    /**
     * Returns the default when to dream setting.
     */
    @WhenToDream
    public int getDefaultWhenToDreamSetting() {
        return getWhenToDreamSetting(true);
    }

    /**
     * Retrieves when to dream setting.
     * @param defaultOnly Retrieve default value only.
     */
    @WhenToDream
    @VisibleForTesting
    private int getWhenToDreamSetting(boolean defaultOnly) {
        final boolean isActivatedOnDock = defaultOnly ? mDreamsActivatedOnDockByDefault
                : isActivatedOnDock();
        final boolean isActivatedOnSleep = defaultOnly ? mDreamsActivatedOnSleepByDefault
                : isActivatedOnSleep();
        final boolean isActivatedOnPostured = defaultOnly ? mDreamsActivatedOnPosturedByDefault
                : isActivatedOnPostured();

        return isActivatedOnDock && isActivatedOnSleep ? WHILE_CHARGING_OR_DOCKED
                : isActivatedOnSleep ? WHILE_CHARGING
                        : isActivatedOnDock ? WHILE_DOCKED
                                : isActivatedOnPostured ? WHILE_POSTURED
                                        : NEVER;
    }

    public void setWhenToDream(@WhenToDream int whenToDream) {
        setEnabled(whenToDream != NEVER);

        updateWhenToDream(whenToDream);

        logDreamSettingChangeToStatsd(DS_TYPE_WHEN_TO_DREAM);
    }

    /**
     * Allows when to dream to be toggled without changing the enabled status or logging.
     */
    private void updateWhenToDream(@WhenToDream int whenToDream) {
        switch (whenToDream) {
            case WHILE_CHARGING:
                setActivatedOnDock(false);
@@ -379,8 +413,29 @@ public class DreamBackend {
            default:
                break;
        }
    }

        logDreamSettingChangeToStatsd(DS_TYPE_WHEN_TO_DREAM);
    /**
     * Updates set whenToDream setting to be within the given option set.
     * @param availableOptions the available whenToDream settings options
     */
    public void resolveMissingWhenToDream(int[] availableOptions) {
        final int current = getWhenToDreamSetting();

        // If selected option is available, exit early.
        if (Arrays.stream(availableOptions).anyMatch(option ->option == current)) {
            return;
        }

        // Turn off dreams
        setEnabled(false);

        final int defaultOption = getDefaultWhenToDreamSetting();

        // set to default value if available.
        if (Arrays.stream(availableOptions).anyMatch(option ->option == defaultOption)) {
            updateWhenToDream(defaultOption);
        }
    }

    /** Gets all complications which have been enabled by the user. */
+33 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import static android.service.dreams.Flags.FLAG_ALLOW_DREAM_WHEN_POSTURED;
import static com.android.settingslib.dream.DreamBackend.COMPLICATION_TYPE_DATE;
import static com.android.settingslib.dream.DreamBackend.COMPLICATION_TYPE_HOME_CONTROLS;
import static com.android.settingslib.dream.DreamBackend.COMPLICATION_TYPE_TIME;
import static com.android.settingslib.dream.DreamBackend.WHILE_CHARGING;
import static com.android.settingslib.dream.DreamBackend.WHILE_CHARGING_OR_DOCKED;

import static com.google.common.truth.Truth.assertThat;

@@ -81,6 +83,13 @@ public final class DreamBackendTest {
        when(res.getStringArray(
                com.android.internal.R.array.config_loggable_dream_prefixes)).thenReturn(
                new String[]{});
        when(res.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault
                )).thenReturn(true);
        when(res.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault
                )).thenReturn(false);
        when(res.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault
                )).thenReturn(false);

        mBackend = new DreamBackend(mContext);
    }

@@ -115,6 +124,25 @@ public final class DreamBackendTest {
        assertThat(mBackend.getComplicationsEnabled()).isFalse();
    }

    @Test
    public void testResolveMissingWhenToStartOption() {
        mBackend.setWhenToDream(WHILE_CHARGING_OR_DOCKED);
        mBackend.setEnabled(true);
        assertThat(mBackend.getDefaultWhenToDreamSetting()).isEqualTo(WHILE_CHARGING);
        mBackend.resolveMissingWhenToDream(new int[]{WHILE_CHARGING});
        assertThat(mBackend.getWhenToDreamSetting()).isEqualTo(WHILE_CHARGING);
        assertThat(mBackend.isEnabled()).isFalse();
    }

    @Test
    public void testResolveMissingWhenToStartOptionWhenCompliant() {
        mBackend.setWhenToDream(WHILE_CHARGING_OR_DOCKED);
        mBackend.setEnabled(true);
        mBackend.resolveMissingWhenToDream(new int[]{WHILE_CHARGING, WHILE_CHARGING_OR_DOCKED});
        assertThat(mBackend.getWhenToDreamSetting()).isEqualTo(WHILE_CHARGING_OR_DOCKED);
        assertThat(mBackend.isEnabled()).isTrue();
    }

    @Test
    public void testHomeControlsDisabled_ComplicationsEnabled() {
        setControlsEnabledOnLockscreen(true);
@@ -218,6 +246,11 @@ public final class DreamBackendTest {
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                1
        );
        Settings.Secure.putInt(
                mContext.getContentResolver(),
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                0
        );
        Settings.Secure.putInt(
                mContext.getContentResolver(),
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,