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
This commit is contained in:
Robert Horvath
2022-02-17 11:27:01 +01:00
parent 1dd3129e14
commit e5f5f12cdf
2 changed files with 24 additions and 2 deletions

View File

@@ -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) {

View File

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