179 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.dynamicanimation.animation;
 | |
| 
 | |
| import android.os.Handler;
 | |
| import android.os.Looper;
 | |
| import android.os.SystemClock;
 | |
| import android.view.Choreographer;
 | |
| import androidx.collection.SimpleArrayMap;
 | |
| import java.util.ArrayList;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class AnimationHandler {
 | |
|     private static final long FRAME_DELAY_MS = 10;
 | |
|     public static final ThreadLocal<AnimationHandler> sAnimatorHandler = new ThreadLocal<>();
 | |
|     private AnimationFrameCallbackProvider mProvider;
 | |
|     private final SimpleArrayMap<AnimationFrameCallback, Long> mDelayedCallbackStartTime = new SimpleArrayMap<>();
 | |
|     final ArrayList<AnimationFrameCallback> mAnimationCallbacks = new ArrayList<>();
 | |
|     private final AnimationCallbackDispatcher mCallbackDispatcher = new AnimationCallbackDispatcher();
 | |
|     long mCurrentFrameTime = 0;
 | |
|     private boolean mListDirty = false;
 | |
| 
 | |
|     interface AnimationFrameCallback {
 | |
|         boolean doAnimationFrame(long j);
 | |
|     }
 | |
| 
 | |
|     public void setProvider(AnimationFrameCallbackProvider animationFrameCallbackProvider) {
 | |
|         this.mProvider = animationFrameCallbackProvider;
 | |
|     }
 | |
| 
 | |
|     AnimationHandler() {
 | |
|     }
 | |
| 
 | |
|     class AnimationCallbackDispatcher {
 | |
|         AnimationCallbackDispatcher() {
 | |
|         }
 | |
| 
 | |
|         void dispatchAnimationFrame() {
 | |
|             AnimationHandler.this.mCurrentFrameTime = SystemClock.uptimeMillis();
 | |
|             AnimationHandler animationHandler = AnimationHandler.this;
 | |
|             animationHandler.doAnimationFrame(animationHandler.mCurrentFrameTime);
 | |
|             if (AnimationHandler.this.mAnimationCallbacks.size() > 0) {
 | |
|                 AnimationHandler.this.getProvider().postFrameCallback();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static AnimationHandler getInstance() {
 | |
|         ThreadLocal<AnimationHandler> threadLocal = sAnimatorHandler;
 | |
|         if (threadLocal.get() == null) {
 | |
|             threadLocal.set(new AnimationHandler());
 | |
|         }
 | |
|         return threadLocal.get();
 | |
|     }
 | |
| 
 | |
|     public static long getFrameTime() {
 | |
|         ThreadLocal<AnimationHandler> threadLocal = sAnimatorHandler;
 | |
|         if (threadLocal.get() == null) {
 | |
|             return 0L;
 | |
|         }
 | |
|         return threadLocal.get().mCurrentFrameTime;
 | |
|     }
 | |
| 
 | |
|     AnimationFrameCallbackProvider getProvider() {
 | |
|         if (this.mProvider == null) {
 | |
|             this.mProvider = new FrameCallbackProvider16(this.mCallbackDispatcher);
 | |
|         }
 | |
|         return this.mProvider;
 | |
|     }
 | |
| 
 | |
|     public void addAnimationFrameCallback(AnimationFrameCallback animationFrameCallback, long j) {
 | |
|         if (this.mAnimationCallbacks.size() == 0) {
 | |
|             getProvider().postFrameCallback();
 | |
|         }
 | |
|         if (!this.mAnimationCallbacks.contains(animationFrameCallback)) {
 | |
|             this.mAnimationCallbacks.add(animationFrameCallback);
 | |
|         }
 | |
|         if (j > 0) {
 | |
|             this.mDelayedCallbackStartTime.put(animationFrameCallback, Long.valueOf(SystemClock.uptimeMillis() + j));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void removeCallback(AnimationFrameCallback animationFrameCallback) {
 | |
|         this.mDelayedCallbackStartTime.remove(animationFrameCallback);
 | |
|         int indexOf = this.mAnimationCallbacks.indexOf(animationFrameCallback);
 | |
|         if (indexOf >= 0) {
 | |
|             this.mAnimationCallbacks.set(indexOf, null);
 | |
|             this.mListDirty = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void doAnimationFrame(long j) {
 | |
|         long uptimeMillis = SystemClock.uptimeMillis();
 | |
|         for (int i = 0; i < this.mAnimationCallbacks.size(); i++) {
 | |
|             AnimationFrameCallback animationFrameCallback = this.mAnimationCallbacks.get(i);
 | |
|             if (animationFrameCallback != null && isCallbackDue(animationFrameCallback, uptimeMillis)) {
 | |
|                 animationFrameCallback.doAnimationFrame(j);
 | |
|             }
 | |
|         }
 | |
|         cleanUpList();
 | |
|     }
 | |
| 
 | |
|     private boolean isCallbackDue(AnimationFrameCallback animationFrameCallback, long j) {
 | |
|         Long l = this.mDelayedCallbackStartTime.get(animationFrameCallback);
 | |
|         if (l == null) {
 | |
|             return true;
 | |
|         }
 | |
|         if (l.longValue() >= j) {
 | |
|             return false;
 | |
|         }
 | |
|         this.mDelayedCallbackStartTime.remove(animationFrameCallback);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     private void cleanUpList() {
 | |
|         if (this.mListDirty) {
 | |
|             for (int size = this.mAnimationCallbacks.size() - 1; size >= 0; size--) {
 | |
|                 if (this.mAnimationCallbacks.get(size) == null) {
 | |
|                     this.mAnimationCallbacks.remove(size);
 | |
|                 }
 | |
|             }
 | |
|             this.mListDirty = false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static class FrameCallbackProvider16 extends AnimationFrameCallbackProvider {
 | |
|         private final Choreographer mChoreographer;
 | |
|         private final Choreographer.FrameCallback mChoreographerCallback;
 | |
| 
 | |
|         FrameCallbackProvider16(AnimationCallbackDispatcher animationCallbackDispatcher) {
 | |
|             super(animationCallbackDispatcher);
 | |
|             this.mChoreographer = Choreographer.getInstance();
 | |
|             this.mChoreographerCallback = new Choreographer.FrameCallback() { // from class: androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackProvider16.1
 | |
|                 @Override // android.view.Choreographer.FrameCallback
 | |
|                 public void doFrame(long j) {
 | |
|                     FrameCallbackProvider16.this.mDispatcher.dispatchAnimationFrame();
 | |
|                 }
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.AnimationHandler.AnimationFrameCallbackProvider
 | |
|         void postFrameCallback() {
 | |
|             this.mChoreographer.postFrameCallback(this.mChoreographerCallback);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static class FrameCallbackProvider14 extends AnimationFrameCallbackProvider {
 | |
|         private final Handler mHandler;
 | |
|         long mLastFrameTime;
 | |
|         private final Runnable mRunnable;
 | |
| 
 | |
|         FrameCallbackProvider14(AnimationCallbackDispatcher animationCallbackDispatcher) {
 | |
|             super(animationCallbackDispatcher);
 | |
|             this.mLastFrameTime = -1L;
 | |
|             this.mRunnable = new Runnable() { // from class: androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackProvider14.1
 | |
|                 @Override // java.lang.Runnable
 | |
|                 public void run() {
 | |
|                     FrameCallbackProvider14.this.mLastFrameTime = SystemClock.uptimeMillis();
 | |
|                     FrameCallbackProvider14.this.mDispatcher.dispatchAnimationFrame();
 | |
|                 }
 | |
|             };
 | |
|             this.mHandler = new Handler(Looper.myLooper());
 | |
|         }
 | |
| 
 | |
|         @Override // androidx.dynamicanimation.animation.AnimationHandler.AnimationFrameCallbackProvider
 | |
|         void postFrameCallback() {
 | |
|             this.mHandler.postDelayed(this.mRunnable, Math.max(AnimationHandler.FRAME_DELAY_MS - (SystemClock.uptimeMillis() - this.mLastFrameTime), 0L));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     static abstract class AnimationFrameCallbackProvider {
 | |
|         final AnimationCallbackDispatcher mDispatcher;
 | |
| 
 | |
|         abstract void postFrameCallback();
 | |
| 
 | |
|         AnimationFrameCallbackProvider(AnimationCallbackDispatcher animationCallbackDispatcher) {
 | |
|             this.mDispatcher = animationCallbackDispatcher;
 | |
|         }
 | |
|     }
 | |
| }
 |