package cn.trinea.android.common.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;
import cn.trinea.android.common.entity.CacheObject;
import cn.trinea.android.common.entity.FailedReason;
import cn.trinea.android.common.service.impl.FileNameRuleImageUrl;
import cn.trinea.android.common.service.impl.ImageCache;
import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener;
import cn.trinea.android.common.service.impl.ImageSDCardCache;
import cn.trinea.android.common.service.impl.ImageSDCardCache.OnImageSDCallbackListener;
import cn.trinea.android.common.service.impl.PreloadDataCache.OnGetDataListener;
import cn.trinea.android.common.service.impl.RemoveTypeLastUsedTimeFirst;
/**
* ImageCacheManager
*
* @author maxiaohui hackooo@sina.cn 2014-2-14
*/
public class ImageCacheManager {
public static final String TAG = "ImageCacheManager";
private static ImageCache imageCache = null;
private static ImageSDCardCache imageSDCardCache = null;
private ImageCacheManager() {
throw new AssertionError();
}
/**
* get the singleton instance of {@link ImageCache}
*
* @return
*/
public static ImageCache getImageCache() {
if (imageCache == null) {
synchronized (CacheManager.class) {
if (imageCache == null) {
imageCache = new ImageCache(128, 512);
setImageCache();
}
}
}
return imageCache;
}
/**
* get the singleton instance of {@link ImageSDCardCache}
*
* @return
*/
public static ImageSDCardCache getImageSDCardCache() {
if (imageSDCardCache == null) {
synchronized (CacheManager.class) {
if (imageSDCardCache == null) {
imageSDCardCache = new ImageSDCardCache();
setImageSDCardCache();
}
}
}
return imageSDCardCache;
}
/**
* set ImageCache properties
*/
private static void setImageCache() {
if (imageCache == null) {
return;
}
OnImageCallbackListener imageCallBack = new OnImageCallbackListener() {
@Override
public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) {
if (view != null && loadedImage != null) {
if (view instanceof ImageView) {
ImageView imageView = (ImageView)view;
imageView.setImageBitmap(loadedImage);
// first time show with animation
if (!isInCache) {
imageView.startAnimation(getInAlphaAnimation(2000));
}
} else {
Log.e(TAG,
"View is not instance of ImageView, you need to setOnImageCallbackListener() by your self");
}
}
}
@Override
public void onPreGet(String imageUrl, View view) {}
@Override
public void onGetFailed(String imageUrl, Bitmap loadedImage, View view, FailedReason failedReason) {}
@Override
public void onGetNotInCache(String imageUrl, View view) {}
};
imageCache.setOnImageCallbackListener(imageCallBack);
imageCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst<Bitmap>());
imageCache.setHttpReadTimeOut(10000);
imageCache.setValidTime(-1);
}
/**
* set ImageSDCardCache properties
*/
private static void setImageSDCardCache() {
if (imageSDCardCache == null) {
return;
}
OnImageSDCallbackListener imageCallBack = new OnImageSDCallbackListener() {
private static final long serialVersionUID = 1L;
@Override
public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) {
if (view != null && view instanceof ImageView) {
ImageView imageView = (ImageView)view;
// if oom please use BitmapFactory.decodeFile(imagePath, option)
Bitmap bm = BitmapFactory.decodeFile(imagePath);
if (bm != null) {
imageView.setImageBitmap(bm);
// first time show with animation
if (!isInCache) {
imageView.startAnimation(getInAlphaAnimation(2000));
}
}
} else {
Log.e(TAG,
"View is not instance of ImageView, you need to setOnImageSDCallbackListener() by your self");
}
}
@Override
public void onPreGet(String imageUrl, View view) {}
@Override
public void onGetNotInCache(String imageUrl, View view) {}
@Override
public void onGetFailed(String imageUrl, String imagePath, View view, FailedReason failedReason) {}
};
imageSDCardCache.setOnImageSDCallbackListener(imageCallBack);
imageSDCardCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst<String>());
imageSDCardCache.setFileNameRule(new FileNameRuleImageUrl());
imageSDCardCache.setHttpReadTimeOut(10000);
imageSDCardCache.setValidTime(-1);
}
public static AlphaAnimation getInAlphaAnimation(long durationMillis) {
AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1);
inAlphaAnimation.setDuration(durationMillis);
return inAlphaAnimation;
}
/**
* get image from sdcard listener
*
* @return
*/
public static OnGetDataListener<String, Bitmap> getImageFromSdcardListener() {
return new OnGetDataListener<String, Bitmap>() {
private static final long serialVersionUID = 1L;
@Override
public CacheObject<Bitmap> onGetData(String key) {
if (FileUtils.isFileExist(key)) {
// if oom please use BitmapFactory.decodeFile(imagePath, option),like this
// BitmapFactory.Options option = new BitmapFactory.Options();
// option.inSampleSize = 2;
// b = BitmapFactory.decodeFile(key, option);
return new CacheObject<Bitmap>(BitmapFactory.decodeFile(key));
} else
return null;
}
};
}
}