From e5f5f12cdfcf38cb723e286ece61d29f1b2459b2 Mon Sep 17 00:00:00 2001 From: Robert Horvath Date: Thu, 17 Feb 2022 11:27:01 +0100 Subject: [PATCH] Fix inattentive sleep failing to go to sleep while dreaming Sets the user activity summary to 0 if the attentive timeout is expired. This leads `canDreamLocked` to return `false`, and `handleSandman` to end the dream and put the device to sleep. Bug: 199967105 Bug: 209963168 Bug: 206737976 Test: atest PowerManagerServiceTest Change-Id: I022d8b3beab50548428923f25d2fbae29f5362d8 --- .../server/power/PowerManagerService.java | 9 +++++++-- .../server/power/PowerManagerServiceTest.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 8291f48bb7237..53fe34d190a6c 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -2687,8 +2687,8 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void updateUserActivitySummaryLocked(long now, int dirty) { // Update the status of the user activity timeout timer. - if ((dirty & (DIRTY_DISPLAY_GROUP_WAKEFULNESS | DIRTY_WAKE_LOCKS - | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) == 0) { + if ((dirty & (DIRTY_DISPLAY_GROUP_WAKEFULNESS | DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY + | DIRTY_WAKEFULNESS | DIRTY_SETTINGS | DIRTY_ATTENTIVE)) == 0) { return; } mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT); @@ -2775,6 +2775,11 @@ public final class PowerManagerService extends SystemService screenDimDuration); } + if (isAttentiveTimeoutExpired(powerGroup, now)) { + groupUserActivitySummary = 0; + groupNextTimeout = -1; + } + hasUserActivitySummary |= groupUserActivitySummary != 0; if (nextTimeout == -1) { 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 ee9a1e0fc4811..a7d3ee9f4d75c 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -1098,6 +1098,23 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_ASLEEP); } + + @SuppressWarnings("GuardedBy") + @Test + public void testInattentiveSleep_goesToSleepFromDream() { + setAttentiveTimeout(20000); + createService(); + startSystem(); + setPluggedIn(true); + forceAwake(); + forceDream(); + when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); + + advanceTime(20500); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); + } + @Test public void testWakeLock_affectsProperDisplayGroup() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;