Merge "Allow dozing default display when other displays are awake" into tm-dev

This commit is contained in:
Antony Sargent
2022-03-31 03:25:11 +00:00
committed by Android (Google) Code Review
2 changed files with 56 additions and 4 deletions

View File

@@ -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;
}
/**

View File

@@ -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<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);
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();