From e0e4cb413c87a40972ec93426f129e10c345b444 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Tue, 22 Mar 2022 15:08:18 -0700 Subject: [PATCH] Allow dozing default display when other displays are awake Fixes: 219958577 Test: atest PowerManagerServiceTest Change-Id: I74385ad361f46a8f4ed77be172d2b778d3790b92 --- .../server/power/PowerManagerService.java | 8 +-- .../server/power/PowerManagerServiceTest.java | 52 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index c04d6082877ae..cba48d9ddb313 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -3190,7 +3190,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; @@ -3329,9 +3329,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 89450ffbc11d3..859d34dba0c4e 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();