CrackMe.apk
Download file
package com.facebook.fresco.animation.drawable;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import com.facebook.common.logging.FLog;
import com.facebook.drawable.base.DrawableWithCaches;
import com.facebook.drawee.drawable.DrawableProperties;
import com.facebook.fresco.animation.backend.AnimationBackend;
import com.facebook.fresco.animation.frame.DropFramesFrameScheduler;
import com.facebook.fresco.animation.frame.FrameScheduler;
import javax.annotation.Nullable;
public class AnimatedDrawable2 extends Drawable implements Animatable, DrawableWithCaches {
private static final int DEFAULT_FRAME_SCHEDULING_DELAY_MS = 8;
private static final int DEFAULT_FRAME_SCHEDULING_OFFSET_MS = 0;
private static final AnimationListener NO_OP_LISTENER = new BaseAnimationListener();
private static final Class<?> TAG = AnimatedDrawable2.class;
@Nullable
private AnimationBackend mAnimationBackend;
private volatile AnimationListener mAnimationListener;
@Nullable
private volatile DrawListener mDrawListener;
@Nullable
private DrawableProperties mDrawableProperties;
private int mDroppedFrames;
private long mExpectedRenderTimeMs;
@Nullable
private FrameScheduler mFrameScheduler;
private long mFrameSchedulingDelayMs;
private long mFrameSchedulingOffsetMs;
/* access modifiers changed from: private */
public final Runnable mInvalidateRunnable;
private volatile boolean mIsRunning;
private int mLastDrawnFrameNumber;
private long mLastFrameAnimationTimeMs;
private int mPausedLastDrawnFrameNumber;
private long mPausedLastFrameAnimationTimeMsDifference;
private long mPausedStartTimeMsDifference;
private long mStartTimeMs;
public interface DrawListener {
void onDraw(AnimatedDrawable2 animatedDrawable2, FrameScheduler frameScheduler, int i, boolean z, boolean z2, long j, long j2, long j3, long j4, long j5, long j6, long j7);
}
public int getOpacity() {
return -3;
}
public AnimatedDrawable2() {
this((AnimationBackend) null);
}
public AnimatedDrawable2(@Nullable AnimationBackend animationBackend) {
this.mFrameSchedulingDelayMs = 8;
this.mFrameSchedulingOffsetMs = 0;
this.mAnimationListener = NO_OP_LISTENER;
this.mDrawListener = null;
this.mInvalidateRunnable = new Runnable() {
public void run() {
AnimatedDrawable2 animatedDrawable2 = AnimatedDrawable2.this;
animatedDrawable2.unscheduleSelf(animatedDrawable2.mInvalidateRunnable);
AnimatedDrawable2.this.invalidateSelf();
}
};
this.mAnimationBackend = animationBackend;
this.mFrameScheduler = createSchedulerForBackendAndDelayMethod(animationBackend);
}
public int getIntrinsicWidth() {
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend == null) {
return super.getIntrinsicWidth();
}
return animationBackend.getIntrinsicWidth();
}
public int getIntrinsicHeight() {
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend == null) {
return super.getIntrinsicHeight();
}
return animationBackend.getIntrinsicHeight();
}
public void start() {
AnimationBackend animationBackend;
if (!this.mIsRunning && (animationBackend = this.mAnimationBackend) != null && animationBackend.getFrameCount() > 1) {
this.mIsRunning = true;
long now = now();
long j = now - this.mPausedStartTimeMsDifference;
this.mStartTimeMs = j;
this.mExpectedRenderTimeMs = j;
this.mLastFrameAnimationTimeMs = now - this.mPausedLastFrameAnimationTimeMsDifference;
this.mLastDrawnFrameNumber = this.mPausedLastDrawnFrameNumber;
invalidateSelf();
this.mAnimationListener.onAnimationStart(this);
}
}
public void stop() {
if (this.mIsRunning) {
long now = now();
this.mPausedStartTimeMsDifference = now - this.mStartTimeMs;
this.mPausedLastFrameAnimationTimeMsDifference = now - this.mLastFrameAnimationTimeMs;
this.mPausedLastDrawnFrameNumber = this.mLastDrawnFrameNumber;
this.mIsRunning = false;
this.mStartTimeMs = 0;
this.mExpectedRenderTimeMs = 0;
this.mLastFrameAnimationTimeMs = -1;
this.mLastDrawnFrameNumber = -1;
unscheduleSelf(this.mInvalidateRunnable);
this.mAnimationListener.onAnimationStop(this);
}
}
public boolean isRunning() {
return this.mIsRunning;
}
/* access modifiers changed from: protected */
public void onBoundsChange(Rect rect) {
super.onBoundsChange(rect);
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend != null) {
animationBackend.setBounds(rect);
}
}
public void draw(Canvas canvas) {
long j;
long j2;
long j3;
long j4;
AnimatedDrawable2 animatedDrawable2;
if (this.mAnimationBackend == null || this.mFrameScheduler == null) {
return;
}
long now = now();
if (this.mIsRunning) {
j = (now - this.mStartTimeMs) + this.mFrameSchedulingOffsetMs;
} else {
j = Math.max(this.mLastFrameAnimationTimeMs, 0);
}
long j5 = j;
int frameNumberToRender = this.mFrameScheduler.getFrameNumberToRender(j5, this.mLastFrameAnimationTimeMs);
if (frameNumberToRender == -1) {
frameNumberToRender = this.mAnimationBackend.getFrameCount() - 1;
this.mAnimationListener.onAnimationStop(this);
this.mIsRunning = false;
} else if (frameNumberToRender == 0 && this.mLastDrawnFrameNumber != -1 && now >= this.mExpectedRenderTimeMs) {
this.mAnimationListener.onAnimationRepeat(this);
}
int i = frameNumberToRender;
boolean drawFrame = this.mAnimationBackend.drawFrame(this, canvas, i);
if (drawFrame) {
this.mAnimationListener.onAnimationFrame(this, i);
this.mLastDrawnFrameNumber = i;
}
if (!drawFrame) {
onFrameDropped();
}
long now2 = now();
if (this.mIsRunning) {
long targetRenderTimeForNextFrameMs = this.mFrameScheduler.getTargetRenderTimeForNextFrameMs(now2 - this.mStartTimeMs);
if (targetRenderTimeForNextFrameMs != -1) {
long j6 = this.mFrameSchedulingDelayMs + targetRenderTimeForNextFrameMs;
scheduleNextFrame(j6);
j2 = j6;
} else {
this.mAnimationListener.onAnimationStop(this);
this.mIsRunning = false;
j2 = -1;
}
j3 = targetRenderTimeForNextFrameMs;
} else {
j3 = -1;
j2 = -1;
}
DrawListener drawListener = this.mDrawListener;
if (drawListener != null) {
drawListener.onDraw(this, this.mFrameScheduler, i, drawFrame, this.mIsRunning, this.mStartTimeMs, j5, this.mLastFrameAnimationTimeMs, now, now2, j3, j2);
animatedDrawable2 = this;
j4 = j5;
} else {
animatedDrawable2 = this;
j4 = j5;
}
animatedDrawable2.mLastFrameAnimationTimeMs = j4;
}
public void setAlpha(int i) {
if (this.mDrawableProperties == null) {
this.mDrawableProperties = new DrawableProperties();
}
this.mDrawableProperties.setAlpha(i);
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend != null) {
animationBackend.setAlpha(i);
}
}
public void setColorFilter(@Nullable ColorFilter colorFilter) {
if (this.mDrawableProperties == null) {
this.mDrawableProperties = new DrawableProperties();
}
this.mDrawableProperties.setColorFilter(colorFilter);
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend != null) {
animationBackend.setColorFilter(colorFilter);
}
}
public void setAnimationBackend(@Nullable AnimationBackend animationBackend) {
this.mAnimationBackend = animationBackend;
if (animationBackend != null) {
this.mFrameScheduler = new DropFramesFrameScheduler(animationBackend);
this.mAnimationBackend.setBounds(getBounds());
DrawableProperties drawableProperties = this.mDrawableProperties;
if (drawableProperties != null) {
drawableProperties.applyTo(this);
}
}
this.mFrameScheduler = createSchedulerForBackendAndDelayMethod(this.mAnimationBackend);
stop();
}
@Nullable
public AnimationBackend getAnimationBackend() {
return this.mAnimationBackend;
}
public long getDroppedFrames() {
return (long) this.mDroppedFrames;
}
public long getStartTimeMs() {
return this.mStartTimeMs;
}
public boolean isInfiniteAnimation() {
FrameScheduler frameScheduler = this.mFrameScheduler;
return frameScheduler != null && frameScheduler.isInfiniteAnimation();
}
public void jumpToFrame(int i) {
FrameScheduler frameScheduler;
if (this.mAnimationBackend != null && (frameScheduler = this.mFrameScheduler) != null) {
this.mLastFrameAnimationTimeMs = frameScheduler.getTargetRenderTimeMs(i);
long now = now() - this.mLastFrameAnimationTimeMs;
this.mStartTimeMs = now;
this.mExpectedRenderTimeMs = now;
invalidateSelf();
}
}
public long getLoopDurationMs() {
if (this.mAnimationBackend == null) {
return 0;
}
FrameScheduler frameScheduler = this.mFrameScheduler;
if (frameScheduler != null) {
return frameScheduler.getLoopDurationMs();
}
int i = 0;
for (int i2 = 0; i2 < this.mAnimationBackend.getFrameCount(); i2++) {
i += this.mAnimationBackend.getFrameDurationMs(i2);
}
return (long) i;
}
public int getFrameCount() {
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend == null) {
return 0;
}
return animationBackend.getFrameCount();
}
public int getLoopCount() {
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend == null) {
return 0;
}
return animationBackend.getLoopCount();
}
public void setFrameSchedulingDelayMs(long j) {
this.mFrameSchedulingDelayMs = j;
}
public void setFrameSchedulingOffsetMs(long j) {
this.mFrameSchedulingOffsetMs = j;
}
public void setAnimationListener(@Nullable AnimationListener animationListener) {
if (animationListener == null) {
animationListener = NO_OP_LISTENER;
}
this.mAnimationListener = animationListener;
}
public void setDrawListener(@Nullable DrawListener drawListener) {
this.mDrawListener = drawListener;
}
private void scheduleNextFrame(long j) {
long j2 = this.mStartTimeMs + j;
this.mExpectedRenderTimeMs = j2;
scheduleSelf(this.mInvalidateRunnable, j2);
}
private void onFrameDropped() {
this.mDroppedFrames++;
if (FLog.isLoggable(2)) {
FLog.v(TAG, "Dropped a frame. Count: %s", (Object) Integer.valueOf(this.mDroppedFrames));
}
}
private long now() {
return SystemClock.uptimeMillis();
}
@Nullable
private static FrameScheduler createSchedulerForBackendAndDelayMethod(@Nullable AnimationBackend animationBackend) {
if (animationBackend == null) {
return null;
}
return new DropFramesFrameScheduler(animationBackend);
}
/* access modifiers changed from: protected */
public boolean onLevelChange(int i) {
if (this.mIsRunning) {
return false;
}
long j = (long) i;
if (this.mLastFrameAnimationTimeMs == j) {
return false;
}
this.mLastFrameAnimationTimeMs = j;
invalidateSelf();
return true;
}
public void dropCaches() {
AnimationBackend animationBackend = this.mAnimationBackend;
if (animationBackend != null) {
animationBackend.clear();
}
}
}
Download file