package com.jdroid.android.images.loader.uil; import android.graphics.Bitmap; import android.widget.ImageView; import com.jdroid.android.R; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.images.loader.ImageLoaderHelper; import com.jdroid.android.utils.SharedPreferencesHelper; import com.jdroid.java.concurrent.ExecutorUtils; import com.jdroid.java.date.DateUtils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.ImageSize; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.utils.DiskCacheUtils; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class UilImageLoaderHelper implements ImageLoaderHelper { private SharedPreferencesHelper sharedPreferencesHelper; private Map<String, Long> imagesExpirationMap; @Override @SuppressWarnings("unchecked") public synchronized void init() { if (sharedPreferencesHelper == null) { sharedPreferencesHelper = SharedPreferencesHelper.get("imageLoader"); // Create global configuration and initialize ImageLoader with this configuration DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions.Builder(); displayImageOptionsBuilder.cacheInMemory(true); displayImageOptionsBuilder.cacheOnDisk(true); ImageLoaderConfiguration.Builder configBuilder = new ImageLoaderConfiguration.Builder( AbstractApplication.get().getApplicationContext()); configBuilder.tasksProcessingOrder(QueueProcessingType.LIFO); configBuilder.defaultDisplayImageOptions(displayImageOptionsBuilder.build()); configBuilder.diskCacheSize(10 * 1024 * 1024); // configBuilder.writeDebugLogs(); ImageLoader.getInstance().init(configBuilder.build()); imagesExpirationMap = new ConcurrentHashMap<>( (Map<String, Long>)sharedPreferencesHelper.loadAllPreferences()); clearExpiredDiskCaches(); } } @Override public void displayImage(String url, ImageView imageView, Integer defaultImage, ImageLoadingListener imageLoadingListener, Long timeToLive) { init(); DisplayImageOptions.Builder optionsBuilder = new DisplayImageOptions.Builder(); optionsBuilder.cacheInMemory(true); optionsBuilder.cacheOnDisk(true); if (defaultImage != null) { optionsBuilder.showImageOnLoading(defaultImage); optionsBuilder.showImageForEmptyUri(defaultImage); optionsBuilder.showImageOnFail(defaultImage); } ImageLoader.getInstance().displayImage(url, imageView, optionsBuilder.build(), imageLoadingListener); registerDownload(url, timeToLive); } @Override public void displayImage(String url, ImageView imageView, Integer defaultImage) { displayImage(url, imageView, defaultImage, null, null); } @Override public Bitmap loadBitmap(String url, ImageScaleType imageScaleType, int width, int height, Long timeToLive) { init(); DisplayImageOptions.Builder optionsBuilder = new DisplayImageOptions.Builder(); optionsBuilder.cacheInMemory(true); optionsBuilder.cacheOnDisk(true); optionsBuilder.imageScaleType(imageScaleType); ImageSize imageSize = new ImageSize(width, height); registerDownload(url, timeToLive); return ImageLoader.getInstance().loadImageSync(url, imageSize, optionsBuilder.build()); } private void registerDownload(final String url, final Long timeToLive) { if ((url != null) && (timeToLive != null)) { ExecutorUtils.execute(new Runnable() { @Override public void run() { synchronized (UilImageLoaderHelper.class) { if (!imagesExpirationMap.containsKey(url)) { Long timestamp = DateUtils.nowMillis() + timeToLive; sharedPreferencesHelper.savePreference(url, timestamp); imagesExpirationMap.put(url, timestamp); } } } }); } } @Override public void clearExpiredDiskCaches() { ExecutorUtils.execute(new Runnable() { @Override public void run() { synchronized (UilImageLoaderHelper.class) { for (Map.Entry<String, Long> entry : imagesExpirationMap.entrySet()) { if (DateUtils.nowMillis() > entry.getValue()) { DiskCacheUtils.removeFromCache(entry.getKey(), ImageLoader.getInstance().getDiskCache()); sharedPreferencesHelper.removePreferences(entry.getKey()); imagesExpirationMap.remove(entry.getKey()); } } } } }); } @Override public void clearDiskCache() { ImageLoader.getInstance().clearDiskCache(); } @Override public void clearMemoryCache() { ImageLoader.getInstance().clearMemoryCache(); } @Override public Integer getLibraryNameResId() { return R.string.jdroid_universalImageLoaderTitle; } @Override public Integer getLibraryDescriptionResId() { return R.string.jdroid_universalImageLoaderDescription; } @Override public String getLibraryUrl() { return "https://github.com/nostra13/Android-Universal-Image-Loader"; } @Override public String getLibraryKey() { return "universalImageLoader"; } }