/*
* Created by Itzik Braun on 12/3/2015.
* Copyright (c) 2015 deluge. All rights reserved.
*
* Last Modification at: 3/12/15 4:27 PM
*/
package com.braunster.chatsdk.Utils.asynctask;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.braunster.chatsdk.R;
import com.braunster.chatsdk.Utils.Debug;
import com.braunster.chatsdk.Utils.ImageUtils;
import com.braunster.chatsdk.Utils.volley.VolleyUtils;
import com.braunster.chatsdk.adapter.abstracted.ChatSDKAbstractThreadsListAdapter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import timber.log.Timber;
/** Async task that craet mix images bitmap for the thread image.
*
* Before creating the new image the task will check to see if there is an image cached for this thread for the given amount of urls,
* This way if there was two images mix and now there need to be three the task will create a new image.
*
* */
public class MakeThreadImage extends AsyncTask<Bitmap, Void, Bitmap> {
protected static final String TAG = ChatSDKAbstractThreadsListAdapter.class.getSimpleName();
protected static final boolean DEBUG = Debug.ThreadsListAdapter;
private int width, height;
private WeakReference<LoadBitmapsForThreadImage> loadBitmapsForThreadImage;
private String cacheKey;
private int urlsLength = 0;
private ImageView image;
private ProgressBar progressBar;
@Override
protected void onCancelled() {
super.onCancelled();
if (loadBitmapsForThreadImage!=null && loadBitmapsForThreadImage.get() != null)
loadBitmapsForThreadImage.get().kill();
}
public MakeThreadImage(String[] urls, int width, int height, String cacheKey, ImageView image) {
this.width = width;
this.height = height;
this.cacheKey = cacheKey;
this.image = image;
urlsLength= urls.length;
// Loading from cache
if (VolleyUtils.getBitmapCache().contains(getCacheKey(cacheKey, urlsLength)))
{
image.setImageBitmap(VolleyUtils.getBitmapCache().getBitmap(getCacheKey(cacheKey, urlsLength)));
image.setVisibility(View.VISIBLE);
image.bringToFront();
}
// Creating an image.
else
{
loadBitmapsForThreadImage = new WeakReference<LoadBitmapsForThreadImage>(new LoadBitmapsForThreadImage(urls));
loadBitmapsForThreadImage.get().run();
}
}
@Override
protected Bitmap doInBackground(Bitmap... params) {
return ImageUtils.getMixImagesBitmap(width, height, params);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (bitmap != null)
{
// Save image to cache.
VolleyUtils.getBitmapCache().put(getCacheKey(cacheKey, urlsLength), bitmap);
}
if (!isCancelled())
{
if (bitmap != null) {
{
image.setImageBitmap(bitmap);
if (progressBar!=null)
{
progressBar.setVisibility(View.INVISIBLE);
image.setVisibility(View.VISIBLE);
}
}
} else setMultipleUserDefaultImg();
}
}
/**
* Load images for given urls array.
* After all images are loaded the runnable will execute the makeThreadImage AsyncTask.
* * */
private class LoadBitmapsForThreadImage implements Runnable {
private LoadBitmapsForThreadImage(String[] urls) {
this.urls = urls;
}
private boolean killed = false;
private int loadedCount = 0;
/** Bitmaps that was loaded*/
private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
/** Given urls to load*/
private String[] urls;
/** To keep track of urls that caused an error so we wont count them twice.*/
private List<String> errorUrls = new ArrayList<String>();
public void kill() {
this.killed = true;
}
private void load(final String... urls) {
this.urls = urls;
for (final String url : urls) {
VolleyUtils.getImageLoader().get(url, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (killed)
return;
if (response.getBitmap() != null) {
bitmaps.add(response.getBitmap());
loadedCount++;
dispatchFinishedIfDid();
}
}
@Override
public void onErrorResponse(VolleyError error) {
if (killed)
return;
if (!errorUrls.contains(url))
{
loadedCount++;
if (DEBUG) Timber.e("Image Load Error: %s", error.getMessage());
errorUrls.add(url);
dispatchFinishedIfDid();
}
}
});
}
}
private void dispatchFinishedIfDid(){
if (killed)
return;
if (urls.length == loadedCount)
{
MakeThreadImage.this.execute(bitmaps.toArray(new Bitmap[bitmaps.size()]));
}
}
@Override
public void run() {
load(urls);
}
}
public void setMultipleUserDefaultImg(){
image.setImageResource(R.drawable.ic_users);
}
public static String getCacheKey(String key, int size){
return key + "S" + size;
}
public void setProgressBar(ProgressBar progressBar) {
this.progressBar = progressBar;
}
}