394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package pl.droidsonroids.gif;
 | |
| 
 | |
| import android.content.res.AssetFileDescriptor;
 | |
| import android.content.res.ColorStateList;
 | |
| import android.content.res.Resources;
 | |
| import android.graphics.Bitmap;
 | |
| import android.graphics.Canvas;
 | |
| import android.graphics.ColorFilter;
 | |
| import android.graphics.Paint;
 | |
| import android.graphics.PorterDuff;
 | |
| import android.graphics.PorterDuffColorFilter;
 | |
| import android.graphics.Rect;
 | |
| import android.graphics.drawable.Animatable;
 | |
| import android.graphics.drawable.Drawable;
 | |
| import android.os.SystemClock;
 | |
| import android.widget.MediaController;
 | |
| import java.io.IOException;
 | |
| import java.util.Locale;
 | |
| import java.util.concurrent.ConcurrentLinkedQueue;
 | |
| import java.util.concurrent.ScheduledFuture;
 | |
| import java.util.concurrent.ScheduledThreadPoolExecutor;
 | |
| import java.util.concurrent.TimeUnit;
 | |
| import pl.droidsonroids.gif.transforms.Transform;
 | |
| 
 | |
| /* loaded from: classes2.dex */
 | |
| public class GifDrawable extends Drawable implements Animatable, MediaController.MediaPlayerControl {
 | |
|     final ScheduledThreadPoolExecutor a;
 | |
|     volatile boolean b;
 | |
|     long c;
 | |
|     private final Rect d;
 | |
|     protected final Paint e;
 | |
|     final Bitmap f;
 | |
|     final GifInfoHandle g;
 | |
|     final ConcurrentLinkedQueue<AnimationListener> h;
 | |
|     private ColorStateList i;
 | |
|     private PorterDuffColorFilter j;
 | |
|     private PorterDuff.Mode k;
 | |
|     final boolean l;
 | |
|     final InvalidationHandler m;
 | |
|     private final RenderTask n;
 | |
|     private final Rect o;
 | |
|     ScheduledFuture<?> p;
 | |
|     private int q;
 | |
|     private int r;
 | |
|     private Transform s;
 | |
| 
 | |
|     public GifDrawable(Resources resources, int i) throws Resources.NotFoundException, IOException {
 | |
|         this(resources.openRawResourceFd(i));
 | |
|         float a = GifViewUtils.a(resources, i);
 | |
|         this.r = (int) (this.g.f() * a);
 | |
|         this.q = (int) (this.g.l() * a);
 | |
|     }
 | |
| 
 | |
|     private void g() {
 | |
|         ScheduledFuture<?> scheduledFuture = this.p;
 | |
|         if (scheduledFuture != null) {
 | |
|             scheduledFuture.cancel(false);
 | |
|         }
 | |
|         this.m.removeMessages(-1);
 | |
|     }
 | |
| 
 | |
|     private void h() {
 | |
|         if (this.l && this.b) {
 | |
|             long j = this.c;
 | |
|             if (j != Long.MIN_VALUE) {
 | |
|                 long max = Math.max(0L, j - SystemClock.uptimeMillis());
 | |
|                 this.c = Long.MIN_VALUE;
 | |
|                 this.a.remove(this.n);
 | |
|                 this.p = this.a.schedule(this.n, max, TimeUnit.MILLISECONDS);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void i() {
 | |
|         this.b = false;
 | |
|         this.m.removeMessages(-1);
 | |
|         this.g.o();
 | |
|     }
 | |
| 
 | |
|     void a(long j) {
 | |
|         if (this.l) {
 | |
|             this.c = 0L;
 | |
|             this.m.sendEmptyMessageAtTime(-1, 0L);
 | |
|         } else {
 | |
|             g();
 | |
|             this.p = this.a.schedule(this.n, Math.max(j, 0L), TimeUnit.MILLISECONDS);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public int b() {
 | |
|         int c = this.g.c();
 | |
|         return (c == 0 || c < this.g.g()) ? c : c - 1;
 | |
|     }
 | |
| 
 | |
|     public int c() {
 | |
|         return this.f.getRowBytes() * this.f.getHeight();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public boolean canPause() {
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public boolean canSeekBackward() {
 | |
|         return d() > 1;
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public boolean canSeekForward() {
 | |
|         return d() > 1;
 | |
|     }
 | |
| 
 | |
|     public int d() {
 | |
|         return this.g.j();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void draw(Canvas canvas) {
 | |
|         boolean z;
 | |
|         if (this.j == null || this.e.getColorFilter() != null) {
 | |
|             z = false;
 | |
|         } else {
 | |
|             this.e.setColorFilter(this.j);
 | |
|             z = true;
 | |
|         }
 | |
|         Transform transform = this.s;
 | |
|         if (transform == null) {
 | |
|             canvas.drawBitmap(this.f, this.o, this.d, this.e);
 | |
|         } else {
 | |
|             transform.a(canvas, this.e, this.f);
 | |
|         }
 | |
|         if (z) {
 | |
|             this.e.setColorFilter(null);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public boolean e() {
 | |
|         return this.g.n();
 | |
|     }
 | |
| 
 | |
|     public void f() {
 | |
|         this.a.execute(new SafeRunnable(this) { // from class: pl.droidsonroids.gif.GifDrawable.1
 | |
|             @Override // pl.droidsonroids.gif.SafeRunnable
 | |
|             public void a() {
 | |
|                 if (GifDrawable.this.g.p()) {
 | |
|                     GifDrawable.this.start();
 | |
|                 }
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public int getAlpha() {
 | |
|         return this.e.getAlpha();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public int getAudioSessionId() {
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public int getBufferPercentage() {
 | |
|         return 100;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public ColorFilter getColorFilter() {
 | |
|         return this.e.getColorFilter();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public int getCurrentPosition() {
 | |
|         return this.g.d();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public int getDuration() {
 | |
|         return this.g.e();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public int getIntrinsicHeight() {
 | |
|         return this.r;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public int getIntrinsicWidth() {
 | |
|         return this.q;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public int getOpacity() {
 | |
|         return (!this.g.m() || this.e.getAlpha() < 255) ? -2 : -1;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void invalidateSelf() {
 | |
|         super.invalidateSelf();
 | |
|         h();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public boolean isPlaying() {
 | |
|         return this.b;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Animatable
 | |
|     public boolean isRunning() {
 | |
|         return this.b;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public boolean isStateful() {
 | |
|         ColorStateList colorStateList;
 | |
|         return super.isStateful() || ((colorStateList = this.i) != null && colorStateList.isStateful());
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     protected void onBoundsChange(Rect rect) {
 | |
|         this.d.set(rect);
 | |
|         Transform transform = this.s;
 | |
|         if (transform != null) {
 | |
|             transform.a(rect);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     protected boolean onStateChange(int[] iArr) {
 | |
|         PorterDuff.Mode mode;
 | |
|         ColorStateList colorStateList = this.i;
 | |
|         if (colorStateList == null || (mode = this.k) == null) {
 | |
|             return false;
 | |
|         }
 | |
|         this.j = a(colorStateList, mode);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public void pause() {
 | |
|         stop();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.MediaController.MediaPlayerControl
 | |
|     public void seekTo(final int i) {
 | |
|         if (i < 0) {
 | |
|             throw new IllegalArgumentException("Position is not positive");
 | |
|         }
 | |
|         this.a.execute(new SafeRunnable(this) { // from class: pl.droidsonroids.gif.GifDrawable.2
 | |
|             @Override // pl.droidsonroids.gif.SafeRunnable
 | |
|             public void a() {
 | |
|                 GifDrawable gifDrawable = GifDrawable.this;
 | |
|                 gifDrawable.g.a(i, gifDrawable.f);
 | |
|                 this.a.m.sendEmptyMessageAtTime(-1, 0L);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void setAlpha(int i) {
 | |
|         this.e.setAlpha(i);
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void setColorFilter(ColorFilter colorFilter) {
 | |
|         this.e.setColorFilter(colorFilter);
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     @Deprecated
 | |
|     public void setDither(boolean z) {
 | |
|         this.e.setDither(z);
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void setFilterBitmap(boolean z) {
 | |
|         this.e.setFilterBitmap(z);
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void setTintList(ColorStateList colorStateList) {
 | |
|         this.i = colorStateList;
 | |
|         this.j = a(colorStateList, this.k);
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public void setTintMode(PorterDuff.Mode mode) {
 | |
|         this.k = mode;
 | |
|         this.j = a(this.i, mode);
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Drawable
 | |
|     public boolean setVisible(boolean z, boolean z2) {
 | |
|         boolean visible = super.setVisible(z, z2);
 | |
|         if (!this.l) {
 | |
|             if (z) {
 | |
|                 if (z2) {
 | |
|                     f();
 | |
|                 }
 | |
|                 if (visible) {
 | |
|                     start();
 | |
|                 }
 | |
|             } else if (visible) {
 | |
|                 stop();
 | |
|             }
 | |
|         }
 | |
|         return visible;
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Animatable, android.widget.MediaController.MediaPlayerControl
 | |
|     public void start() {
 | |
|         synchronized (this) {
 | |
|             if (this.b) {
 | |
|                 return;
 | |
|             }
 | |
|             this.b = true;
 | |
|             a(this.g.q());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // android.graphics.drawable.Animatable
 | |
|     public void stop() {
 | |
|         synchronized (this) {
 | |
|             if (this.b) {
 | |
|                 this.b = false;
 | |
|                 g();
 | |
|                 this.g.r();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public String toString() {
 | |
|         return String.format(Locale.ENGLISH, "GIF: size: %dx%d, frames: %d, error: %d", Integer.valueOf(this.g.l()), Integer.valueOf(this.g.f()), Integer.valueOf(this.g.j()), Integer.valueOf(this.g.i()));
 | |
|     }
 | |
| 
 | |
|     public GifDrawable(AssetFileDescriptor assetFileDescriptor) throws IOException {
 | |
|         this(new GifInfoHandle(assetFileDescriptor), null, null, true);
 | |
|     }
 | |
| 
 | |
|     GifDrawable(GifInfoHandle gifInfoHandle, GifDrawable gifDrawable, ScheduledThreadPoolExecutor scheduledThreadPoolExecutor, boolean z) {
 | |
|         this.b = true;
 | |
|         this.c = Long.MIN_VALUE;
 | |
|         this.d = new Rect();
 | |
|         this.e = new Paint(6);
 | |
|         this.h = new ConcurrentLinkedQueue<>();
 | |
|         this.n = new RenderTask(this);
 | |
|         this.l = z;
 | |
|         this.a = scheduledThreadPoolExecutor == null ? GifRenderingExecutor.a() : scheduledThreadPoolExecutor;
 | |
|         this.g = gifInfoHandle;
 | |
|         Bitmap bitmap = null;
 | |
|         if (gifDrawable != null) {
 | |
|             synchronized (gifDrawable.g) {
 | |
|                 if (!gifDrawable.g.n() && gifDrawable.g.f() >= this.g.f() && gifDrawable.g.l() >= this.g.l()) {
 | |
|                     gifDrawable.i();
 | |
|                     Bitmap bitmap2 = gifDrawable.f;
 | |
|                     bitmap2.eraseColor(0);
 | |
|                     bitmap = bitmap2;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         if (bitmap == null) {
 | |
|             this.f = Bitmap.createBitmap(this.g.l(), this.g.f(), Bitmap.Config.ARGB_8888);
 | |
|         } else {
 | |
|             this.f = bitmap;
 | |
|         }
 | |
|         this.f.setHasAlpha(!gifInfoHandle.m());
 | |
|         this.o = new Rect(0, 0, this.g.l(), this.g.f());
 | |
|         this.m = new InvalidationHandler(this);
 | |
|         this.n.a();
 | |
|         this.q = this.g.l();
 | |
|         this.r = this.g.f();
 | |
|     }
 | |
| 
 | |
|     public void a(int i) {
 | |
|         this.g.a(i);
 | |
|     }
 | |
| 
 | |
|     private PorterDuffColorFilter a(ColorStateList colorStateList, PorterDuff.Mode mode) {
 | |
|         if (colorStateList == null || mode == null) {
 | |
|             return null;
 | |
|         }
 | |
|         return new PorterDuffColorFilter(colorStateList.getColorForState(getState(), 0), mode);
 | |
|     }
 | |
| 
 | |
|     public int a() {
 | |
|         return this.g.b();
 | |
|     }
 | |
| }
 |