summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Android Build Merger (Role) <android-build-merger@google.com> 2016-08-08 22:15:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-08-08 22:15:16 +0000
commit76f5fac23ca5f987dd59532ea4b184b3c81edca6 (patch)
treedde2939ba9b6e96d0b7ea7edaa8413504ae85022
parent2f51366c1a1a719d1b8e17f3c2e3574edac74380 (diff)
parenta78d9857c927e3eb9f512a46c8cdcb77c14259c9 (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.java3
-rw-r--r--core/java/android/view/animation/AnimationUtils.java34
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;
}
/**