Merge "Fix flickering when switching display power modes" into pi-dev
am: 5e0957aaed
Change-Id: If60109cfeb9f5e059b0bf1963eadd7b2e2c8748c
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user