summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2014-09-12 16:11:07 -0700
committer Jeff Brown <jeffbrown@google.com> 2014-09-12 17:31:54 -0700
commit2175e9c366998ed7bd1a4501b94a02f4f49b932c (patch)
tree6f4dd75376b8a3d1ac4318bd92ea53addd2be878
parent2642357b8223b417019cf072e59257d2c65c3292 (diff)
Add support for dozing after screen off.
On some devices, we want the screen off transition to complete before we start dozing. Added a new config.xml attribute config_dozeAfterScreenOff to configure this behavior. Defer starting dreams until the display is ready. Fixed some minor issues in the system UI doze service when setting the display state. Bug: 16187655 Change-Id: Ib1bc60de5457166f4b4880732db5df989dda67a4
-rw-r--r--core/java/android/service/dreams/DreamService.java1
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeService.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java2
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java9
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java50
7 files changed, 48 insertions, 49 deletions
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 7e04ae87bb4b..92647f05190f 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -29,7 +29,6 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteException;
-import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Slog;
import android.view.ActionMode;
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7599bf47f7e9..0e4f965429de 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1281,6 +1281,10 @@
Doze dreams will run whenever the power manager is in a dozing state. -->
<string name="config_dozeComponent"></string>
+ <!-- If true, the doze component is not started until after the screen has been
+ turned off and the screen off animation has been performed. -->
+ <bool name="config_dozeAfterScreenOff">false</bool>
+
<!-- Power Management: Specifies whether to decouple the auto-suspend state of the
device from the display on/off state.
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index d69a0f216edb..e4ca36d6718d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1536,6 +1536,7 @@
<java-symbol type="bool" name="config_useAttentionLight" />
<java-symbol type="bool" name="config_animateScreenLights" />
<java-symbol type="bool" name="config_automatic_brightness_available" />
+ <java-symbol type="bool" name="config_dozeAfterScreenOff" />
<java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" />
<java-symbol type="bool" name="config_enableHardwareFlpOverlay" />
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index f411e62ab12b..0aa7f3525e0a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -121,7 +121,7 @@ public class DozeService extends DreamService {
new Intent(NOTIFICATION_PULSE_ACTION).setPackage(getPackageName()),
PendingIntent.FLAG_UPDATE_CURRENT);
mDisplayStateWhenOn = mDisplayStateSupported ? Display.STATE_DOZE : Display.STATE_ON;
- setDozeScreenState(mDisplayStateWhenOn);
+ mDisplayOff.run();
}
@Override
@@ -160,16 +160,6 @@ public class DozeService extends DreamService {
mHandler.postDelayed(mDisplayOff, millis);
}
- public void startDozing() {
- if (DEBUG) Log.d(mTag, "startDozing mDreaming=" + mDreaming);
- if (!mDreaming) {
- Log.w(mTag, "Not dozing, no longer dreaming");
- return;
- }
-
- super.startDozing();
- }
-
@Override
public void onDreamingStopped() {
if (DEBUG) Log.d(mTag, "onDreamingStopped isDozing=" + isDozing());
@@ -180,24 +170,8 @@ public class DozeService extends DreamService {
mWakeLock.release();
}
listenForPulseSignals(false);
- stopDozing();
- dozingStopped();
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (DEBUG) Log.d(mTag, "onDetachedFromWindow");
- super.onDetachedFromWindow();
-
- dozingStopped();
- }
-
- @Override
- public void onDestroy() {
- if (DEBUG) Log.d(mTag, "onDestroy");
- super.onDestroy();
-
dozingStopped();
+ mHandler.removeCallbacks(mDisplayOff);
}
private void requestDoze() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 3bdae474fecb..e6db2c8c2f66 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -4079,7 +4079,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
@Override
public void requestDoze(DozeService dozeService) {
if (dozeService == null) return;
- dozeService.stayAwake(PROCESSING_TIME);
mHandler.obtainMessage(H.REQUEST_DOZE, dozeService).sendToTarget();
}
@@ -4094,7 +4093,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
@Override
public void dozingStopped(DozeService dozeService) {
if (dozeService == null) return;
- dozeService.stayAwake(PROCESSING_TIME);
mHandler.obtainMessage(H.DOZING_STOPPED, dozeService).sendToTarget();
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 8c342dd8954e..b4009ca462fa 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -497,9 +497,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// We might override this below based on other factors.
int state;
int brightness = PowerManager.BRIGHTNESS_DEFAULT;
+ boolean performScreenOffTransition = false;
switch (mPowerRequest.policy) {
case DisplayPowerRequest.POLICY_OFF:
state = Display.STATE_OFF;
+ performScreenOffTransition = true;
break;
case DisplayPowerRequest.POLICY_DOZE:
if (mPowerRequest.dozeScreenState != Display.STATE_UNKNOWN) {
@@ -515,6 +517,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
state = Display.STATE_ON;
break;
}
+ assert(state != Display.STATE_UNKNOWN);
// Apply the proximity sensor.
if (mProximitySensor != null) {
@@ -691,7 +694,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Wait for previous on animation to complete beforehand.
unblockScreenOn();
if (!mColorFadeOnAnimator.isStarted()) {
- if (mPowerRequest.policy == DisplayPowerRequest.POLICY_OFF) {
+ if (performScreenOffTransition) {
// Perform screen off animation.
if (!mColorFadeOffAnimator.isStarted()) {
if (mPowerState.getColorFadeLevel() == 0.0f) {
@@ -934,8 +937,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
pw.println(" mScreenBrightnessDarkConfig=" + mScreenBrightnessDarkConfig);
pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum);
pw.println(" mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum);
- pw.println(" mUseSoftwareAutoBrightnessConfig="
- + mUseSoftwareAutoBrightnessConfig);
+ pw.println(" mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig);
+ pw.println(" mColorFadeFadesConfig=" + mColorFadeFadesConfig);
mHandler.runWithScissors(new Runnable() {
@Override
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 0a4b3bcc593e..eeebe044b8d4 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -20,8 +20,8 @@ import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BackgroundThread;
import com.android.server.EventLogTags;
-import com.android.server.LocalServices;
import com.android.server.ServiceThread;
+import com.android.server.SystemService;
import com.android.server.am.BatteryStatsService;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
@@ -55,7 +55,6 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.os.SystemService;
import android.os.Trace;
import android.os.UserHandle;
import android.os.WorkSource;
@@ -78,7 +77,7 @@ import libcore.util.Objects;
* The power manager service is responsible for coordinating power management
* functions on the device.
*/
-public final class PowerManagerService extends com.android.server.SystemService
+public final class PowerManagerService extends SystemService
implements Watchdog.Monitor {
private static final String TAG = "PowerManagerService";
@@ -329,6 +328,9 @@ public final class PowerManagerService extends com.android.server.SystemService
// True if dreams should be activated on dock.
private boolean mDreamsActivateOnDockSetting;
+ // True if doze should not be started until after the screen off transition.
+ private boolean mDozeAfterScreenOffConfig;
+
// The minimum screen off timeout, in milliseconds.
private int mMinimumScreenOffTimeoutConfig;
@@ -603,6 +605,8 @@ public final class PowerManagerService extends com.android.server.SystemService
com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered);
mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger(
com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff);
+ mDozeAfterScreenOffConfig = resources.getBoolean(
+ com.android.internal.R.bool.config_dozeAfterScreenOff);
mMinimumScreenOffTimeoutConfig = resources.getInteger(
com.android.internal.R.integer.config_minimumScreenOffTimeout);
mMaximumScreenDimDurationConfig = resources.getInteger(
@@ -1242,16 +1246,18 @@ public final class PowerManagerService extends com.android.server.SystemService
}
}
- // Phase 2: Update dreams and display power state.
- updateDreamLocked(dirtyPhase2);
- updateDisplayPowerStateLocked(dirtyPhase2);
+ // Phase 2: Update display power state.
+ boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
+
+ // Phase 3: Update dream state (depends on display ready signal).
+ updateDreamLocked(dirtyPhase2, displayBecameReady);
- // Phase 3: Send notifications, if needed.
+ // Phase 4: Send notifications, if needed.
if (mDisplayReady) {
finishInteractiveStateChangeLocked();
}
- // Phase 4: Update suspend blocker.
+ // Phase 5: Update suspend blocker.
// Because we might release the last suspend blocker here, we need to make sure
// we finished everything else first!
updateSuspendBlockerLocked();
@@ -1603,7 +1609,7 @@ public final class PowerManagerService extends com.android.server.SystemService
/**
* Determines whether to post a message to the sandman to update the dream state.
*/
- private void updateDreamLocked(int dirty) {
+ private void updateDreamLocked(int dirty, boolean displayBecameReady) {
if ((dirty & (DIRTY_WAKEFULNESS
| DIRTY_USER_ACTIVITY
| DIRTY_WAKE_LOCKS
@@ -1612,8 +1618,10 @@ public final class PowerManagerService extends com.android.server.SystemService
| DIRTY_IS_POWERED
| DIRTY_STAY_ON
| DIRTY_PROXIMITY_POSITIVE
- | DIRTY_BATTERY_STATE)) != 0) {
- scheduleSandmanLocked();
+ | DIRTY_BATTERY_STATE)) != 0 || displayBecameReady) {
+ if (mDisplayReady) {
+ scheduleSandmanLocked();
+ }
}
}
@@ -1640,7 +1648,7 @@ public final class PowerManagerService extends com.android.server.SystemService
synchronized (mLock) {
mSandmanScheduled = false;
wakefulness = mWakefulness;
- if (mSandmanSummoned) {
+ if (mSandmanSummoned && mDisplayReady) {
startDreaming = ((wakefulness == WAKEFULNESS_DREAMING && canDreamLocked())
|| wakefulness == WAKEFULNESS_DOZING);
mSandmanSummoned = false;
@@ -1772,8 +1780,11 @@ public final class PowerManagerService extends com.android.server.SystemService
* has been updated so we come back here to double-check and finish up.
*
* This function recalculates the display power state each time.
+ *
+ * @return True if the display became ready.
*/
- private void updateDisplayPowerStateLocked(int dirty) {
+ private boolean updateDisplayPowerStateLocked(int dirty) {
+ final boolean oldDisplayReady = mDisplayReady;
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
| DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) {
@@ -1839,6 +1850,7 @@ public final class PowerManagerService extends com.android.server.SystemService
+ ", mBootCompleted=" + mBootCompleted);
}
}
+ return mDisplayReady && !oldDisplayReady;
}
private static boolean isValidBrightness(int value) {
@@ -1855,8 +1867,15 @@ public final class PowerManagerService extends com.android.server.SystemService
return DisplayPowerRequest.POLICY_OFF;
}
- if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
- return DisplayPowerRequest.POLICY_DOZE;
+ if (mWakefulness == WAKEFULNESS_DOZING) {
+ if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
+ return DisplayPowerRequest.POLICY_DOZE;
+ }
+ if (mDozeAfterScreenOffConfig) {
+ return DisplayPowerRequest.POLICY_OFF;
+ }
+ // Fall through and preserve the current screen policy if not configured to
+ // doze after screen off. This causes the screen off transition to be skipped.
}
if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
@@ -2326,6 +2345,7 @@ public final class PowerManagerService extends com.android.server.SystemService
pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting);
pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting);
pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);
+ pw.println(" mDozeAfterScreenOffConfig=" + mDozeAfterScreenOffConfig);
pw.println(" mLowPowerModeSetting=" + mLowPowerModeSetting);
pw.println(" mAutoLowPowerModeEnabled=" + mAutoLowPowerModeEnabled);
pw.println(" mAutoLowPowerModeSnoozing=" + mAutoLowPowerModeSnoozing);