diff options
| author | 2016-08-08 22:15:14 +0000 | |
|---|---|---|
| committer | 2016-08-08 22:15:16 +0000 | |
| commit | 76f5fac23ca5f987dd59532ea4b184b3c81edca6 (patch) | |
| tree | dde2939ba9b6e96d0b7ea7edaa8413504ae85022 | |
| parent | 2f51366c1a1a719d1b8e17f3c2e3574edac74380 (diff) | |
| parent | a78d9857c927e3eb9f512a46c8cdcb77c14259c9 (diff) | |
Merge "Fix currentAnimationTimeMillis to use vsync time am: a2acb4f077 am: 936166fd5b" into nyc-mr1-dev-plus-aosp
| -rw-r--r-- | core/java/android/view/Choreographer.java | 3 | ||||
| -rw-r--r-- | core/java/android/view/animation/AnimationUtils.java | 34 |
2 files changed, 36 insertions, 1 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index d3db74d1ea24..3316f3aeb60b 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -25,6 +25,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.util.Log; import android.util.TimeUtils; +import android.view.animation.AnimationUtils; import java.io.PrintWriter; @@ -608,6 +609,7 @@ public final class Choreographer { try { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame"); + AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS); mFrameInfo.markInputHandlingStart(); doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); @@ -620,6 +622,7 @@ public final class Choreographer { doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); } finally { + AnimationUtils.unlockAnimationClock(); Trace.traceEnd(Trace.TRACE_TAG_VIEW); } diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java index a54d94c5c2e3..351b6dbd6616 100644 --- a/core/java/android/view/animation/AnimationUtils.java +++ b/core/java/android/view/animation/AnimationUtils.java @@ -44,6 +44,31 @@ public class AnimationUtils { private static final int TOGETHER = 0; private static final int SEQUENTIALLY = 1; + private static class AnimationState { + boolean animationClockLocked; + long currentVsyncTimeMillis; + long lastReportedTimeMillis; + }; + + private static ThreadLocal<AnimationState> sAnimationState + = new ThreadLocal<AnimationState>() { + @Override + protected AnimationState initialValue() { + return new AnimationState(); + } + }; + + /** @hide */ + public static void lockAnimationClock(long vsyncMillis) { + AnimationState state = sAnimationState.get(); + state.animationClockLocked = true; + state.currentVsyncTimeMillis = vsyncMillis; + } + + /** @hide */ + public static void unlockAnimationClock() { + sAnimationState.get().animationClockLocked = false; + } /** * Returns the current animation time in milliseconds. This time should be used when invoking @@ -56,7 +81,14 @@ public class AnimationUtils { * @see android.os.SystemClock */ public static long currentAnimationTimeMillis() { - return SystemClock.uptimeMillis(); + AnimationState state = sAnimationState.get(); + if (state.animationClockLocked) { + // It's important that time never rewinds + return Math.max(state.currentVsyncTimeMillis, + state.lastReportedTimeMillis); + } + state.lastReportedTimeMillis = SystemClock.uptimeMillis(); + return state.lastReportedTimeMillis; } /** |