package cn.crane.framework.view.smartimage;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.TextView;
public class SmartImageView extends ImageView {
private static final int LOADING_THREADS = 4;
private static ExecutorService threadPool = Executors
.newFixedThreadPool(SmartImageView.LOADING_THREADS);
private SmartImageTask currentTask;
private boolean roundCorner = false;
private float roundPx = 10;
private float fDensity = 1.0f;
public void setRoundCorner(boolean roundCorner) {
this.roundCorner = roundCorner;
}
public SmartImageView(Context context) {
super(context);
fDensity = getResources().getDisplayMetrics().density;
roundPx = 10 * fDensity;
}
public SmartImageView(Context context, AttributeSet attrs) {
super(context, attrs);
fDensity = getResources().getDisplayMetrics().density;
roundPx = 10 * fDensity;
}
public SmartImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
fDensity = getResources().getDisplayMetrics().density;
roundPx = 10 * fDensity;
}
// Helpers to set image by URL
public void setImageUrl(String url) {
this.setImage(new WebImage(url));
}
public void setImageUrl(String url,
SmartImageTask.OnCompleteListener completeListener) {
this.setImage(new WebImage(url), completeListener);
}
public void setImageUrl(String url, final Integer fallbackResource) {
this.setImage(new WebImage(url), fallbackResource);
}
public void setImageUrl(String url, final Integer fallbackResource,
SmartImageTask.OnCompleteListener completeListener) {
this.setImage(new WebImage(url), fallbackResource, completeListener);
}
public void setImageUrl(String url, final Integer fallbackResource,
final Integer loadingResource) {
this.setImage(new WebImage(url), fallbackResource, loadingResource);
}
public void setImageUrl(String url, final Integer fallbackResource,
final Integer loadingResource,
SmartImageTask.OnCompleteListener completeListener) {
if(!TextUtils.isEmpty(url))
{
url.replaceAll("//", "/");
}
this.setImage(new WebImage(url), fallbackResource, loadingResource,
completeListener);
}
// Helpers to set image by contact address book id
public void setImageContact(long contactId) {
this.setImage(new ContactImage(contactId));
}
public void setImageContact(long contactId, final Integer fallbackResource) {
this.setImage(new ContactImage(contactId), fallbackResource);
}
public void setImageContact(long contactId, final Integer fallbackResource,
final Integer loadingResource) {
this.setImage(new ContactImage(contactId), fallbackResource,
fallbackResource);
}
// Set image using SmartImage object
public void setImage(final SmartImage image) {
this.setImage(image, null, null, null);
}
public void setImage(final SmartImage image,
final SmartImageTask.OnCompleteListener completeListener) {
this.setImage(image, null, null, completeListener);
}
public void setImage(final SmartImage image, final Integer fallbackResource) {
this.setImage(image, fallbackResource, fallbackResource, null);
}
public void setImage(final SmartImage image,
final Integer fallbackResource,
SmartImageTask.OnCompleteListener completeListener) {
this.setImage(image, fallbackResource, fallbackResource,
completeListener);
}
public void setImage(final SmartImage image,
final Integer fallbackResource, final Integer loadingResource) {
this.setImage(image, fallbackResource, loadingResource, null);
}
public void setImage(final SmartImage image,
final Integer fallbackResource, final Integer loadingResource,
final SmartImageTask.OnCompleteListener completeListener) {
// Set a loading resource
if (loadingResource != null) {
this.setImageResource(loadingResource);
}
// Cancel any existing tasks for this image view
if (this.currentTask != null) {
this.currentTask.cancel();
this.currentTask = null;
}
// Set up the new task
this.currentTask = new SmartImageTask(this.getContext(), image);
this.currentTask
.setOnCompleteHandler(new SmartImageTask.OnCompleteHandler() {
@Override
public void onComplete(Bitmap bitmap) {
if (bitmap != null) {
if (roundCorner) {
// bitmap = ImageUtils.getRoundedCornerBitmap(
// bitmap, roundPx);
}
SmartImageView.this.setImageBitmap(bitmap);
} else {
// Set fallback resource
if (fallbackResource != null) {
SmartImageView.this
.setImageResource(fallbackResource);
}
}
if (completeListener != null) {
completeListener.onComplete();
}
}
});
// Run the task in a threadpool
SmartImageView.threadPool.execute(this.currentTask);
}
public void setBackGroundUrl(String url) {
this.setBackgroundImage(new WebImage(url), 0, 0, null);
}
public void setBackgroundImage(final SmartImage image,
final Integer fallbackResource, final Integer loadingResource,
final SmartImageTask.OnCompleteListener completeListener) {
// Set a loading resource
if (loadingResource != null) {
this.setBackgroundResource(loadingResource);
}
// Cancel any existing tasks for this image view
if (this.currentTask != null) {
this.currentTask.cancel();
this.currentTask = null;
}
// Set up the new task
this.currentTask = new SmartImageTask(this.getContext(), image);
this.currentTask
.setOnCompleteHandler(new SmartImageTask.OnCompleteHandler() {
@Override
public void onComplete(Bitmap bitmap) {
if (bitmap != null) {
SmartImageView.this
.setBackgroundDrawable(convertBitmap2Drawable(bitmap));
} else {
// Set fallback resource
if (fallbackResource != null) {
SmartImageView.this
.setBackgroundResource(fallbackResource);
}
}
if (completeListener != null) {
completeListener.onComplete();
}
}
});
// Run the task in a threadpool
SmartImageView.threadPool.execute(this.currentTask);
}
public static void cancelAllTasks() {
SmartImageView.threadPool.shutdownNow();
SmartImageView.threadPool = Executors
.newFixedThreadPool(SmartImageView.LOADING_THREADS);
}
/**
* Bitmap to Drawable
*
* @param bitmap
* @return
*/
public Drawable convertBitmap2Drawable(Bitmap bitmap) {
if (roundCorner) {
// bitmap = ImageUtils.getRoundedCornerBitmap(bitmap, roundPx);
}
return new BitmapDrawable(bitmap);
}
}