diff options
| author | 2014-09-20 01:08:51 +0000 | |
|---|---|---|
| committer | 2014-09-20 01:08:52 +0000 | |
| commit | 1ecada8582e03311b64c53b229a1eeb298464f12 (patch) | |
| tree | d9bbff25bcf8d37bcded5ee45941a10f1e8337a7 | |
| parent | 4c45b649c36d6c28d22a98d979fbda3b7c36677a (diff) | |
| parent | 606e4e8c98304daf756f7e89d47005573288f72a (diff) | |
Merge "Ensure that the screen on blocker is applied while dozing." into lmp-dev
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayPowerController.java | 187 |
1 files changed, 95 insertions, 92 deletions
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index b4009ca462fa..67d97766df32 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -349,8 +349,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call * was turned off by the proximity sensor. * @return True if display is ready, false if there are important changes that must * be made asynchronously (such as turning the screen on), in which case the caller - * should grab a wake lock, watch for {@link Callbacks#onStateChanged()} then try - * the request again later until the state converges. + * should grab a wake lock, watch for {@link DisplayPowerCallbacks#onStateChanged()} + * then try the request again later until the state converges. */ public boolean requestPowerState(DisplayPowerRequest request, boolean waitForNegativeProximity) { @@ -628,97 +628,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call ? BRIGHTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST); } - // Animate the screen on or off unless blocked. - if (state == Display.STATE_ON) { - // Want screen on. - // Wait for previous off animation to complete beforehand. - // It is relatively short but if we cancel it and switch to the - // on animation immediately then the results are pretty ugly. - if (!mColorFadeOffAnimator.isStarted()) { - // Turn the screen on. The contents of the screen may not yet - // be visible if the electron beam has not been dismissed because - // its last frame of animation is solid black. - setScreenState(Display.STATE_ON); - if (mPowerRequest.blockScreenOn - && mPowerState.getColorFadeLevel() == 0.0f) { - blockScreenOn(); - } else { - unblockScreenOn(); - if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) { - // Perform screen on animation. - if (!mColorFadeOnAnimator.isStarted()) { - if (mPowerState.getColorFadeLevel() == 1.0f) { - mPowerState.dismissColorFade(); - } else if (mPowerState.prepareColorFade(mContext, - mColorFadeFadesConfig ? - ColorFade.MODE_FADE : - ColorFade.MODE_WARM_UP)) { - mColorFadeOnAnimator.start(); - } else { - mColorFadeOnAnimator.end(); - } - } - } else { - // Skip screen on animation. - mPowerState.setColorFadeLevel(1.0f); - mPowerState.dismissColorFade(); - } - } - } - } else if (state == Display.STATE_DOZE) { - // Want screen dozing. - // Wait for brightness animation to complete beforehand when entering doze - // from screen on. - unblockScreenOn(); - if (!mScreenBrightnessRampAnimator.isAnimating() - || mPowerState.getScreenState() != Display.STATE_ON) { - // Set screen state and dismiss the black surface without fanfare. - setScreenState(state); - mPowerState.setColorFadeLevel(1.0f); - mPowerState.dismissColorFade(); - } - } else if (state == Display.STATE_DOZE_SUSPEND) { - // Want screen dozing and suspended. - // Wait for brightness animation to complete beforehand unless already - // suspended because we may not be able to change it after suspension. - unblockScreenOn(); - if (!mScreenBrightnessRampAnimator.isAnimating() - || mPowerState.getScreenState() == Display.STATE_DOZE_SUSPEND) { - // Set screen state and dismiss the black surface without fanfare. - setScreenState(state); - mPowerState.setColorFadeLevel(1.0f); - mPowerState.dismissColorFade(); - } - } else { - // Want screen off. - // Wait for previous on animation to complete beforehand. - unblockScreenOn(); - if (!mColorFadeOnAnimator.isStarted()) { - if (performScreenOffTransition) { - // Perform screen off animation. - if (!mColorFadeOffAnimator.isStarted()) { - if (mPowerState.getColorFadeLevel() == 0.0f) { - setScreenState(Display.STATE_OFF); - } else if (mPowerState.prepareColorFade(mContext, - mColorFadeFadesConfig ? - ColorFade.MODE_FADE : - ColorFade.MODE_COOL_DOWN) - && mPowerState.getScreenState() != Display.STATE_OFF) { - mColorFadeOffAnimator.start(); - } else { - mColorFadeOffAnimator.end(); - } - } - } else { - // Skip screen off animation. - setScreenState(Display.STATE_OFF); - } - } - } + // Animate the screen state change unless already animating. + animateScreenStateChange(state, performScreenOffTransition); - // Report whether the display is ready for use. - // We mostly care about the screen state here, ignoring brightness changes - // which will be handled asynchronously. + // Report whether the display is ready for use and all changes have been applied. if (mustNotify && !mScreenOnWasBlocked && !mColorFadeOnAnimator.isStarted() @@ -787,6 +700,96 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } + private void animateScreenStateChange(int target, boolean performScreenOffTransition) { + // If there is already an animation in progress, don't interfere with it. + if (mColorFadeOnAnimator.isStarted() + || mColorFadeOffAnimator.isStarted()) { + return; + } + + // Temporarily block turning the screen on if requested and there is already a + // black surface covering the screen. + if (mPowerRequest.blockScreenOn + && mPowerState.getColorFadeLevel() == 0.0f + && target != Display.STATE_OFF) { + blockScreenOn(); + return; + } + + if (target == Display.STATE_ON) { + // Want screen on. The contents of the screen may not yet + // be visible if the electron beam has not been dismissed because + // its last frame of animation is solid black. + unblockScreenOn(); + setScreenState(Display.STATE_ON); + if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) { + // Perform screen on animation. + if (mPowerState.getColorFadeLevel() == 1.0f) { + mPowerState.dismissColorFade(); + } else if (mPowerState.prepareColorFade(mContext, + mColorFadeFadesConfig ? + ColorFade.MODE_FADE : + ColorFade.MODE_WARM_UP)) { + mColorFadeOnAnimator.start(); + } else { + mColorFadeOnAnimator.end(); + } + } else { + // Skip screen on animation. + mPowerState.setColorFadeLevel(1.0f); + mPowerState.dismissColorFade(); + } + } else if (target == Display.STATE_DOZE) { + // Want screen dozing. + // Wait for brightness animation to complete beforehand when entering doze + // from screen on to prevent a perceptible jump because brightness may operate + // differently when the display is configured for dozing. + if (mScreenBrightnessRampAnimator.isAnimating() + && mPowerState.getScreenState() == Display.STATE_ON) { + return; + } + + // Set screen state and dismiss the black surface without fanfare. + unblockScreenOn(); + setScreenState(Display.STATE_DOZE); + mPowerState.setColorFadeLevel(1.0f); + mPowerState.dismissColorFade(); + } else if (target == Display.STATE_DOZE_SUSPEND) { + // Want screen dozing and suspended. + // Wait for brightness animation to complete beforehand unless already + // suspended because we may not be able to change it after suspension. + if (mScreenBrightnessRampAnimator.isAnimating() + && mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) { + return; + } + + // Set screen state and dismiss the black surface without fanfare. + unblockScreenOn(); + setScreenState(Display.STATE_DOZE_SUSPEND); + mPowerState.setColorFadeLevel(1.0f); + mPowerState.dismissColorFade(); + } else { + // Want screen off. + unblockScreenOn(); + if (mPowerState.getColorFadeLevel() == 0.0f) { + // Turn the screen off. + // A black surface is already hiding the contents of the screen. + setScreenState(Display.STATE_OFF); + } else if (performScreenOffTransition + && mPowerState.prepareColorFade(mContext, + mColorFadeFadesConfig ? + ColorFade.MODE_FADE : ColorFade.MODE_COOL_DOWN) + && mPowerState.getScreenState() != Display.STATE_OFF) { + // Perform the screen off animation. + mColorFadeOffAnimator.start(); + } else { + // Skip the screen off animation and add a black surface to hide the + // contents of the screen. + mColorFadeOffAnimator.end(); + } + } + } + private final Runnable mCleanListener = new Runnable() { @Override public void run() { |