package com.octo.android.robospice.persistence.binary; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.io.IOUtils; import android.app.Application; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import com.octo.android.robospice.persistence.exception.CacheCreationException; import com.octo.android.robospice.persistence.exception.CacheLoadingException; import com.octo.android.robospice.persistence.exception.CacheSavingException; import com.octo.android.robospice.persistence.file.InFileObjectPersister; /** * Stores and retrieves bitmaps to/from file system. Support custom * {@link android.graphics.BitmapFactory.Options} to lower disk usage. * @author David Stemmer */ public class InFileBitmapObjectPersister extends InFileObjectPersister<Bitmap> { private static final int DEFAULT_QUALITY = 100; private Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.PNG; private BitmapFactory.Options decodingOptions = null; private int quality = DEFAULT_QUALITY; public InFileBitmapObjectPersister(Application application) throws CacheCreationException { super(application, Bitmap.class); } public InFileBitmapObjectPersister(Application application, File cacheFolder) throws CacheCreationException { super(application, Bitmap.class, cacheFolder); } @Override protected Bitmap readCacheDataFromFile(File file) throws CacheLoadingException { Bitmap data; FileInputStream is = null; try { is = new FileInputStream(file.getAbsolutePath()); data = BitmapFactory.decodeStream(is, null, decodingOptions); } catch (Throwable ex) { throw new CacheLoadingException(String.format("Found the file %s but could not decode bitmap.", file.getAbsolutePath()), ex); } finally { if (is != null) { IOUtils.closeQuietly(is); } } if (data == null) { throw new CacheLoadingException(String.format("Found the file %s but could not decode bitmap.", file.getAbsolutePath())); } return data; } @Override public Bitmap saveDataToCacheAndReturnData(Bitmap data, Object cacheKey) throws CacheSavingException { BufferedOutputStream out = null; try { File cacheFile = getCacheFile(cacheKey); out = new BufferedOutputStream(new FileOutputStream(cacheFile)); boolean didCompress = data.compress(compressFormat, quality, out); if (!didCompress) { throw new CacheSavingException(String.format("Could not compress bitmap for path: %s", getCacheFile(cacheKey).getAbsolutePath())); } return data; } catch (IOException e) { throw new CacheSavingException(e); } finally { IOUtils.closeQuietly(out); } } public BitmapFactory.Options getDecodingOptions() { return decodingOptions; } public void setDecodingOptions(BitmapFactory.Options decodingOptions) { this.decodingOptions = decodingOptions; } public Bitmap.CompressFormat getCompressFormat() { return compressFormat; } public void setCompressFormat(Bitmap.CompressFormat compressFormat) { this.compressFormat = compressFormat; } public int getQuality() { return quality; } public void setQuality(int quality) { this.quality = quality; } }