Loading core/java/android/os/PowerManagerInternal.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -351,4 +351,10 @@ public abstract class PowerManagerInternal { * return false if ambient display is not available. * return false if ambient display is not available. */ */ public abstract boolean isAmbientDisplaySuppressed(); public abstract boolean isAmbientDisplaySuppressed(); /** * Notifies PowerManager that the device has entered a postured state (stationary + upright). * This may affect dream eligibility. */ public abstract void setDevicePostured(boolean isPostured); } } services/core/java/com/android/server/power/PowerManagerService.java +46 −2 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.isInteractive; import static android.os.PowerManagerInternal.isInteractive; import static android.os.PowerManagerInternal.wakefulnessToString; import static android.os.PowerManagerInternal.wakefulnessToString; import static android.service.dreams.Flags.allowDreamWhenPostured; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle; import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle; Loading Loading @@ -216,6 +217,8 @@ public final class PowerManagerService extends SystemService private static final int DIRTY_ATTENTIVE = 1 << 14; private static final int DIRTY_ATTENTIVE = 1 << 14; // Dirty bit: display group wakefulness has changed // Dirty bit: display group wakefulness has changed private static final int DIRTY_DISPLAY_GROUP_WAKEFULNESS = 1 << 16; private static final int DIRTY_DISPLAY_GROUP_WAKEFULNESS = 1 << 16; // Dirty bit: device postured state has changed private static final int DIRTY_POSTURED_STATE = 1 << 17; // Summarizes the state of all active wakelocks. // Summarizes the state of all active wakelocks. static final int WAKE_LOCK_CPU = 1 << 0; static final int WAKE_LOCK_CPU = 1 << 0; Loading Loading @@ -500,6 +503,11 @@ public final class PowerManagerService extends SystemService // The current dock state. // The current dock state. private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; /** * Whether the device is upright and stationary. */ private boolean mDevicePostured; // True to decouple auto-suspend mode from the display state. // True to decouple auto-suspend mode from the display state. private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig; private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig; Loading Loading @@ -530,6 +538,9 @@ public final class PowerManagerService extends SystemService // Default value for dreams activate-on-dock // Default value for dreams activate-on-dock private boolean mDreamsActivatedOnDockByDefaultConfig; private boolean mDreamsActivatedOnDockByDefaultConfig; /** Default value for whether dreams are activated when postured (stationary + upright) */ private boolean mDreamsActivatedWhilePosturedByDefaultConfig; // True if dreams can run while not plugged in. // True if dreams can run while not plugged in. private boolean mDreamsEnabledOnBatteryConfig; private boolean mDreamsEnabledOnBatteryConfig; Loading Loading @@ -558,6 +569,9 @@ public final class PowerManagerService extends SystemService // True if dreams should be activated on dock. // True if dreams should be activated on dock. private boolean mDreamsActivateOnDockSetting; private boolean mDreamsActivateOnDockSetting; /** Whether dreams should be activated when device is postured (stationary and upright) */ private boolean mDreamsActivateWhilePosturedSetting; // True if doze should not be started until after the screen off transition. // True if doze should not be started until after the screen off transition. private boolean mDozeAfterScreenOff; private boolean mDozeAfterScreenOff; Loading Loading @@ -1471,6 +1485,9 @@ public final class PowerManagerService extends SystemService resolver.registerContentObserver(Settings.Secure.getUriFor( resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), false, mSettingsObserver, UserHandle.USER_ALL); false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED), false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), Settings.System.SCREEN_OFF_TIMEOUT), false, mSettingsObserver, UserHandle.USER_ALL); false, mSettingsObserver, UserHandle.USER_ALL); Loading Loading @@ -1549,6 +1566,8 @@ public final class PowerManagerService extends SystemService com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); mDreamsActivatedWhilePosturedByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault); mDreamsEnabledOnBatteryConfig = resources.getBoolean( mDreamsEnabledOnBatteryConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsEnabledOnBattery); com.android.internal.R.bool.config_dreamsEnabledOnBattery); mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( Loading Loading @@ -1589,6 +1608,10 @@ public final class PowerManagerService extends SystemService Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); UserHandle.USER_CURRENT) != 0); mDreamsActivateWhilePosturedSetting = (Settings.Secure.getIntForUser(resolver, Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, mDreamsActivatedWhilePosturedByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT); UserHandle.USER_CURRENT); Loading Loading @@ -3336,7 +3359,7 @@ public final class PowerManagerService extends SystemService if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST)) == 0) { | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_POSTURED_STATE)) == 0) { return changed; return changed; } } final long time = mClock.uptimeMillis(); final long time = mClock.uptimeMillis(); Loading Loading @@ -3375,7 +3398,8 @@ public final class PowerManagerService extends SystemService private boolean shouldNapAtBedTimeLocked() { private boolean shouldNapAtBedTimeLocked() { return mDreamsActivateOnSleepSetting return mDreamsActivateOnSleepSetting || (mDreamsActivateOnDockSetting || (mDreamsActivateOnDockSetting && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED); && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) || (mDreamsActivateWhilePosturedSetting && mDevicePostured); } } /** /** Loading Loading @@ -4489,6 +4513,17 @@ public final class PowerManagerService extends SystemService } } } } private void setDevicePosturedInternal(boolean isPostured) { if (!allowDreamWhenPostured()) { return; } synchronized (mLock) { mDevicePostured = isPostured; mDirty |= DIRTY_POSTURED_STATE; updatePowerStateLocked(); } } private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { synchronized (mLock) { synchronized (mLock) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { Loading Loading @@ -4794,6 +4829,8 @@ public final class PowerManagerService extends SystemService + mDreamsActivatedOnSleepByDefaultConfig); + mDreamsActivatedOnSleepByDefaultConfig); pw.println(" mDreamsActivatedOnDockByDefaultConfig=" pw.println(" mDreamsActivatedOnDockByDefaultConfig=" + mDreamsActivatedOnDockByDefaultConfig); + mDreamsActivatedOnDockByDefaultConfig); pw.println(" mDreamsActivatedWhilePosturedByDefaultConfig=" + mDreamsActivatedWhilePosturedByDefaultConfig); pw.println(" mDreamsEnabledOnBatteryConfig=" pw.println(" mDreamsEnabledOnBatteryConfig=" + mDreamsEnabledOnBatteryConfig); + mDreamsEnabledOnBatteryConfig); pw.println(" mDreamsBatteryLevelMinimumWhenPoweredConfig=" pw.println(" mDreamsBatteryLevelMinimumWhenPoweredConfig=" Loading @@ -4805,6 +4842,8 @@ public final class PowerManagerService extends SystemService pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting); pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting); pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting); pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting); pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting); pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting); pw.println(" mDreamsActivateWhilePosturedSetting=" + mDreamsActivateWhilePosturedSetting); pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff); pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff); pw.println(" mBrightWhenDozingConfig=" + mBrightWhenDozingConfig); pw.println(" mBrightWhenDozingConfig=" + mBrightWhenDozingConfig); pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig); pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig); Loading Loading @@ -7388,6 +7427,11 @@ public final class PowerManagerService extends SystemService public boolean isAmbientDisplaySuppressed() { public boolean isAmbientDisplaySuppressed() { return mAmbientDisplaySuppressionController.isSuppressed(); return mAmbientDisplaySuppressionController.isSuppressed(); } } @Override public void setDevicePostured(boolean isPostured) { setDevicePosturedInternal(isPostured); } } } /** /** Loading services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +51 −2 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.service.dreams.Flags.FLAG_ALLOW_DREAM_WHEN_POSTURED; import static com.android.server.deviceidle.Flags.FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE; import static com.android.server.deviceidle.Flags.FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE; Loading Loading @@ -81,8 +82,8 @@ import android.os.BatterySaverPolicyConfig; import android.os.Binder; import android.os.Binder; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.IWakeLockCallback; import android.os.IScreenTimeoutPolicyListener; import android.os.IScreenTimeoutPolicyListener; import android.os.IWakeLockCallback; import android.os.Looper; import android.os.Looper; import android.os.PowerManager; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.PowerManagerInternal; Loading Loading @@ -120,8 +121,8 @@ import com.android.server.power.PowerManagerService.WakeLock; import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverStateMachine; import com.android.server.power.batterysaver.BatterySaverStateMachine; import com.android.server.power.feature.flags.Flags; import com.android.server.power.feature.PowerManagerFlags; import com.android.server.power.feature.PowerManagerFlags; import com.android.server.power.feature.flags.Flags; import com.android.server.testutils.OffsettableClock; import com.android.server.testutils.OffsettableClock; import com.google.testing.junit.testparameterinjector.TestParameter; import com.google.testing.junit.testparameterinjector.TestParameter; Loading Loading @@ -279,6 +280,8 @@ public class PowerManagerServiceTest { Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 0); Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 0); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 0); mClock = new OffsettableClock.Stopped(); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); mTestLooper = new TestLooper(mClock::now); Loading Loading @@ -1215,6 +1218,52 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); } } @EnableFlags(FLAG_ALLOW_DREAM_WHEN_POSTURED) @Test public void testDreamActivateWhilePosturedEnabled_postured_afterTimeout_goesToDreaming() { when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 1); doAnswer(inv -> { when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); return null; }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString()); setMinimumScreenOffTimeoutConfig(5); createService(); startSystem(); mService.getLocalServiceInstance().setDevicePostured(true); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); advanceTime(15000); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); } @EnableFlags(FLAG_ALLOW_DREAM_WHEN_POSTURED) @Test public void testDreamActivateWhilePosturedEnabled_notPostured_afterTimeout_goesToDozing() { when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 1); doAnswer(inv -> { when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); return null; }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString()); setMinimumScreenOffTimeoutConfig(5); createService(); startSystem(); mService.getLocalServiceInstance().setDevicePostured(false); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); advanceTime(15000); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); } @EnableFlags(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) @EnableFlags(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) @SuppressWarnings("GuardedBy") @SuppressWarnings("GuardedBy") @Test @Test Loading Loading
core/java/android/os/PowerManagerInternal.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -351,4 +351,10 @@ public abstract class PowerManagerInternal { * return false if ambient display is not available. * return false if ambient display is not available. */ */ public abstract boolean isAmbientDisplaySuppressed(); public abstract boolean isAmbientDisplaySuppressed(); /** * Notifies PowerManager that the device has entered a postured state (stationary + upright). * This may affect dream eligibility. */ public abstract void setDevicePostured(boolean isPostured); } }
services/core/java/com/android/server/power/PowerManagerService.java +46 −2 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.isInteractive; import static android.os.PowerManagerInternal.isInteractive; import static android.os.PowerManagerInternal.wakefulnessToString; import static android.os.PowerManagerInternal.wakefulnessToString; import static android.service.dreams.Flags.allowDreamWhenPostured; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle; import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle; Loading Loading @@ -216,6 +217,8 @@ public final class PowerManagerService extends SystemService private static final int DIRTY_ATTENTIVE = 1 << 14; private static final int DIRTY_ATTENTIVE = 1 << 14; // Dirty bit: display group wakefulness has changed // Dirty bit: display group wakefulness has changed private static final int DIRTY_DISPLAY_GROUP_WAKEFULNESS = 1 << 16; private static final int DIRTY_DISPLAY_GROUP_WAKEFULNESS = 1 << 16; // Dirty bit: device postured state has changed private static final int DIRTY_POSTURED_STATE = 1 << 17; // Summarizes the state of all active wakelocks. // Summarizes the state of all active wakelocks. static final int WAKE_LOCK_CPU = 1 << 0; static final int WAKE_LOCK_CPU = 1 << 0; Loading Loading @@ -500,6 +503,11 @@ public final class PowerManagerService extends SystemService // The current dock state. // The current dock state. private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; /** * Whether the device is upright and stationary. */ private boolean mDevicePostured; // True to decouple auto-suspend mode from the display state. // True to decouple auto-suspend mode from the display state. private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig; private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig; Loading Loading @@ -530,6 +538,9 @@ public final class PowerManagerService extends SystemService // Default value for dreams activate-on-dock // Default value for dreams activate-on-dock private boolean mDreamsActivatedOnDockByDefaultConfig; private boolean mDreamsActivatedOnDockByDefaultConfig; /** Default value for whether dreams are activated when postured (stationary + upright) */ private boolean mDreamsActivatedWhilePosturedByDefaultConfig; // True if dreams can run while not plugged in. // True if dreams can run while not plugged in. private boolean mDreamsEnabledOnBatteryConfig; private boolean mDreamsEnabledOnBatteryConfig; Loading Loading @@ -558,6 +569,9 @@ public final class PowerManagerService extends SystemService // True if dreams should be activated on dock. // True if dreams should be activated on dock. private boolean mDreamsActivateOnDockSetting; private boolean mDreamsActivateOnDockSetting; /** Whether dreams should be activated when device is postured (stationary and upright) */ private boolean mDreamsActivateWhilePosturedSetting; // True if doze should not be started until after the screen off transition. // True if doze should not be started until after the screen off transition. private boolean mDozeAfterScreenOff; private boolean mDozeAfterScreenOff; Loading Loading @@ -1471,6 +1485,9 @@ public final class PowerManagerService extends SystemService resolver.registerContentObserver(Settings.Secure.getUriFor( resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), false, mSettingsObserver, UserHandle.USER_ALL); false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED), false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), Settings.System.SCREEN_OFF_TIMEOUT), false, mSettingsObserver, UserHandle.USER_ALL); false, mSettingsObserver, UserHandle.USER_ALL); Loading Loading @@ -1549,6 +1566,8 @@ public final class PowerManagerService extends SystemService com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); mDreamsActivatedWhilePosturedByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault); mDreamsEnabledOnBatteryConfig = resources.getBoolean( mDreamsEnabledOnBatteryConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsEnabledOnBattery); com.android.internal.R.bool.config_dreamsEnabledOnBattery); mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( Loading Loading @@ -1589,6 +1608,10 @@ public final class PowerManagerService extends SystemService Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); UserHandle.USER_CURRENT) != 0); mDreamsActivateWhilePosturedSetting = (Settings.Secure.getIntForUser(resolver, Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, mDreamsActivatedWhilePosturedByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT); UserHandle.USER_CURRENT); Loading Loading @@ -3336,7 +3359,7 @@ public final class PowerManagerService extends SystemService if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST)) == 0) { | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_POSTURED_STATE)) == 0) { return changed; return changed; } } final long time = mClock.uptimeMillis(); final long time = mClock.uptimeMillis(); Loading Loading @@ -3375,7 +3398,8 @@ public final class PowerManagerService extends SystemService private boolean shouldNapAtBedTimeLocked() { private boolean shouldNapAtBedTimeLocked() { return mDreamsActivateOnSleepSetting return mDreamsActivateOnSleepSetting || (mDreamsActivateOnDockSetting || (mDreamsActivateOnDockSetting && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED); && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) || (mDreamsActivateWhilePosturedSetting && mDevicePostured); } } /** /** Loading Loading @@ -4489,6 +4513,17 @@ public final class PowerManagerService extends SystemService } } } } private void setDevicePosturedInternal(boolean isPostured) { if (!allowDreamWhenPostured()) { return; } synchronized (mLock) { mDevicePostured = isPostured; mDirty |= DIRTY_POSTURED_STATE; updatePowerStateLocked(); } } private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { synchronized (mLock) { synchronized (mLock) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { Loading Loading @@ -4794,6 +4829,8 @@ public final class PowerManagerService extends SystemService + mDreamsActivatedOnSleepByDefaultConfig); + mDreamsActivatedOnSleepByDefaultConfig); pw.println(" mDreamsActivatedOnDockByDefaultConfig=" pw.println(" mDreamsActivatedOnDockByDefaultConfig=" + mDreamsActivatedOnDockByDefaultConfig); + mDreamsActivatedOnDockByDefaultConfig); pw.println(" mDreamsActivatedWhilePosturedByDefaultConfig=" + mDreamsActivatedWhilePosturedByDefaultConfig); pw.println(" mDreamsEnabledOnBatteryConfig=" pw.println(" mDreamsEnabledOnBatteryConfig=" + mDreamsEnabledOnBatteryConfig); + mDreamsEnabledOnBatteryConfig); pw.println(" mDreamsBatteryLevelMinimumWhenPoweredConfig=" pw.println(" mDreamsBatteryLevelMinimumWhenPoweredConfig=" Loading @@ -4805,6 +4842,8 @@ public final class PowerManagerService extends SystemService pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting); pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting); pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting); pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting); pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting); pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting); pw.println(" mDreamsActivateWhilePosturedSetting=" + mDreamsActivateWhilePosturedSetting); pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff); pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff); pw.println(" mBrightWhenDozingConfig=" + mBrightWhenDozingConfig); pw.println(" mBrightWhenDozingConfig=" + mBrightWhenDozingConfig); pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig); pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig); Loading Loading @@ -7388,6 +7427,11 @@ public final class PowerManagerService extends SystemService public boolean isAmbientDisplaySuppressed() { public boolean isAmbientDisplaySuppressed() { return mAmbientDisplaySuppressionController.isSuppressed(); return mAmbientDisplaySuppressionController.isSuppressed(); } } @Override public void setDevicePostured(boolean isPostured) { setDevicePosturedInternal(isPostured); } } } /** /** Loading
services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +51 −2 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static android.service.dreams.Flags.FLAG_ALLOW_DREAM_WHEN_POSTURED; import static com.android.server.deviceidle.Flags.FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE; import static com.android.server.deviceidle.Flags.FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE; Loading Loading @@ -81,8 +82,8 @@ import android.os.BatterySaverPolicyConfig; import android.os.Binder; import android.os.Binder; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.IWakeLockCallback; import android.os.IScreenTimeoutPolicyListener; import android.os.IScreenTimeoutPolicyListener; import android.os.IWakeLockCallback; import android.os.Looper; import android.os.Looper; import android.os.PowerManager; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.PowerManagerInternal; Loading Loading @@ -120,8 +121,8 @@ import com.android.server.power.PowerManagerService.WakeLock; import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverStateMachine; import com.android.server.power.batterysaver.BatterySaverStateMachine; import com.android.server.power.feature.flags.Flags; import com.android.server.power.feature.PowerManagerFlags; import com.android.server.power.feature.PowerManagerFlags; import com.android.server.power.feature.flags.Flags; import com.android.server.testutils.OffsettableClock; import com.android.server.testutils.OffsettableClock; import com.google.testing.junit.testparameterinjector.TestParameter; import com.google.testing.junit.testparameterinjector.TestParameter; Loading Loading @@ -279,6 +280,8 @@ public class PowerManagerServiceTest { Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 0); Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 0); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 0); mClock = new OffsettableClock.Stopped(); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); mTestLooper = new TestLooper(mClock::now); Loading Loading @@ -1215,6 +1218,52 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); } } @EnableFlags(FLAG_ALLOW_DREAM_WHEN_POSTURED) @Test public void testDreamActivateWhilePosturedEnabled_postured_afterTimeout_goesToDreaming() { when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 1); doAnswer(inv -> { when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); return null; }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString()); setMinimumScreenOffTimeoutConfig(5); createService(); startSystem(); mService.getLocalServiceInstance().setDevicePostured(true); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); advanceTime(15000); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING); } @EnableFlags(FLAG_ALLOW_DREAM_WHEN_POSTURED) @Test public void testDreamActivateWhilePosturedEnabled_notPostured_afterTimeout_goesToDozing() { when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true); Settings.Secure.putInt(mContextSpy.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED, 1); doAnswer(inv -> { when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); return null; }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString()); setMinimumScreenOffTimeoutConfig(5); createService(); startSystem(); mService.getLocalServiceInstance().setDevicePostured(false); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); advanceTime(15000); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); } @EnableFlags(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) @EnableFlags(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) @SuppressWarnings("GuardedBy") @SuppressWarnings("GuardedBy") @Test @Test Loading