package com.vt.vthacks.view;
import java.lang.ref.WeakReference;
import java.util.List;
import com.vt.vthacks.R;
import com.vt.vthacks.model.IPhotoStreamItem;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class PhotoStreamAdapter extends ArrayAdapter<IPhotoStreamItem> {
public interface OnImageClickListener {
public void onImageClicked(Bitmap bitmap);
}
private LayoutInflater mInflater;
private OnImageClickListener clickListener;
public PhotoStreamAdapter(Context context, List<IPhotoStreamItem> listItems, OnImageClickListener clickListener) {
super(context, 0, listItems);
this.clickListener = clickListener;
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final IPhotoStreamItem item = getItem(position);
final PhotoStreamItemViewHolder photoStreamViewHolder;
if (convertView == null) {
ViewGroup rootView = (ViewGroup)mInflater.inflate(R.layout.photo_stream_row, parent, false);
photoStreamViewHolder = PhotoStreamItemViewHolder.create(rootView);
rootView.setTag(photoStreamViewHolder);
}
else {
photoStreamViewHolder = (PhotoStreamItemViewHolder)convertView.getTag();
}
LoadBitmapTask task = new LoadBitmapTask(photoStreamViewHolder, item);
if (photoStreamViewHolder.getTask() != null) {
photoStreamViewHolder.getTask().cancel(true);
}
photoStreamViewHolder.setTask(task);
task.execute();
photoStreamViewHolder.userTextView.setText(item.getUser());
photoStreamViewHolder.textView.setText(item.getText());
photoStreamViewHolder.rootView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (photoStreamViewHolder.imageView.getDrawable() instanceof BitmapDrawable) {
clickListener.onImageClicked(
((BitmapDrawable)photoStreamViewHolder.imageView.getDrawable()).getBitmap());
}
}
});
return photoStreamViewHolder.rootView;
}
private static class PhotoStreamItemViewHolder {
public final ViewGroup rootView;
public final TextView userTextView;
public final ImageView userImageView;
public final TextView textView;
public final ImageView imageView;
public final ProgressBar progressBar;
private LoadBitmapTask task;
private PhotoStreamItemViewHolder(ViewGroup rootView, TextView userTextView, ImageView userImageView,
TextView textView, ImageView imageView, ProgressBar progressBar) {
this.rootView = rootView;
this.userTextView = userTextView;
this.userImageView = userImageView;
this.textView = textView;
this.imageView = imageView;
this.progressBar = progressBar;
}
public LoadBitmapTask getTask() {
return task;
}
public void setTask(LoadBitmapTask task) {
this.task = task;
}
public static PhotoStreamItemViewHolder create(ViewGroup rootView) {
TextView userTextView = (TextView)rootView.findViewById(R.id.userTextView);
ImageView userImageView = (ImageView)rootView.findViewById(R.id.userImageView);
TextView textView = (TextView)rootView.findViewById(R.id.textView);
ImageView imageView = (ImageView)rootView.findViewById(R.id.imageView);
ProgressBar progressBar = (ProgressBar)rootView.findViewById(R.id.progressBar);
return new PhotoStreamItemViewHolder(rootView, userTextView, userImageView,
textView, imageView, progressBar);
}
}
private class LoadBitmapTask extends AsyncTask<Void, Void, Bitmap[]> {
private WeakReference<PhotoStreamItemViewHolder> viewHolderRef;
private IPhotoStreamItem item;
public LoadBitmapTask(PhotoStreamItemViewHolder viewHolder, IPhotoStreamItem item) {
this.viewHolderRef = new WeakReference<PhotoStreamItemViewHolder>(viewHolder);
this.item = item;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (viewHolderRef != null) {
PhotoStreamItemViewHolder viewHolder = viewHolderRef.get();
if (viewHolder != null) {
viewHolder.progressBar.setVisibility(View.VISIBLE);
viewHolder.userImageView.setImageBitmap(null);
viewHolder.imageView.setImageBitmap(null);
}
}
}
@Override
protected Bitmap[] doInBackground(Void... params) {
if (item == null) {
return null;
}
return new Bitmap[] {item.getUserImage(), item.getImage()};
}
protected void onPostExecute(Bitmap[] bitmaps) {
super.onPostExecute(bitmaps);
if (viewHolderRef != null && !isCancelled()) {
PhotoStreamItemViewHolder viewHolder = viewHolderRef.get();
if (viewHolder != null) {
viewHolder.progressBar.setVisibility(View.GONE);
viewHolder.userImageView.setImageBitmap(bitmaps[0]);
viewHolder.imageView.setImageBitmap(bitmaps[1]);
}
}
}
}
}