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

Commit e7999ed7 authored by Lucas Silva's avatar Lucas Silva
Browse files

Only allow dreaming on default display

Bug: 383208131
Flag: EXEMPT bugfix
Test: atest PowerManagerServiceTest
Change-Id: I29ca0c7d04f07cb5e3bec4f82975378e3296010a
parent 828c910e
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -3379,7 +3379,7 @@ public final class PowerManagerService extends SystemService
                }
                }
                changed = sleepPowerGroupLocked(powerGroup, time,
                changed = sleepPowerGroupLocked(powerGroup, time,
                        PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, Process.SYSTEM_UID);
                        PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, Process.SYSTEM_UID);
            } else if (shouldNapAtBedTimeLocked()) {
            } else if (shouldNapAtBedTimeLocked(powerGroup)) {
                changed = dreamPowerGroupLocked(powerGroup, time,
                changed = dreamPowerGroupLocked(powerGroup, time,
                        Process.SYSTEM_UID, /* allowWake= */ false);
                        Process.SYSTEM_UID, /* allowWake= */ false);
            } else {
            } else {
@@ -3395,7 +3395,10 @@ public final class PowerManagerService extends SystemService
     * activity timeout has expired and it's bedtime.
     * activity timeout has expired and it's bedtime.
     */
     */
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private boolean shouldNapAtBedTimeLocked() {
    private boolean shouldNapAtBedTimeLocked(PowerGroup powerGroup) {
        if (!powerGroup.supportsSandmanLocked()) {
            return false;
        }
        return mDreamsActivateOnSleepSetting
        return mDreamsActivateOnSleepSetting
                || (mDreamsActivateOnDockSetting
                || (mDreamsActivateOnDockSetting
                        && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED)
                        && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED)
@@ -3617,9 +3620,10 @@ public final class PowerManagerService extends SystemService
        if (!mDreamsDisabledByAmbientModeSuppressionConfig) {
        if (!mDreamsDisabledByAmbientModeSuppressionConfig) {
            return;
            return;
        }
        }
        final PowerGroup defaultPowerGroup = mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP);
        if (!isSuppressed && mIsPowered && mDreamsSupportedConfig && mDreamsEnabledSetting
        if (!isSuppressed && mIsPowered && mDreamsSupportedConfig && mDreamsEnabledSetting
                && shouldNapAtBedTimeLocked() && isItBedTimeYetLocked(
                && shouldNapAtBedTimeLocked(defaultPowerGroup)
                mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP))) {
                && isItBedTimeYetLocked(defaultPowerGroup)) {
            napInternal(SystemClock.uptimeMillis(), Process.SYSTEM_UID, /* allowWake= */ true);
            napInternal(SystemClock.uptimeMillis(), Process.SYSTEM_UID, /* allowWake= */ true);
        } else if (isSuppressed) {
        } else if (isSuppressed) {
            mDirty |= DIRTY_SETTINGS;
            mDirty |= DIRTY_SETTINGS;
+43 −0
Original line number Original line Diff line number Diff line
@@ -2500,6 +2500,49 @@ public class PowerManagerServiceTest {
        verify(mDreamManagerInternalMock).startDream(eq(true), anyString());
        verify(mDreamManagerInternalMock).startDream(eq(true), anyString());
    }
    }


    @Test
    public void testMultiDisplay_twoDisplays_onlyDefaultDisplayCanDream() {
        final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
        final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1;
        final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener =
                new AtomicReference<>();
        doAnswer((Answer<Void>) invocation -> {
            listener.set(invocation.getArgument(0));
            return null;
        }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any());
        final DisplayInfo info = new DisplayInfo();
        info.displayGroupId = nonDefaultDisplayGroupId;
        when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info);
        when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true);
        Settings.Secure.putInt(mContextSpy.getContentResolver(),
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 1);
        doAnswer(inv -> {
            when(mDreamManagerInternalMock.isDreaming()).thenReturn(true);
            return null;
        }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString());

        setMinimumScreenOffTimeoutConfig(5);
        createService();
        startSystem();

        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);

        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
                WAKEFULNESS_AWAKE);
        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
                WAKEFULNESS_AWAKE);
        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);

        advanceTime(15000);

        // Only the default display group is dreaming.
        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
                WAKEFULNESS_DREAMING);
        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
                WAKEFULNESS_DOZING);
        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
    }

    @Test
    @Test
    public void testMultiDisplay_addNewDisplay_becomeGloballyAwakeButDefaultRemainsDozing() {
    public void testMultiDisplay_addNewDisplay_becomeGloballyAwakeButDefaultRemainsDozing() {
        final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
        final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;