package com.quickblox.sample.content.adapter;
import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.quickblox.content.model.QBFile;
import com.quickblox.sample.content.R;
import com.quickblox.sample.content.helper.DownloadMoreListener;
import com.quickblox.sample.content.utils.Consts;
import com.quickblox.sample.content.utils.QBContentUtils;
import com.quickblox.sample.core.ui.adapter.BaseListAdapter;
public class GalleryAdapter extends BaseListAdapter<QBFile> {
private SparseArray<QBFile> qbFileSparseArray;
private DownloadMoreListener downloadListener;
private int previousGetCount = 0;
public GalleryAdapter(Context context, SparseArray<QBFile> qbFileSparseArray) {
super(context);
this.qbFileSparseArray = qbFileSparseArray;
}
@Override
public int getCount() {
return qbFileSparseArray.size();
}
@Override
public QBFile getItem(int position) {
return qbFileSparseArray.valueAt(position);
}
@Override
public long getItemId(int position) {
return qbFileSparseArray.keyAt(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_gallery, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image_preview);
holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progress_bar_adapter);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
QBFile qbFile = getItem(position);
loadImage(holder, qbFile);
downloadMore(position);
return convertView;
}
private void downloadMore(int position) {
int count = getCount();
if (count - 1 == position) {
if (count != previousGetCount) {
downloadListener.downloadMore();
previousGetCount = count;
}
}
}
public void updateData(SparseArray<QBFile> qbFileSparseArray) {
this.qbFileSparseArray = qbFileSparseArray;
notifyDataSetChanged();
}
private void loadImage(final ViewHolder holder, QBFile qbFile) {
holder.progressBar.setVisibility(View.VISIBLE);
Priority customPriority = qbFile.getSize() > Consts.PRIORITY_MAX_IMAGE_SIZE
? Priority.LOW
: Priority.NORMAL;
Glide.with(context)
.load(QBContentUtils.getUrl(qbFile))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.priority(customPriority)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model,
Target<GlideDrawable> target, boolean isFirstResource) {
holder.progressBar.setVisibility(View.GONE);
holder.imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache,
boolean isFirstResource) {
holder.progressBar.setVisibility(View.GONE);
holder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return false;
}
})
.error(R.drawable.ic_error)
.dontAnimate()
.dontTransform()
.override(Consts.PREFERRED_IMAGE_WIDTH_PREVIEW, Consts.PREFERRED_IMAGE_HEIGHT_PREVIEW)
.into(holder.imageView);
}
public void setDownloadMoreListener(DownloadMoreListener downloadListener) {
this.downloadListener = downloadListener;
}
private static class ViewHolder {
ImageView imageView;
ProgressBar progressBar;
}
}