From d5105dddbe983794ee8709b5cd6ad07a9a7fe095 Mon Sep 17 00:00:00 2001 From: Julius D'souza Date: Fri, 2 Jun 2017 11:03:53 -0700 Subject: Add state machine model for skipping initial brightness ramps. Bug: 36092576, 62293899 Change-Id: I7fbcd6989b938f0bc8d369c263116e9d374ff0ee --- core/res/res/values/config.xml | 5 +++ core/res/res/values/symbols.xml | 1 + .../server/display/DisplayPowerController.java | 45 +++++++++++++++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8e6c40294e2c..ec0b0493c8d3 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1099,6 +1099,11 @@ that can be set by the user. --> 1 + + false + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 8d2666e7c648..04c5f91359bd 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1755,6 +1755,7 @@ + diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 9dc317ad38ac..e82724db27f7 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -104,6 +104,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Trigger proximity if distance is less than 5 cm. private static final float TYPICAL_PROXIMITY_THRESHOLD = 5.0f; + // State machine constants for tracking initial brightness ramp skipping when enabled. + private static final int RAMP_STATE_SKIP_NONE = 0; + private static final int RAMP_STATE_SKIP_INITIAL = 1; + private static final int RAMP_STATE_SKIP_AUTOBRIGHT = 2; + private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0; private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1; private static final int REPORTED_TO_POLICY_SCREEN_ON = 2; @@ -239,6 +244,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields. private int mReportedScreenStateToPolicy; + // If the last recorded screen state was dozing or not. + private boolean mDozing; + // Remembers whether certain kinds of brightness adjustments // were recently applied so that we can decide how to transition. private boolean mAppliedAutoBrightness; @@ -249,6 +257,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private final int mBrightnessRampRateFast; private final int mBrightnessRampRateSlow; + // Whether or not to skip the initial brightness ramps into STATE_ON. + private final boolean mSkipScreenOnBrightnessRamp; + + // A record of state for skipping brightness ramps. + private int mSkipRampState = RAMP_STATE_SKIP_NONE; + + // The first autobrightness value set when entering RAMP_STATE_SKIP_INITIAL. + private int mInitialAutoBrightness; + // The controller for the automatic brightness level. private AutomaticBrightnessController mAutomaticBrightnessController; @@ -312,6 +329,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call com.android.internal.R.integer.config_brightness_ramp_rate_fast); mBrightnessRampRateSlow = resources.getInteger( com.android.internal.R.integer.config_brightness_ramp_rate_slow); + mSkipScreenOnBrightnessRamp = resources.getBoolean( + com.android.internal.R.bool.config_skipScreenOnBrightnessRamp); int lightSensorRate = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); @@ -731,8 +750,29 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Animate the screen brightness when the screen is on or dozing. // Skip the animation when the screen is off or suspended or transition to/from VR. if (!mPendingScreenOff) { + if (mSkipScreenOnBrightnessRamp) { + + if (state == Display.STATE_ON) { + if (mSkipRampState == RAMP_STATE_SKIP_NONE && mDozing) { + mInitialAutoBrightness = brightness; + mSkipRampState = RAMP_STATE_SKIP_INITIAL; + } else if (mSkipRampState == RAMP_STATE_SKIP_INITIAL + && mUseSoftwareAutoBrightnessConfig + && brightness != mInitialAutoBrightness) { + mSkipRampState = RAMP_STATE_SKIP_AUTOBRIGHT; + } else if (mSkipRampState == RAMP_STATE_SKIP_AUTOBRIGHT) { + mSkipRampState = RAMP_STATE_SKIP_NONE; + } + } else { + mSkipRampState = RAMP_STATE_SKIP_NONE; + } + } + boolean wasOrWillBeInVr = (state == Display.STATE_VR || oldState == Display.STATE_VR); - if ((state == Display.STATE_ON || state == Display.STATE_DOZE) && !wasOrWillBeInVr) { + if ((state == Display.STATE_ON + && mSkipRampState == RAMP_STATE_SKIP_NONE + || state == Display.STATE_DOZE) + && !wasOrWillBeInVr) { animateScreenBrightness(brightness, slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast); } else { @@ -790,6 +830,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mUnfinishedBusiness = false; mCallbacks.releaseSuspendBlocker(); } + + // Record if dozing for future comparison. + mDozing = state != Display.STATE_ON; } @Override -- cgit v1.2.3-59-g8ed1b