Handle when AnimationUtils getExpectedPresentationTimeNanos is not called in a callback

This change tries to handle the case when
getExpectedPresentationTimeNanos is not called in a callback (it happens
rarely). When getExpectedPresentationTimeNanos is called outside of a
callback, we call
mChoreographer.getLatestExpectedPresentTimeNanos() to
obtain the value.

Bug: 288630576
Test: atest AnimationUtilsTest
Change-Id: Ide033c69655ddf714d0626ca4a7643476693708c
This commit is contained in:
Shane
2023-07-13 16:59:19 +00:00
parent a2e5ff930b
commit 444cb5e4f0

View File

@@ -32,6 +32,7 @@ import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.TimeUtils;
import android.util.Xml;
import android.view.Choreographer;
import android.view.InflateException;
import org.xmlpull.v1.XmlPullParser;
@@ -153,7 +154,13 @@ public class AnimationUtils {
*/
public static long getExpectedPresentationTimeNanos() {
AnimationState state = sAnimationState.get();
return state.mExpectedPresentationTimeNanos;
if (state.animationClockLocked) {
return state.mExpectedPresentationTimeNanos;
}
// When this methoed is called outside of a Choreographer callback,
// we obtain the value of expectedPresentTimeNanos from the Choreographer.
// This helps avoid returning a time that could potentially be earlier than current time.
return Choreographer.getInstance().getLatestExpectedPresentTimeNanos();
}
/**