Merge "Fix flickering when switching display power modes" into pi-dev

am: 5e0957aaed

Change-Id: If60109cfeb9f5e059b0bf1963eadd7b2e2c8748c
This commit is contained in:
Lucas Dupin
2018-03-27 01:25:38 +00:00
committed by android-build-merger
2 changed files with 15 additions and 11 deletions

View File

@@ -148,7 +148,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
private float mNotificationDensity; private float mNotificationDensity;
// Scrim blanking callbacks // Scrim blanking callbacks
private Choreographer.FrameCallback mPendingFrameCallback; private Runnable mPendingFrameCallback;
private Runnable mBlankingTransitionRunnable; private Runnable mBlankingTransitionRunnable;
private final WakeLock mWakeLock; private final WakeLock mWakeLock;
@@ -240,7 +240,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// Cancel blanking transitions that were pending before we requested a new state // Cancel blanking transitions that were pending before we requested a new state
if (mPendingFrameCallback != null) { if (mPendingFrameCallback != null) {
Choreographer.getInstance().removeFrameCallback(mPendingFrameCallback); mScrimBehind.removeCallbacks(mPendingFrameCallback);
mPendingFrameCallback = null; mPendingFrameCallback = null;
} }
if (getHandler().hasCallbacks(mBlankingTransitionRunnable)) { if (getHandler().hasCallbacks(mBlankingTransitionRunnable)) {
@@ -278,7 +278,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// with too many things at this case, in order to not skip the initial frames. // with too many things at this case, in order to not skip the initial frames.
mScrimInFront.postOnAnimationDelayed(this::scheduleUpdate, 16); mScrimInFront.postOnAnimationDelayed(this::scheduleUpdate, 16);
mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY; mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY;
} else if (!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD } else if ((!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD)
|| (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) { || (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) {
// Scheduling a frame isn't enough when: // Scheduling a frame isn't enough when:
// • Leaving doze and we need to modify scrim color immediately // • Leaving doze and we need to modify scrim color immediately
@@ -727,7 +727,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// Notify callback that the screen is completely black and we're // Notify callback that the screen is completely black and we're
// ready to change the display power mode // ready to change the display power mode
mPendingFrameCallback = frameTimeNanos -> { mPendingFrameCallback = () -> {
if (mCallback != null) { if (mCallback != null) {
mCallback.onDisplayBlanked(); mCallback.onDisplayBlanked();
mScreenBlankingCallbackCalled = true; mScreenBlankingCallbackCalled = true;
@@ -743,7 +743,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// Setting power states can happen after we push out the frame. Make sure we // Setting power states can happen after we push out the frame. Make sure we
// stay fully opaque until the power state request reaches the lower levels. // stay fully opaque until the power state request reaches the lower levels.
final int delay = mScreenOn ? 16 : 500; final int delay = mScreenOn ? 32 : 500;
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "Fading out scrims with delay: " + delay); Log.d(TAG, "Fading out scrims with delay: " + delay);
} }
@@ -752,9 +752,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
doOnTheNextFrame(mPendingFrameCallback); doOnTheNextFrame(mPendingFrameCallback);
} }
/**
* Executes a callback after the frame has hit the display.
* @param callback What to run.
*/
@VisibleForTesting @VisibleForTesting
protected void doOnTheNextFrame(Choreographer.FrameCallback callback) { protected void doOnTheNextFrame(Runnable callback) {
Choreographer.getInstance().postFrameCallback(callback); // Just calling View#postOnAnimation isn't enough because the frame might not have reached
// the display yet. A timeout is the safest solution.
mScrimBehind.postOnAnimationDelayed(callback, 32 /* delayMillis */);
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -39,10 +39,8 @@ import android.os.Looper;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.view.Choreographer;
import android.view.View; import android.view.View;
import com.android.internal.util.Preconditions;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.ScrimView;
@@ -557,8 +555,8 @@ public class ScrimControllerTest extends SysuiTestCase {
* @param callback What to execute. * @param callback What to execute.
*/ */
@Override @Override
protected void doOnTheNextFrame(Choreographer.FrameCallback callback) { protected void doOnTheNextFrame(Runnable callback) {
callback.doFrame(0); callback.run();
} }
} }