package ryan.com.commonsware.cwac.thumbnail; import ryan.com.commonsware.cwac.cache.SimpleWebImageCache; import com.commonsware.cwac.adapter.AdapterWrapper; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Bitmap.Config; import android.graphics.PorterDuff.Mode; import android.graphics.drawable.BitmapDrawable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListAdapter; public class ThumbnailAdapter extends AdapterWrapper { private static final String TAG="ThumbnailAdapter"; private int[] imageIds; private SimpleWebImageCache<ThumbnailBus, ThumbnailMessage> cache=null; private Activity host=null; Bitmap bdRounded; /** * Constructor wrapping a supplied ListAdapter */ public ThumbnailAdapter(Activity host, ListAdapter wrapped, SimpleWebImageCache<ThumbnailBus, ThumbnailMessage> cache, int[] imageIds) { super(wrapped); this.host=host; this.imageIds=imageIds; this.cache=cache; cache.getBus().register(getBusKey(), onCache); } public void close() { cache.getBus().unregister(onCache); } /** * Get a View that displays the data at the specified * position in the data set. In this case, if we are at * the end of the list and we are still in append mode, * we ask for a pending view and return it, plus kick * off the background task to append more data to the * wrapped adapter. * @param position Position of the item whose data we want * @param convertView View to recycle, if not null * @param parent ViewGroup containing the returned View */ @Override public View getView(int position, View convertView, ViewGroup parent) { View result=super.getView(position, convertView, parent); processView(result); return(result); } public void processView(View row) { for (int imageId : imageIds) { ImageView image=(ImageView)row.findViewById(imageId); if (image!=null && image.getTag()!=null) { ThumbnailMessage msg=cache .getBus() .createMessage(getBusKey()); msg.setImageView(image); msg.setUrl(image.getTag().toString()); try { cache.notify(msg.getUrl(), msg); } catch (Throwable t) { Log.e(TAG, "Exception trying to fetch image", t); } } } } private String getBusKey() { return(toString()); } private ThumbnailBus.Receiver<ThumbnailMessage> onCache= new ThumbnailBus.Receiver<ThumbnailMessage>() { public void onReceive(final ThumbnailMessage message) { final ImageView image=message.getImageView(); host.runOnUiThread(new Runnable() { public void run() { if (image.getTag()!=null && image.getTag().toString().equals(message.getUrl())) { BitmapDrawable bd = (BitmapDrawable) cache.get(message.getUrl()); bdRounded = getRoundedCornerBitmap(bd.getBitmap()); if (bdRounded != null){ image.setImageBitmap(bdRounded); } else{ image.setImageDrawable(cache.get(message.getUrl())); } } } }); } }; public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { if (bitmap != null) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = 4; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } else { return bitmap; } } }