package com.mhacks.android.chat; import android.graphics.*; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; import com.mhacks.android.R; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ProfilePictureCache { //Just let me know if this is silly, I'm wingin it Map<String, Bitmap> profilePictures; Map<ImageView, String> imageViewsWaiting; ArrayList<DownloadAndMaskImageTask> tasks; public ProfilePictureCache() { profilePictures = new HashMap<String, Bitmap>(); imageViewsWaiting = new HashMap<ImageView, String>(); tasks = new ArrayList<DownloadAndMaskImageTask>(); } public void loadImageURLIntoImageView(String imageUrl, ImageView imageView) { if (profilePictures.containsKey(imageUrl)) { if(imageViewsWaiting.containsKey(imageView)) { imageViewsWaiting.remove(imageView); } imageView.setImageBitmap(profilePictures.get(imageUrl)); } else { imageView.setImageResource(R.drawable.default_profile); imageViewsWaiting.put(imageView, imageUrl); if(!isImageAlreadyBeingLoaded(imageUrl)) { DownloadAndMaskImageTask newTask = new DownloadAndMaskImageTask(imageUrl); tasks.add(newTask); newTask.execute(); } } } private boolean isImageAlreadyBeingLoaded(String imageUrl) { for(DownloadAndMaskImageTask task : tasks) { if(task.getImageUrl().equals(imageUrl)) { return true; } } return false; } private class DownloadAndMaskImageTask extends AsyncTask<Void, Void, Bitmap> { private String imageUrl; public DownloadAndMaskImageTask(String imageUrl) { this.imageUrl = imageUrl; } public String getImageUrl() { return imageUrl; } protected Bitmap doInBackground(Void... voids) { Bitmap loadedBitmap = null; Bitmap circularBitmap = null; try { InputStream in = new java.net.URL(imageUrl).openStream(); loadedBitmap = BitmapFactory.decodeStream(in); BitmapShader shader = new BitmapShader(loadedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); Paint paint = new Paint(); paint.setShader(shader); paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setDither(true); circularBitmap = Bitmap.createBitmap(loadedBitmap.getWidth(), loadedBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(circularBitmap); canvas.drawCircle(loadedBitmap.getWidth() / 2, loadedBitmap.getHeight() / 2, loadedBitmap.getWidth() / 2, paint); } catch (Exception e) { e.printStackTrace(); } loadedBitmap.recycle(); return circularBitmap; } protected void onPostExecute(Bitmap bitmap) { ArrayList<ImageView> imageViewsWaitingForThisBitmap = new ArrayList<ImageView>(); for(Map.Entry entry : imageViewsWaiting.entrySet()) { if(entry.getValue().equals(imageUrl)) { imageViewsWaitingForThisBitmap.add((ImageView) entry.getKey()); } } if (bitmap != null) { //Set all of the waiting ImageViews for(ImageView imageView : imageViewsWaitingForThisBitmap) { imageView.setImageBitmap(bitmap); imageViewsWaiting.remove(imageView); } //Add it to the cache profilePictures.put(imageUrl, bitmap); } else { //Loading failed, remove the waiting ImageViews for(ImageView imageView : imageViewsWaitingForThisBitmap) { imageViewsWaiting.remove(imageView); } } tasks.remove(this); } } }