Merge "Report the display is off when the hardware blanks itself." into oc-dr1-dev

am: bf9b1dbb66

Change-Id: I6b5a1eeb546e7cd1b15a20d670d65429bfda5c82
This commit is contained in:
Michael Wright
2017-07-27 17:12:26 +00:00
committed by android-build-merger
5 changed files with 52 additions and 42 deletions

View File

@@ -1863,9 +1863,8 @@
states. -->
<bool name="config_dozeAlwaysOnDisplayAvailable">false</bool>
<!-- Whether the display hardware requires we go to the off state before transitioning
out of any doze states. -->
<bool name="config_displayTransitionOffAfterDoze">false</bool>
<!-- Whether the display blanks itself when transitioning from a doze to a non-doze state -->
<bool name="config_displayBlanksAfterDoze">false</bool>
<!-- Power Management: Specifies whether to decouple the auto-suspend state of the

View File

@@ -3049,7 +3049,7 @@
<java-symbol type="bool" name="config_handleVolumeKeysInWindowManager" />
<java-symbol type="integer" name="config_inCallNotificationVolumeRelative" />
<java-symbol type="bool" name="config_dozeAlwaysOnDisplayAvailable" />
<java-symbol type="bool" name="config_displayTransitionOffAfterDoze" />
<java-symbol type="bool" name="config_displayBlanksAfterDoze" />
<java-symbol type="integer" name="config_storageManagerDaystoRetainDefault" />
<java-symbol type="string" name="config_headlineFontFamily" />
<java-symbol type="string" name="config_headlineFontFamilyLight" />

View File

@@ -165,11 +165,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// a stylish color fade animation instead.
private boolean mColorFadeFadesConfig;
// True if we need to transition to the off state when coming out of a doze state.
// Some display hardware will show artifacts (flickers, etc) when transitioning from a doze
// to a fully on state. In order to hide these, we first transition to off to let the system
// animate the screen on as it normally would, which is a much smoother experience.
private boolean mTransitionOffAfterDozeConfig;
// True if we need to fake a transition to off when coming out of a doze state.
// Some display hardware will blank itself when coming out of doze in order to hide
// artifacts. For these displays we fake a transition into OFF so that policy can appropriately
// blank itself and begin an appropriate power on animation.
private boolean mDisplayBlanksAfterDozeConfig;
// The pending power request.
// Initially null until the first call to requestPowerState.
@@ -416,8 +416,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mColorFadeFadesConfig = resources.getBoolean(
com.android.internal.R.bool.config_animateScreenLights);
mTransitionOffAfterDozeConfig = resources.getBoolean(
com.android.internal.R.bool.config_displayTransitionOffAfterDoze);
mDisplayBlanksAfterDozeConfig = resources.getBoolean(
com.android.internal.R.bool.config_displayBlanksAfterDoze);
if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
@@ -803,7 +803,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Notify policy about screen turned on.
if (ready && state != Display.STATE_OFF
&& mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_ON;
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_ON);
mWindowManagerPolicy.screenTurnedOn();
}
@@ -886,10 +886,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
private boolean setScreenState(int state) {
return setScreenState(state, false /*force*/);
return setScreenState(state, false /*reportOnly*/);
}
private boolean setScreenState(int state, boolean force) {
private boolean setScreenState(int state, boolean reportOnly) {
final boolean isOff = (state == Display.STATE_OFF);
if (mPowerState.getScreenState() != state) {
@@ -897,32 +897,24 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// actually turn the screen off.
if (isOff && !mScreenOffBecauseOfProximity) {
if (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_ON) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_OFF;
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_OFF);
blockScreenOff();
mWindowManagerPolicy.screenTurningOff(mPendingScreenOffUnblocker);
if (force) {
// If we're forcing the power state transition then immediately
// unblock the screen off event. This keeps the lifecycle consistent,
// so WindowManagerPolicy will always see screenTurningOff before
// screenTurnedOff, but we don't actually block on them for the state
// change.
unblockScreenOff();
} else {
return false;
}
unblockScreenOff();
} else if (mPendingScreenOffUnblocker != null) {
// Abort doing the state change until screen off is unblocked.
return false;
}
}
mPowerState.setScreenState(state);
// Tell battery stats about the transition.
try {
mBatteryStats.noteScreenState(state);
} catch (RemoteException ex) {
// same process
if (!reportOnly) {
mPowerState.setScreenState(state);
// Tell battery stats about the transition.
try {
mBatteryStats.noteScreenState(state);
} catch (RemoteException ex) {
// same process
}
}
}
@@ -934,7 +926,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// finished drawing underneath.
if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF
&& !mScreenOffBecauseOfProximity) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF;
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
unblockScreenOn();
mWindowManagerPolicy.screenTurnedOff();
} else if (!isOff
@@ -944,10 +936,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Complete the full state transition on -> turningOff -> off.
unblockScreenOff();
mWindowManagerPolicy.screenTurnedOff();
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF;
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
}
if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_ON;
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_ON);
if (mPowerState.getColorFadeLevel() == 0.0f) {
blockScreenOn();
} else {
@@ -960,6 +952,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
return mPendingScreenOnUnblocker == null;
}
private void setReportedScreenState(int state) {
Trace.traceCounter(Trace.TRACE_TAG_POWER, "ReportedScreenStateToPolicy", state);
mReportedScreenStateToPolicy = state;
}
private int clampScreenBrightness(int value) {
return MathUtils.constrain(
value, mScreenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum);
@@ -989,15 +986,20 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mPendingScreenOff = false;
}
if (mTransitionOffAfterDozeConfig &&
Display.isDozeState(mPowerState.getScreenState())
if (mDisplayBlanksAfterDozeConfig
&& Display.isDozeState(mPowerState.getScreenState())
&& !Display.isDozeState(target)) {
setScreenState(Display.STATE_OFF, true /*force*/);
// Skip the screen off animation and add a black surface to hide the
// contents of the screen. This will also trigger another power state update so that we
// end up converging on the target state.
// contents of the screen.
mPowerState.prepareColorFade(mContext,
mColorFadeFadesConfig ? ColorFade.MODE_FADE : ColorFade.MODE_WARM_UP);
mColorFadeOffAnimator.end();
return;
// Some display hardware will blank itself on the transition between doze and non-doze
// but still on display states. In this case we want to report to policy that the
// display has turned off so it can prepare the appropriate power on animation, but we
// don't want to actually transition to the fully off state since that takes
// significantly longer to transition from.
setScreenState(Display.STATE_OFF, target != Display.STATE_OFF /*reportOnly*/);
}
// If we were in the process of turning off the screen but didn't quite
@@ -1295,7 +1297,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
pw.println(" mAppliedLowPower=" + mAppliedLowPower);
pw.println(" mPendingScreenOnUnblocker=" + mPendingScreenOnUnblocker);
pw.println(" mPendingScreenOff=" + mPendingScreenOff);
pw.println(" mReportedToPolicy=" + reportedToPolicyToString(mReportedScreenStateToPolicy));
pw.println(" mReportedToPolicy=" +
reportedToPolicyToString(mReportedScreenStateToPolicy));
pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" +
mScreenBrightnessRampAnimator.isAnimating());

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.Trace;
import android.util.FloatProperty;
import android.util.IntProperty;
import android.util.Slog;
@@ -49,6 +50,7 @@ final class DisplayPowerState {
private static final String TAG = "DisplayPowerState";
private static boolean DEBUG = false;
private static String COUNTER_COLOR_FADE = "ColorFadeLevel";
private final Handler mHandler;
private final Choreographer mChoreographer;
@@ -190,6 +192,7 @@ final class DisplayPowerState {
* Dismisses the color fade surface.
*/
public void dismissColorFade() {
Trace.traceCounter(Trace.TRACE_TAG_POWER, COUNTER_COLOR_FADE, 100);
mColorFade.dismiss();
mColorFadePrepared = false;
mColorFadeReady = true;
@@ -328,6 +331,8 @@ final class DisplayPowerState {
if (mColorFadePrepared) {
mColorFade.draw(mColorFadeLevel);
Trace.traceCounter(Trace.TRACE_TAG_POWER,
COUNTER_COLOR_FADE, Math.round(mColorFadeLevel* 100));
}
mColorFadeReady = true;

View File

@@ -515,6 +515,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
try {
final int mode = getPowerModeForState(state);
SurfaceControl.setDisplayPowerMode(token, mode);
Trace.traceCounter(Trace.TRACE_TAG_POWER, "DisplayPowerMode", mode);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
@@ -530,6 +531,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
+ "id=" + displayId + ", brightness=" + brightness + ")");
try {
mBacklight.setBrightness(brightness);
Trace.traceCounter(Trace.TRACE_TAG_POWER,
"DisplayBrightness", brightness);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}