diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 279a9cc3675ac..47406a1d94572 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -544,6 +544,7 @@ final class DisplayPowerController { mScreenBrightnessRampAnimator = new RampAnimator( mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS); + mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener); // Initialize screen state for battery stats. try { @@ -570,6 +571,13 @@ final class DisplayPowerController { } }; + private final RampAnimator.Listener mRampAnimatorListener = new RampAnimator.Listener() { + @Override + public void onAnimationEnd() { + sendUpdatePowerState(); + } + }; + private void updatePowerState() { // Update the power state request. final boolean mustNotify; @@ -753,6 +761,7 @@ final class DisplayPowerController { && !mScreenOnWasBlocked && !mElectronBeamOnAnimator.isStarted() && !mElectronBeamOffAnimator.isStarted() + && !mScreenBrightnessRampAnimator.isAnimating() && mPowerState.waitUntilClean(mCleanListener)) { synchronized (mLock) { if (!mPendingRequestChangedLocked) { @@ -1290,6 +1299,9 @@ final class DisplayPowerController { pw.println(" mLastScreenAutoBrightnessGamma=" + mLastScreenAutoBrightnessGamma); pw.println(" mTwilight.getCurrentState()=" + mTwilight.getCurrentState()); + pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" + + mScreenBrightnessRampAnimator.isAnimating()); + if (mElectronBeamOnAnimator != null) { pw.println(" mElectronBeamOnAnimator.isStarted()=" + mElectronBeamOnAnimator.isStarted()); diff --git a/services/core/java/com/android/server/display/RampAnimator.java b/services/core/java/com/android/server/display/RampAnimator.java index 6688d6a9699f5..ad1e85717ab17 100644 --- a/services/core/java/com/android/server/display/RampAnimator.java +++ b/services/core/java/com/android/server/display/RampAnimator.java @@ -39,6 +39,8 @@ final class RampAnimator { private boolean mFirstTime = true; + private Listener mListener; + public RampAnimator(T object, IntProperty property) { mObject = object; mProperty = property; @@ -92,6 +94,20 @@ final class RampAnimator { return changed; } + /** + * Returns true if the animation is running. + */ + public boolean isAnimating() { + return mAnimating; + } + + /** + * Sets a listener to watch for animation events. + */ + public void setListener(Listener listener) { + mListener = listener; + } + private void postCallback() { mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, mCallback, null); } @@ -131,7 +147,14 @@ final class RampAnimator { postCallback(); } else { mAnimating = false; + if (mListener != null) { + mListener.onAnimationEnd(); + } } } }; + + public interface Listener { + void onAnimationEnd(); + } }