Merge "Fix jank in CUJ_NOTIFICATION_HEADS_UP_APPEAR" into tm-qpr-dev am: f71427b27e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20789485

Change-Id: I3314f2e642cbd34a2ef63dfd9c932f5c289a9b59
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Peter Kalauskas
2023-01-18 22:23:08 +00:00
committed by Automerger Merge Worker

View File

@@ -24,6 +24,7 @@ import android.graphics.Canvas;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.view.Choreographer;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
@@ -492,12 +493,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
if (animationListener != null) {
mAppearAnimator.addListener(animationListener);
}
if (delay > 0) {
// we need to apply the initial state already to avoid drawn frames in the wrong state
updateAppearAnimationAlpha();
updateAppearRect();
mAppearAnimator.setStartDelay(delay);
}
// we need to apply the initial state already to avoid drawn frames in the wrong state
updateAppearAnimationAlpha();
updateAppearRect();
mAppearAnimator.addListener(new AnimatorListenerAdapter() {
private boolean mWasCancelled;
@@ -528,7 +526,20 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mWasCancelled = true;
}
});
mAppearAnimator.start();
// Cache the original animator so we can check if the animation should be started in the
// Choreographer callback. It's possible that the original animator (mAppearAnimator) is
// replaced with a new value before the callback is called.
ValueAnimator cachedAnimator = mAppearAnimator;
// Even when delay=0, starting the animation on the next frame is necessary to avoid jank.
// Not doing so will increase the chances our Animator will be forced to skip a value of
// the animation's progression, causing stutter.
Choreographer.getInstance().postFrameCallbackDelayed(
frameTimeNanos -> {
if (mAppearAnimator == cachedAnimator) {
mAppearAnimator.start();
}
}, delay);
}
private int getCujType(boolean isAppearing) {