package pl.droidsonroids.gif; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; import android.graphics.SurfaceTexture; import android.os.Parcelable; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Surface; import android.view.TextureView; import android.widget.ImageView; import androidx.annotation.FloatRange; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import java.io.IOException; import java.lang.ref.WeakReference; import pl.droidsonroids.gif.GifViewUtils; import pl.droidsonroids.gif.InputSource; public class GifTextureView extends TextureView { private static final ImageView.ScaleType[] sScaleTypeArray = {ImageView.ScaleType.MATRIX, ImageView.ScaleType.FIT_XY, ImageView.ScaleType.FIT_START, ImageView.ScaleType.FIT_CENTER, ImageView.ScaleType.FIT_END, ImageView.ScaleType.CENTER, ImageView.ScaleType.CENTER_CROP, ImageView.ScaleType.CENTER_INSIDE}; private InputSource mInputSource; private RenderThread mRenderThread; private ImageView.ScaleType mScaleType = ImageView.ScaleType.FIT_CENTER; private float mSpeedFactor = 1.0f; private final Matrix mTransform = new Matrix(); private GifViewUtils.GifViewAttributes viewAttributes; public interface PlaceholderDrawListener { void onDrawPlaceholder(Canvas canvas); } public TextureView.SurfaceTextureListener getSurfaceTextureListener() { return null; } public GifTextureView(Context context) { super(context); init(null, 0, 0); } public GifTextureView(Context context, AttributeSet attributeSet) { super(context, attributeSet); init(attributeSet, 0, 0); } public GifTextureView(Context context, AttributeSet attributeSet, int i) { super(context, attributeSet, i); init(attributeSet, i, 0); } @RequiresApi(21) public GifTextureView(Context context, AttributeSet attributeSet, int i, int i2) { super(context, attributeSet, i, i2); init(attributeSet, i, i2); } private void init(AttributeSet attributeSet, int i, int i2) { if (attributeSet != null) { int attributeIntValue = attributeSet.getAttributeIntValue("http://schemas.android.com/apk/res/android", "scaleType", -1); if (attributeIntValue >= 0) { ImageView.ScaleType[] scaleTypeArr = sScaleTypeArray; if (attributeIntValue < scaleTypeArr.length) { this.mScaleType = scaleTypeArr[attributeIntValue]; } } TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attributeSet, R.styleable.GifTextureView, i, i2); this.mInputSource = findSource(obtainStyledAttributes); super.setOpaque(obtainStyledAttributes.getBoolean(R.styleable.GifTextureView_isOpaque, false)); obtainStyledAttributes.recycle(); this.viewAttributes = new GifViewUtils.GifViewAttributes(this, attributeSet, i, i2); } else { super.setOpaque(false); this.viewAttributes = new GifViewUtils.GifViewAttributes(); } if (!isInEditMode()) { RenderThread renderThread = new RenderThread(this); this.mRenderThread = renderThread; if (this.mInputSource != null) { renderThread.start(); } } } public void setSurfaceTextureListener(TextureView.SurfaceTextureListener surfaceTextureListener) { throw new UnsupportedOperationException("Changing SurfaceTextureListener is not supported"); } public void setSurfaceTexture(SurfaceTexture surfaceTexture) { throw new UnsupportedOperationException("Changing SurfaceTexture is not supported"); } private static InputSource findSource(TypedArray typedArray) { TypedValue typedValue = new TypedValue(); if (!typedArray.getValue(R.styleable.GifTextureView_gifSource, typedValue)) { return null; } if (typedValue.resourceId != 0) { String resourceTypeName = typedArray.getResources().getResourceTypeName(typedValue.resourceId); if (GifViewUtils.SUPPORTED_RESOURCE_TYPE_NAMES.contains(resourceTypeName)) { return new InputSource.ResourcesSource(typedArray.getResources(), typedValue.resourceId); } if (!"string".equals(resourceTypeName)) { throw new IllegalArgumentException("Expected string, drawable, mipmap or raw resource type. '" + resourceTypeName + "' is not supported"); } } return new InputSource.AssetSource(typedArray.getResources().getAssets(), typedValue.string.toString()); } /* access modifiers changed from: private */ public static class RenderThread extends Thread implements TextureView.SurfaceTextureListener { final ConditionVariable isSurfaceValid = new ConditionVariable(); private GifInfoHandle mGifInfoHandle = new GifInfoHandle(); private final WeakReference<GifTextureView> mGifTextureViewReference; private IOException mIOException; long[] mSavedState; public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) { } public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } RenderThread(GifTextureView gifTextureView) { super("GifRenderThread"); this.mGifTextureViewReference = new WeakReference<>(gifTextureView); } public void run() { try { GifTextureView gifTextureView = this.mGifTextureViewReference.get(); if (gifTextureView != null) { GifInfoHandle open = gifTextureView.mInputSource.open(); this.mGifInfoHandle = open; open.setOptions(1, gifTextureView.isOpaque()); if (gifTextureView.viewAttributes.mLoopCount >= 0) { this.mGifInfoHandle.setLoopCount(gifTextureView.viewAttributes.mLoopCount); } final GifTextureView gifTextureView2 = this.mGifTextureViewReference.get(); if (gifTextureView2 == null) { this.mGifInfoHandle.recycle(); return; } gifTextureView2.setSuperSurfaceTextureListener(this); boolean isAvailable = gifTextureView2.isAvailable(); this.isSurfaceValid.set(isAvailable); if (isAvailable) { gifTextureView2.post(new Runnable() { /* class pl.droidsonroids.gif.GifTextureView.RenderThread.AnonymousClass1 */ public void run() { gifTextureView2.updateTextureViewSize(RenderThread.this.mGifInfoHandle); } }); } this.mGifInfoHandle.setSpeedFactor(gifTextureView2.mSpeedFactor); while (!isInterrupted()) { try { this.isSurfaceValid.block(); GifTextureView gifTextureView3 = this.mGifTextureViewReference.get(); if (gifTextureView3 == null) { break; } SurfaceTexture surfaceTexture = gifTextureView3.getSurfaceTexture(); if (surfaceTexture != null) { Surface surface = new Surface(surfaceTexture); try { this.mGifInfoHandle.bindSurface(surface, this.mSavedState); } finally { surface.release(); } } } catch (InterruptedException unused) { Thread.currentThread().interrupt(); } } this.mGifInfoHandle.recycle(); this.mGifInfoHandle = new GifInfoHandle(); } } catch (IOException e) { this.mIOException = e; } } public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) { GifTextureView gifTextureView = this.mGifTextureViewReference.get(); if (gifTextureView != null) { gifTextureView.updateTextureViewSize(this.mGifInfoHandle); } this.isSurfaceValid.open(); } public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { this.isSurfaceValid.close(); this.mGifInfoHandle.postUnbindSurface(); interrupt(); return true; } /* access modifiers changed from: package-private */ public void dispose(@NonNull GifTextureView gifTextureView, @Nullable PlaceholderDrawListener placeholderDrawListener) { this.isSurfaceValid.close(); gifTextureView.setSuperSurfaceTextureListener(placeholderDrawListener != null ? new PlaceholderDrawingSurfaceTextureListener(placeholderDrawListener) : null); this.mGifInfoHandle.postUnbindSurface(); interrupt(); } } /* access modifiers changed from: private */ /* access modifiers changed from: public */ private void setSuperSurfaceTextureListener(TextureView.SurfaceTextureListener surfaceTextureListener) { super.setSurfaceTextureListener(surfaceTextureListener); } public void setOpaque(boolean z) { if (z != isOpaque()) { super.setOpaque(z); setInputSource(this.mInputSource); } } /* access modifiers changed from: protected */ public void onDetachedFromWindow() { this.mRenderThread.dispose(this, null); super.onDetachedFromWindow(); SurfaceTexture surfaceTexture = getSurfaceTexture(); if (surfaceTexture != null) { surfaceTexture.release(); } } public synchronized void setInputSource(@Nullable InputSource inputSource) { setInputSource(inputSource, null); } public synchronized void setInputSource(@Nullable InputSource inputSource, @Nullable PlaceholderDrawListener placeholderDrawListener) { this.mRenderThread.dispose(this, placeholderDrawListener); try { this.mRenderThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } this.mInputSource = inputSource; RenderThread renderThread = new RenderThread(this); this.mRenderThread = renderThread; if (inputSource != null) { renderThread.start(); } } public void setSpeed(@FloatRange(from = 0.0d, fromInclusive = false) float f) { this.mSpeedFactor = f; this.mRenderThread.mGifInfoHandle.setSpeedFactor(f); } @Nullable public IOException getIOException() { if (this.mRenderThread.mIOException != null) { return this.mRenderThread.mIOException; } return GifIOException.fromCode(this.mRenderThread.mGifInfoHandle.getNativeErrorCode()); } public void setScaleType(@NonNull ImageView.ScaleType scaleType) { this.mScaleType = scaleType; updateTextureViewSize(this.mRenderThread.mGifInfoHandle); } public ImageView.ScaleType getScaleType() { return this.mScaleType; } /* access modifiers changed from: private */ /* access modifiers changed from: public */ private void updateTextureViewSize(GifInfoHandle gifInfoHandle) { Matrix matrix = new Matrix(); float width = (float) getWidth(); float height = (float) getHeight(); float width2 = ((float) gifInfoHandle.getWidth()) / width; float height2 = ((float) gifInfoHandle.getHeight()) / height; RectF rectF = new RectF(0.0f, 0.0f, (float) gifInfoHandle.getWidth(), (float) gifInfoHandle.getHeight()); RectF rectF2 = new RectF(0.0f, 0.0f, width, height); float f = 1.0f; switch (AnonymousClass1.$SwitchMap$android$widget$ImageView$ScaleType[this.mScaleType.ordinal()]) { case 1: matrix.setScale(width2, height2, width / 2.0f, height / 2.0f); break; case 2: float min = 1.0f / Math.min(width2, height2); matrix.setScale(width2 * min, min * height2, width / 2.0f, height / 2.0f); break; case 3: if (((float) gifInfoHandle.getWidth()) > width || ((float) gifInfoHandle.getHeight()) > height) { f = Math.min(1.0f / width2, 1.0f / height2); } matrix.setScale(width2 * f, f * height2, width / 2.0f, height / 2.0f); break; case 4: matrix.setRectToRect(rectF, rectF2, Matrix.ScaleToFit.CENTER); matrix.preScale(width2, height2); break; case 5: matrix.setRectToRect(rectF, rectF2, Matrix.ScaleToFit.END); matrix.preScale(width2, height2); break; case 6: matrix.setRectToRect(rectF, rectF2, Matrix.ScaleToFit.START); matrix.preScale(width2, height2); break; case 7: return; case 8: matrix.set(this.mTransform); matrix.preScale(width2, height2); break; } super.setTransform(matrix); } /* access modifiers changed from: package-private */ /* renamed from: pl.droidsonroids.gif.GifTextureView$1 reason: invalid class name */ public static /* synthetic */ class AnonymousClass1 { static final /* synthetic */ int[] $SwitchMap$android$widget$ImageView$ScaleType; /* JADX WARNING: Can't wrap try/catch for region: R(18:0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|18) */ /* JADX WARNING: Code restructure failed: missing block: B:19:?, code lost: return; */ /* JADX WARNING: Failed to process nested try/catch */ /* JADX WARNING: Missing exception handler attribute for start block: B:11:0x003e */ /* JADX WARNING: Missing exception handler attribute for start block: B:13:0x0049 */ /* JADX WARNING: Missing exception handler attribute for start block: B:15:0x0054 */ /* JADX WARNING: Missing exception handler attribute for start block: B:3:0x0012 */ /* JADX WARNING: Missing exception handler attribute for start block: B:5:0x001d */ /* JADX WARNING: Missing exception handler attribute for start block: B:7:0x0028 */ /* JADX WARNING: Missing exception handler attribute for start block: B:9:0x0033 */ static { int[] iArr = new int[ImageView.ScaleType.values().length]; $SwitchMap$android$widget$ImageView$ScaleType = iArr; iArr[ImageView.ScaleType.CENTER.ordinal()] = 1; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.CENTER_CROP.ordinal()] = 2; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.CENTER_INSIDE.ordinal()] = 3; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.FIT_CENTER.ordinal()] = 4; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.FIT_END.ordinal()] = 5; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.FIT_START.ordinal()] = 6; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.FIT_XY.ordinal()] = 7; $SwitchMap$android$widget$ImageView$ScaleType[ImageView.ScaleType.MATRIX.ordinal()] = 8; } } public void setImageMatrix(Matrix matrix) { setTransform(matrix); } public void setTransform(Matrix matrix) { this.mTransform.set(matrix); updateTextureViewSize(this.mRenderThread.mGifInfoHandle); } public Matrix getTransform(Matrix matrix) { if (matrix == null) { matrix = new Matrix(); } matrix.set(this.mTransform); return matrix; } public Parcelable onSaveInstanceState() { RenderThread renderThread = this.mRenderThread; renderThread.mSavedState = renderThread.mGifInfoHandle.getSavedState(); return new GifViewSavedState(super.onSaveInstanceState(), this.viewAttributes.freezesAnimation ? this.mRenderThread.mSavedState : null); } public void onRestoreInstanceState(Parcelable parcelable) { if (!(parcelable instanceof GifViewSavedState)) { super.onRestoreInstanceState(parcelable); return; } GifViewSavedState gifViewSavedState = (GifViewSavedState) parcelable; super.onRestoreInstanceState(gifViewSavedState.getSuperState()); this.mRenderThread.mSavedState = gifViewSavedState.mStates[0]; } public void setFreezesAnimation(boolean z) { this.viewAttributes.freezesAnimation = z; } }