Merge "Add support for dozing after screen off." into lmp-dev

This commit is contained in:
Jeff Brown
2014-09-13 00:53:03 +00:00
committed by Android (Google) Code Review
7 changed files with 48 additions and 49 deletions

View File

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

View File

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

View File

@@ -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" />

View File

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

View File

@@ -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();
}

View File

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

View File

@@ -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: Send notifications, if needed.
// Phase 3: Update dream state (depends on display ready signal).
updateDreamLocked(dirtyPhase2, displayBecameReady);
// 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);