From 4c7e6900c8bfd57652fc1ceca724208ca7556196 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Thu, 27 Feb 2014 21:11:31 -0800 Subject: [PATCH] Make meaning of PowerManager.isScreenOn() more consistent. The power manager sends SCREEN_ON and SCREEN_OFF broadcasts purely based on the current wakefulness state. In particular, when the system is awake, we consider the screen to be on even if the screen may actually be off due to the proximity sensor or some other condition. Likewise when the system is dozing or asleep, we consider the screen to be off although technically it may still be on and dozing. This behavior is maintained for compatibility with applications that interpret screen on / off as an indicator of user presence. As it happened, the value of PowerManager.isScreenOn() did not always match the state indicated by the broadcasts under certain situations. Instead, it was based on the desired screen state. These states used to be closely correlated but the addition of doze mode causes them to diverge in meaning. One consequence is that wake events from input devices might not always wake the device from sleep unless the display's power state was actually DOZING or OFF even if the power manager's wakefulness was already DOZING or ASLEEP. This is now fixed. Change-Id: Ie819c6d2c5a9ffaaf3101c5dee93ff72e9bc9f30 --- .../server/power/PowerManagerService.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 9ffcc8cfba72a..c31de05e6f272 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1590,12 +1590,9 @@ public final class PowerManagerService extends com.android.server.SystemService | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED | DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) { final int newScreenState = getDesiredScreenPowerStateLocked(); - if (newScreenState != mDisplayPowerRequest.screenState) { - mDisplayPowerRequest.screenState = newScreenState; - nativeSetPowerState( - mDisplayPowerRequest.wantScreenOnNormal(), - newScreenState == DisplayPowerRequest.SCREEN_STATE_BRIGHT); - } + mDisplayPowerRequest.screenState = newScreenState; + nativeSetPowerState(isScreenOnLocked(), + newScreenState == DisplayPowerRequest.SCREEN_STATE_BRIGHT); int screenBrightness = mScreenBrightnessSettingDefault; float screenAutoBrightnessAdjustment = 0.0f; @@ -1805,11 +1802,15 @@ public final class PowerManagerService extends com.android.server.SystemService private boolean isScreenOnInternal() { synchronized (mLock) { - return !mSystemReady - || mDisplayPowerRequest.wantScreenOnNormal(); + return isScreenOnLocked(); } } + private boolean isScreenOnLocked() { + return mWakefulness == WAKEFULNESS_AWAKE + || mWakefulness == WAKEFULNESS_DREAMING; + } + private void handleBatteryStateChangedLocked() { mDirty |= DIRTY_BATTERY_STATE; updatePowerStateLocked();