package com.stfalcon.frescoimageviewer; import android.content.Context; import android.graphics.drawable.Animatable; import android.net.Uri; import android.view.View; import android.view.ViewGroup; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.stfalcon.frescoimageviewer.adapter.RecyclingPagerAdapter; import com.stfalcon.frescoimageviewer.adapter.ViewHolder; import com.stfalcon.frescoimageviewer.drawee.ZoomableDraweeView; import java.util.HashSet; import me.relex.photodraweeview.OnScaleChangeListener; /* * Created by troy379 on 07.12.16. */ class ImageViewerAdapter extends RecyclingPagerAdapter<ImageViewerAdapter.ImageViewHolder> { private Context context; private ImageViewer.DataSet<?> dataSet; private HashSet<ImageViewHolder> holders; private ImageRequestBuilder imageRequestBuilder; private GenericDraweeHierarchyBuilder hierarchyBuilder; private boolean isZoomingAllowed; ImageViewerAdapter(Context context, ImageViewer.DataSet<?> dataSet, ImageRequestBuilder imageRequestBuilder, GenericDraweeHierarchyBuilder hierarchyBuilder, boolean isZoomingAllowed) { this.context = context; this.dataSet = dataSet; this.holders = new HashSet<>(); this.imageRequestBuilder = imageRequestBuilder; this.hierarchyBuilder = hierarchyBuilder; this.isZoomingAllowed = isZoomingAllowed; } @Override public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ZoomableDraweeView drawee = new ZoomableDraweeView(context); drawee.setEnabled(isZoomingAllowed); ImageViewHolder holder = new ImageViewHolder(drawee); holders.add(holder); return holder; } @Override public void onBindViewHolder(ImageViewHolder holder, int position) { holder.bind(position); } @Override public int getItemCount() { return dataSet.getData().size(); } boolean isScaled(int index) { for (ImageViewHolder holder : holders) { if (holder.position == index) { return holder.isScaled; } } return false; } void resetScale(int index) { for (ImageViewHolder holder : holders) { if (holder.position == index) { holder.resetScale(); break; } } } String getUrl(int index) { return dataSet.format(index); } private BaseControllerListener<ImageInfo> getDraweeControllerListener(final ZoomableDraweeView drawee) { return new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); if (imageInfo == null) { return; } drawee.update(imageInfo.getWidth(), imageInfo.getHeight()); } }; } class ImageViewHolder extends ViewHolder implements OnScaleChangeListener { private int position = -1; private ZoomableDraweeView drawee; private boolean isScaled; ImageViewHolder(View itemView) { super(itemView); drawee = (ZoomableDraweeView) itemView; } void bind(int position) { this.position = position; tryToSetHierarchy(); setController(dataSet.format(position)); drawee.setOnScaleChangeListener(this); } @Override public void onScaleChange(float scaleFactor, float focusX, float focusY) { isScaled = drawee.getScale() > 1.0f; } void resetScale() { drawee.setScale(1.0f, true); } private void tryToSetHierarchy() { if (hierarchyBuilder != null) { hierarchyBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER); drawee.setHierarchy(hierarchyBuilder.build()); } } private void setController(String url) { PipelineDraweeControllerBuilder controllerBuilder = Fresco.newDraweeControllerBuilder(); controllerBuilder.setUri(url); controllerBuilder.setOldController(drawee.getController()); controllerBuilder.setControllerListener(getDraweeControllerListener(drawee)); if (imageRequestBuilder != null) { imageRequestBuilder.setSource(Uri.parse(url)); controllerBuilder.setImageRequest(imageRequestBuilder.build()); } drawee.setController(controllerBuilder.build()); } } }