From 9f8583b06e65bda28c86f798f5bd4ee219faecab Mon Sep 17 00:00:00 2001 From: Will Leshner Date: Thu, 6 Oct 2022 15:42:47 -0700 Subject: [PATCH] Keep dreaming when undocked when configured to. Bug: 251461510 Test: atest PowerManagerServiceTest Change-Id: Ie760c3ec76a08f71aa1dcab956b165e8895d1c59 --- .../server/power/PowerManagerService.java | 15 +++++++++++ .../server/power/PowerManagerServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 3a05fc3c99c57..dbc0a34b1bdae 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -467,6 +467,9 @@ public final class PowerManagerService extends SystemService // True if the device should wake up when plugged or unplugged. private boolean mWakeUpWhenPluggedOrUnpluggedConfig; + // True if the device should keep dreaming when undocked. + private boolean mKeepDreamingWhenUndockingConfig; + // True if the device should wake up when plugged or unplugged in theater mode. private boolean mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig; @@ -1374,6 +1377,8 @@ public final class PowerManagerService extends SystemService com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay); mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean( com.android.internal.R.bool.config_unplugTurnsOnScreen); + mKeepDreamingWhenUndockingConfig = resources.getBoolean( + com.android.internal.R.bool.config_keepDreamingWhenUndocking); mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean( com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug); mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean( @@ -2487,6 +2492,14 @@ public final class PowerManagerService extends SystemService return false; } + // Don't wake when undocking while dreaming if configured not to. + if (mKeepDreamingWhenUndockingConfig + && getGlobalWakefulnessLocked() == WAKEFULNESS_DREAMING + && wasPowered && !mIsPowered + && oldPlugType == BatteryManager.BATTERY_PLUGGED_DOCK) { + return false; + } + // Don't wake when undocked from wireless charger. // See WirelessChargerDetector for justification. if (wasPowered && !mIsPowered @@ -4406,6 +4419,8 @@ public final class PowerManagerService extends SystemService + mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig); pw.println(" mTheaterModeEnabled=" + mTheaterModeEnabled); + pw.println(" mKeepDreamingWhenUndockingConfig=" + + mKeepDreamingWhenUndockingConfig); pw.println(" mSuspendWhenScreenOffDueToProximityConfig=" + mSuspendWhenScreenOffDueToProximityConfig); pw.println(" mDreamsSupportedConfig=" + mDreamsSupportedConfig); 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 9ff7d69e09a61..1c50afeee4ac6 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -612,6 +612,31 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); } + /** + * Tests that dreaming continues when undocking and configured to do so. + */ + @Test + public void testWakefulnessDream_shouldKeepDreamingWhenUndocked() { + createService(); + startSystem(); + + when(mResourcesSpy.getBoolean( + com.android.internal.R.bool.config_keepDreamingWhenUndocking)) + .thenReturn(true); + mService.readConfigurationLocked(); + + when(mBatteryManagerInternalMock.getPlugType()) + .thenReturn(BatteryManager.BATTERY_PLUGGED_DOCK); + setPluggedIn(true); + + forceAwake(); // Needs to be awake first before it can dream. + forceDream(); + when(mBatteryManagerInternalMock.getPlugType()).thenReturn(0); + setPluggedIn(false); + + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); + } + @Test public void testWakefulnessDoze_goToSleep() { createService();