package com.mzba.fresco.ui.widget;
import android.content.Context;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.DraweeHolder;
import com.facebook.imagepipeline.core.ImagePipeline;
import com.facebook.imagepipeline.image.ImageInfo;
import com.facebook.imagepipeline.memory.PooledByteBuffer;
import com.facebook.imagepipeline.memory.PooledByteBufferInputStream;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.mzba.fresco.R;
import java.io.BufferedInputStream;
import java.io.IOException;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
/**
* Created by 06peng on 15/6/28.
*/
public class CustomGifView extends LinearLayout implements ImageDownloadListener {
DraweeHolder<GenericDraweeHierarchy> mDraweeHolder;
private CloseableReference<PooledByteBuffer> bytes;
private GifDrawable mGifDrawable;
private GifImageView mGifView;
private TextView mProgressTextView;
public CustomGifView(Context context) {
super(context);
init(context);
}
public CustomGifView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomGifView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
View layout = LayoutInflater.from(context).inflate(R.layout.activity_gif, null);
setOrientation(LinearLayout.VERTICAL);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
addView(layout, layoutParams);
mGifView = (GifImageView) findViewById(R.id.gifview);
mProgressTextView = (TextView) findViewById(R.id.progress_text);
if (mDraweeHolder == null) {
GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
.setProgressBarImage(new CustomProgressbarDrawable(this)).build();
mDraweeHolder = DraweeHolder.create(hierarchy, getContext());
}
}
public void setImageUrl(String url) {
ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)).build();
ImagePipeline imagePipeline = Fresco.getImagePipeline();
final DataSource<CloseableReference<PooledByteBuffer>> dataSource = imagePipeline.fetchEncodedImage(imageRequest, this);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(mDraweeHolder.getController())
.setImageRequest(imageRequest)
.setControllerListener(new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(String s, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) {
try {
if (bytes == null) {
bytes = dataSource.getResult();
}
if (bytes != null) {
PooledByteBuffer pooledByteBuffer = bytes.get();
PooledByteBufferInputStream sourceIs = new PooledByteBufferInputStream(pooledByteBuffer);
BufferedInputStream bis = new BufferedInputStream(sourceIs);
mGifDrawable = new GifDrawable(bis);
mGifView.setImageDrawable(mGifDrawable);
mGifView.setVisibility(View.VISIBLE);
mProgressTextView.setVisibility(View.INVISIBLE);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
dataSource.close();
CloseableReference.closeSafely(bytes);
}
}
})
.setTapToRetryEnabled(true)
.build();
mDraweeHolder.setController(controller);
}
@Override
protected void onDetachedFromWindow() {
mDraweeHolder.onDetach();
close();
super.onDetachedFromWindow();
}
@Override
protected void onAttachedToWindow() {
init(getContext());
mDraweeHolder.onAttach();
super.onAttachedToWindow();
}
@Override
protected boolean verifyDrawable(Drawable dr) {
if (dr == mDraweeHolder.getHierarchy().getTopLevelDrawable()) {
return true;
}
return false;
}
@Override
public void onStartTemporaryDetach() {
super.onStartTemporaryDetach();
mDraweeHolder.onDetach();
}
@Override
public void onFinishTemporaryDetach() {
super.onFinishTemporaryDetach();
mDraweeHolder.onAttach();
}
@Override
public void onUpdate(int progress) {
mProgressTextView.setText(progress + "%");
if (progress >= 100) {
mProgressTextView.setText("Handling GIF...");
}
}
private void close() {
try {
if (mGifDrawable != null && !mGifDrawable.isRecycled()) {
mGifDrawable.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}