diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 57f13829b557e..5863ab0af80c7 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -3192,7 +3192,7 @@ public final class PowerManagerService extends SystemService wakefulness = powerGroup.getWakefulnessLocked(); if ((wakefulness == WAKEFULNESS_DREAMING || wakefulness == WAKEFULNESS_DOZING) && powerGroup.isSandmanSummonedLocked() && powerGroup.isReadyLocked()) { - startDreaming = canDreamLocked(powerGroup) || canDozeLocked(); + startDreaming = canDreamLocked(powerGroup) || canDozeLocked(powerGroup); powerGroup.setSandmanSummonedLocked(/* isSandmanSummoned= */ false); } else { startDreaming = false; @@ -3331,9 +3331,9 @@ public final class PowerManagerService extends SystemService * Returns true if the device is allowed to doze in its current state. */ @GuardedBy("mLock") - private boolean canDozeLocked() { - // TODO (b/175764708): Support per-display doze. - return getGlobalWakefulnessLocked() == WAKEFULNESS_DOZING; + private boolean canDozeLocked(PowerGroup powerGroup) { + return powerGroup.supportsSandmanLocked() + && powerGroup.getWakefulnessLocked() == WAKEFULNESS_DOZING; } /** diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 9f5e79db84c89..bef1caa25bb5e 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -1683,6 +1683,58 @@ public class PowerManagerServiceTest { assertThat(wakeData.sleepDuration).isEqualTo(eventTime3 - eventTime2); } + @Test + public void testMultiDisplay_defaultDisplayCanDoze() { + createService(); + startSystem(); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + + forceDozing(); + // Allow handleSandman() to be called asynchronously + advanceTime(500); + verify(mDreamManagerInternalMock).startDream(eq(true)); + } + + @Test + public void testMultiDisplay_twoDisplays_defaultDisplayCanDoze() { + final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; + final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; + final AtomicReference listener = + new AtomicReference<>(); + doAnswer((Answer) 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); + + 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); + + forceDozing(); + + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_DOZING); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + + // Allow handleSandman() to be called asynchronously + advanceTime(500); + verify(mDreamManagerInternalMock).startDream(eq(true)); + } + @Test public void testLastSleepTime_notUpdatedWhenDreaming() { createService();