package net.frakbot.imageviewex.operation; import net.frakbot.cache.CacheHelper; import net.frakbot.imageviewex.Converters; import net.frakbot.imageviewex.ImageViewNext; import net.frakbot.imageviewex.requestmanager.ImageViewExRequestFactory; import android.content.Context; import android.os.Bundle; import android.support.v4.util.LruCache; import com.foxykeep.datadroid.exception.ConnectionException; import com.foxykeep.datadroid.exception.CustomRequestException; import com.foxykeep.datadroid.exception.DataException; import com.foxykeep.datadroid.requestmanager.Request; import com.foxykeep.datadroid.service.RequestService.Operation; import com.jakewharton.DiskLruCache; import com.jakewharton.DiskLruCache.Snapshot; /** * Operation to search for an image in the disk cache. * Requested input: * - ImageMemCacheOperation.PARAM_IMAGE_URL, the URL of the image * Given output: * - ImageViewExRequestFactory.BUNDLE_EXTRA_OBJECT, the byte array of the image * * @author Francesco Pontillo * */ public class ImageDiskCacheOperation implements Operation { public static final String PARAM_IMAGE_URL = "net.frakbot.imageviewex.extra.url"; @Override public Bundle execute(Context context, Request request) throws ConnectionException, DataException, CustomRequestException { // Get the URL from the input Bundle String url = request.getString(PARAM_IMAGE_URL); if (url == null || url.equals("")) throw new DataException("No value for URL " + url); // Initializes the caches, if they're not initialized already ImageViewNext.initCaches(context); // Get the entry DiskLruCache diskCache = ImageViewNext.getDiskCache(); Snapshot cacheEntry = null; try { cacheEntry = diskCache.get(CacheHelper.UriToDiskLruCacheString(url)); } catch (Exception e) { throw new DataException("DISK CACHE: Error while getting value for URL " + url); } byte[] image = null; // If the object is not null, convert it if (cacheEntry != null) { // Convert the InputStream image = Converters.inputStreamToByteArray( cacheEntry.getInputStream(0), (int)cacheEntry.getLength(0)); // Saves the image in the in-memory cache LruCache<String, byte[]> memCache = ImageViewNext.getMemCache(); memCache.put(url, image); } Bundle b = new Bundle(); b.putByteArray(ImageViewExRequestFactory.BUNDLE_EXTRA_OBJECT, image); return b; } }