package org.emdev.common.textmarkup.image; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import java.io.File; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; import org.emdev.common.cache.CacheManager; public class DiskImageData extends AbstractImageData implements Runnable { final AtomicReference<File> file = new AtomicReference<File>(); final AtomicReference<MemoryImageData> cachedData; final Options imageSize; public DiskImageData(final MemoryImageData data) { cachedData = new AtomicReference<MemoryImageData>(data); imageSize = data.getImageSize(); this.run(); } @Override public Bitmap getBitmap() { final File f = file.get(); if (f != null) { return BitmapFactory.decodeFile(f.getAbsolutePath()); } final MemoryImageData data = cachedData.get(); if (data != null) { return data.getBitmap(); } return null; } @Override public void recycle() { MemoryImageData data = cachedData.getAndSet(null); if (data != null) { data.recycle(); } } @Override protected Options getImageSize() { return imageSize; } @Override public void run() { Thread.currentThread().setPriority(8); try { if (file.get() != null) { return; } final MemoryImageData data = cachedData.get(); if (data == null) { return; } final File f = store(data); if (f != null) { file.set(f); cachedData.set(null); data.data = null; data.encoded = null; } } catch (final Throwable th) { th.printStackTrace(); } } private static File store(final MemoryImageData data) { try { final byte[] d = data.getData(); final File file = CacheManager.createTempFile(d, ".fb2.img"); return file; } catch (final IOException ex) { ex.printStackTrace(); } return null; } }