diff options
author | Sam Judd <judds@google.com> | 2014-06-30 21:10:41 -0700 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2014-07-02 15:53:49 -0700 |
commit | 0db3c45b412be1a5bfcb1da046836e89d3ffd0b4 (patch) | |
tree | bad0de839de5ba61d0bc0b35b72455048d4be58f /library | |
parent | 20b43f38eeddc90706aedea7d5a4a10e21524f73 (diff) | |
download | glide-0db3c45b412be1a5bfcb1da046836e89d3ffd0b4.tar.gz |
Get Files rather than InputStreams from cache.
Diffstat (limited to 'library')
37 files changed, 441 insertions, 210 deletions
diff --git a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java index 9d43c8cc..98c34848 100644 --- a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java @@ -5,6 +5,7 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.ParcelFileDescriptor; import android.view.animation.Animation; + import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -25,6 +26,7 @@ import com.bumptech.glide.provider.LoadProvider; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.ViewPropertyAnimation; +import java.io.File; import java.io.InputStream; /** @@ -121,7 +123,7 @@ public class BitmapRequestBuilder<ModelType, TranscodeType> extends GenericReque @Override public BitmapRequestBuilder<ModelType, TranscodeType> cacheDecoder( - ResourceDecoder<InputStream, Bitmap> cacheDecoder) { + ResourceDecoder<File, Bitmap> cacheDecoder) { super.cacheDecoder(cacheDecoder); return this; } diff --git a/library/src/main/java/com/bumptech/glide/DataLoadProvider.java b/library/src/main/java/com/bumptech/glide/DataLoadProvider.java index 9fa77a6c..0319e3c6 100644 --- a/library/src/main/java/com/bumptech/glide/DataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/DataLoadProvider.java @@ -4,7 +4,7 @@ import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import java.io.InputStream; +import java.io.File; /** * @param <T> The type of data the resource will be decoded from. @@ -12,7 +12,7 @@ import java.io.InputStream; */ public interface DataLoadProvider<T, Z> { - public ResourceDecoder<InputStream, Z> getCacheDecoder(); + public ResourceDecoder<File, Z> getCacheDecoder(); public ResourceDecoder<T, Z> getSourceDecoder(); diff --git a/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java b/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java index c7159598..03021ba2 100644 --- a/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.view.animation.Animation; + import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; @@ -18,7 +19,7 @@ import com.bumptech.glide.request.DrawableCrossFadeViewAnimation; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.ViewPropertyAnimation; -import java.io.InputStream; +import java.io.File; public class DrawableRequestBuilder<ModelType> extends GenericRequestBuilder<ModelType, ImageVideoWrapper, GifBitmapWrapper, Drawable> { @@ -68,7 +69,7 @@ public class DrawableRequestBuilder<ModelType> extends @Override public DrawableRequestBuilder<ModelType> cacheDecoder( - ResourceDecoder<InputStream, GifBitmapWrapper> cacheDecoder) { + ResourceDecoder<File, GifBitmapWrapper> cacheDecoder) { super.cacheDecoder(cacheDecoder); return this; } diff --git a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java index 53ffd7b4..4beb7318 100644 --- a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java @@ -9,9 +9,9 @@ import android.widget.ImageView; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.MultiTransformation; +import com.bumptech.glide.load.NullResourceEncoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import com.bumptech.glide.load.SkipCache; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.UnitTransformation; import com.bumptech.glide.load.model.ModelLoader; @@ -36,7 +36,7 @@ import com.bumptech.glide.request.target.BitmapImageViewTarget; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.util.Util; -import java.io.InputStream; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -200,7 +200,7 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT } public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> cacheDecoder( - ResourceDecoder <InputStream, ResourceType> cacheDecoder) { + ResourceDecoder <File, ResourceType> cacheDecoder) { // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to // ignore the decoder. if (loadProvider != null) { @@ -472,8 +472,8 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT if (loadProvider != null) { preSkipEncoder = loadProvider.getEncoder(); } - final SkipCache<ResourceType> skipCache = SkipCache.get(); - return encoder(skipCache); + final NullResourceEncoder<ResourceType> nullResourceEncoder = NullResourceEncoder.get(); + return encoder(nullResourceEncoder); } else { return encoder(preSkipEncoder); } diff --git a/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java index 60cb6828..8edfd55f 100644 --- a/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.view.animation.Animation; + import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; @@ -18,6 +19,7 @@ import com.bumptech.glide.provider.LoadProvider; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.ViewPropertyAnimation; +import java.io.File; import java.io.InputStream; public class GifRequestBuilder<ModelType, TranscodeType> @@ -65,7 +67,7 @@ public class GifRequestBuilder<ModelType, TranscodeType> @Override public GifRequestBuilder<ModelType, TranscodeType> cacheDecoder( - ResourceDecoder<InputStream, GifData> cacheDecoder) { + ResourceDecoder<File, GifData> cacheDecoder) { super.cacheDecoder(cacheDecoder); return this; } diff --git a/library/src/main/java/com/bumptech/glide/load/CacheLoader.java b/library/src/main/java/com/bumptech/glide/load/CacheLoader.java index d18789f2..a25c770d 100644 --- a/library/src/main/java/com/bumptech/glide/load/CacheLoader.java +++ b/library/src/main/java/com/bumptech/glide/load/CacheLoader.java @@ -1,11 +1,12 @@ package com.bumptech.glide.load; import android.util.Log; + import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.cache.DiskCache; +import java.io.File; import java.io.IOException; -import java.io.InputStream; public class CacheLoader { private static final String TAG = "CacheLoader"; @@ -15,9 +16,9 @@ public class CacheLoader { this.diskCache = diskCache; } - public <Z> Resource<Z> load(Key key, ResourceDecoder<InputStream, Z> decoder, int width, int height) { + public <Z> Resource<Z> load(Key key, ResourceDecoder<File, Z> decoder, int width, int height) { Resource<Z> result = null; - InputStream fromCache = diskCache.get(key); + File fromCache = diskCache.get(key); if (fromCache != null) { try { result = decoder.decode(fromCache, width, height); diff --git a/library/src/main/java/com/bumptech/glide/load/SkipCache.java b/library/src/main/java/com/bumptech/glide/load/NullResourceEncoder.java index d0945e1d..0aaba576 100644 --- a/library/src/main/java/com/bumptech/glide/load/SkipCache.java +++ b/library/src/main/java/com/bumptech/glide/load/NullResourceEncoder.java @@ -4,11 +4,11 @@ import com.bumptech.glide.load.engine.Resource; import java.io.OutputStream; -public class SkipCache<T> implements ResourceEncoder<T> { - private static final SkipCache SKIP_CACHE = new SkipCache(); +public class NullResourceEncoder<T> implements ResourceEncoder<T> { + private static final NullResourceEncoder SKIP_CACHE = new NullResourceEncoder(); @SuppressWarnings("unchecked") - public static <T> SkipCache<T> get() { + public static <T> NullResourceEncoder<T> get() { return SKIP_CACHE; } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactory.java b/library/src/main/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactory.java index 1b2141aa..b903ee05 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactory.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactory.java @@ -1,8 +1,9 @@ package com.bumptech.glide.load.engine; import android.os.Handler; -import com.bumptech.glide.load.CacheLoader; + import com.bumptech.glide.Priority; +import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; @@ -11,7 +12,7 @@ import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.engine.cache.DiskCache; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import java.io.InputStream; +import java.io.File; import java.util.concurrent.ExecutorService; class DefaultResourceRunnerFactory implements ResourceRunnerFactory { @@ -32,7 +33,7 @@ class DefaultResourceRunnerFactory implements ResourceRunnerFactory { @Override public <T, Z, R> ResourceRunner<Z, R> build(EngineKey key, int width, int height, - ResourceDecoder<InputStream, Z> cacheDecoder, DataFetcher<T> fetcher, boolean cacheSource, + ResourceDecoder<File, Z> cacheDecoder, DataFetcher<T> fetcher, boolean cacheSource, Encoder<T> sourceEncoder, ResourceDecoder<T, Z> decoder, Transformation<Z> transformation, ResourceEncoder<Z> encoder, ResourceTranscoder<Z, R> transcoder, Priority priority, boolean isMemoryCacheable, EngineJobListener listener) { diff --git a/library/src/main/java/com/bumptech/glide/load/engine/Engine.java b/library/src/main/java/com/bumptech/glide/load/engine/Engine.java index 85a994b0..7da99521 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/Engine.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/Engine.java @@ -4,6 +4,7 @@ import android.os.Handler; import android.os.Looper; import android.os.MessageQueue; import android.util.Log; + import com.bumptech.glide.Priority; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.Key; @@ -18,7 +19,7 @@ import com.bumptech.glide.request.ResourceCallback; import com.bumptech.glide.util.LogTime; import com.bumptech.glide.util.Util; -import java.io.InputStream; +import java.io.File; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.HashMap; @@ -96,7 +97,7 @@ public class Engine implements EngineJobListener, MemoryCache.ResourceRemovedLis * @param <Z> The type of the resource that will be decoded. * @param <R> The type of the resource that will be transcoded from the decoded resource. */ - public <T, Z, R> LoadStatus load(int width, int height, ResourceDecoder<InputStream, Z> cacheDecoder, + public <T, Z, R> LoadStatus load(int width, int height, ResourceDecoder<File, Z> cacheDecoder, DataFetcher<T> fetcher, boolean cacheSource, Encoder<T> sourceEncoder, ResourceDecoder<T, Z> decoder, Transformation<Z> transformation, ResourceEncoder<Z> encoder, ResourceTranscoder<Z, R> transcoder, Priority priority, boolean isMemoryCacheable, ResourceCallback cb) { diff --git a/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunner.java b/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunner.java index d0323b8e..36a2db98 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunner.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunner.java @@ -2,14 +2,15 @@ package com.bumptech.glide.load.engine; import android.os.SystemClock; import android.util.Log; -import com.bumptech.glide.load.CacheLoader; + import com.bumptech.glide.Priority; +import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.executor.Prioritized; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import java.io.InputStream; +import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -27,7 +28,7 @@ public class ResourceRunner<Z, R> implements Runnable, Prioritized { private final SourceResourceRunner sourceRunner; private final EngineJob job; private final Priority priority; - private final ResourceDecoder<InputStream, Z> cacheDecoder; + private final ResourceDecoder<File, Z> cacheDecoder; private final int width; private final int height; private final CacheLoader cacheLoader; @@ -37,7 +38,7 @@ public class ResourceRunner<Z, R> implements Runnable, Prioritized { private volatile boolean isCancelled; public ResourceRunner(EngineKey key, int width, int height, CacheLoader cacheLoader, - ResourceDecoder<InputStream, Z> cacheDecoder, Transformation<Z> transformation, + ResourceDecoder<File, Z> cacheDecoder, Transformation<Z> transformation, ResourceTranscoder<Z, R> transcoder, SourceResourceRunner sourceRunner, ExecutorService diskCacheService, ExecutorService resizeService, EngineJob job, Priority priority) { this.key = key; diff --git a/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunnerFactory.java b/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunnerFactory.java index 42765991..976dc207 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunnerFactory.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/ResourceRunnerFactory.java @@ -8,7 +8,7 @@ import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import java.io.InputStream; +import java.io.File; interface ResourceRunnerFactory { /** @@ -26,7 +26,7 @@ interface ResourceRunnerFactory { * @return */ public <T, Z, R> ResourceRunner<Z, R> build(EngineKey key, int width, int height, - ResourceDecoder<InputStream, Z> cacheDecoder, DataFetcher<T> fetcher, boolean cacheSource, + ResourceDecoder<File, Z> cacheDecoder, DataFetcher<T> fetcher, boolean cacheSource, Encoder<T> sourceEncoder, ResourceDecoder<T, Z> decoder, Transformation<Z> transformation, ResourceEncoder<Z> encoder, ResourceTranscoder<Z, R> transcoder, Priority priority, boolean isMemoryCacheable, EngineJobListener listener); diff --git a/library/src/main/java/com/bumptech/glide/load/engine/SourceResourceRunner.java b/library/src/main/java/com/bumptech/glide/load/engine/SourceResourceRunner.java index c5623112..03decf8b 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/SourceResourceRunner.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/SourceResourceRunner.java @@ -2,8 +2,9 @@ package com.bumptech.glide.load.engine; import android.os.SystemClock; import android.util.Log; -import com.bumptech.glide.load.CacheLoader; + import com.bumptech.glide.Priority; +import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; @@ -14,7 +15,10 @@ import com.bumptech.glide.load.engine.executor.Prioritized; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.request.ResourceCallback; -import java.io.InputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStream; /** @@ -23,13 +27,15 @@ import java.io.OutputStream; * @param <Z> The type of the resource that will be decoded. * @param <R> The type of the resource that will be transcoded to from the decoded resource. */ -public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer, Prioritized { +public class SourceResourceRunner<T, Z, R> implements Runnable, Prioritized { + private static final WriterFactory DEFAULT_WRITER_FACTORY = new DefaultWriterFactory(); + private static final String TAG = "SourceRunner"; private final EngineKey key; private final int width; private final int height; private final CacheLoader cacheLoader; - private final ResourceDecoder<InputStream, Z> cacheDecoder; + private final ResourceDecoder<File, Z> cacheDecoder; private final DataFetcher<T> fetcher; private final boolean cacheSource; private final Encoder<T> sourceEncoder; @@ -40,15 +46,45 @@ public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer private final DiskCache diskCache; private final Priority priority; private final ResourceCallback cb; + private WriterFactory writerFactory; - private Resource<Z> result; private volatile boolean isCancelled; - public SourceResourceRunner(EngineKey key, int width, int height, CacheLoader cacheLoader, - ResourceDecoder<InputStream, Z> cacheDecoder, DataFetcher<T> dataFetcher, boolean cacheSource, - Encoder<T> sourceEncoder, ResourceDecoder<T, Z> decoder, Transformation<Z> transformation, - ResourceEncoder<Z> encoder, ResourceTranscoder<Z, R> transcoder, DiskCache diskCache, Priority priority, - ResourceCallback cb) { + public SourceResourceRunner(EngineKey key, + int width, + int height, + CacheLoader cacheLoader, + ResourceDecoder<File, Z> cacheDecoder, + DataFetcher<T> dataFetcher, + boolean cacheSource, + Encoder<T> sourceEncoder, + ResourceDecoder<T, Z> decoder, + Transformation<Z> transformation, + ResourceEncoder<Z> encoder, + ResourceTranscoder<Z, R> transcoder, + DiskCache diskCache, + Priority priority, + ResourceCallback cb) { + this(key, width, height, cacheLoader, cacheDecoder, dataFetcher, cacheSource, sourceEncoder, decoder, + transformation, encoder, transcoder, diskCache, priority, cb, DEFAULT_WRITER_FACTORY); + } + + SourceResourceRunner(EngineKey key, + int width, + int height, + CacheLoader cacheLoader, + ResourceDecoder<File, Z> cacheDecoder, + DataFetcher<T> dataFetcher, + boolean cacheSource, + Encoder<T> sourceEncoder, + ResourceDecoder<T, Z> decoder, + Transformation<Z> transformation, + ResourceEncoder<Z> encoder, + ResourceTranscoder<Z, R> transcoder, + DiskCache diskCache, + Priority priority, + ResourceCallback cb, + WriterFactory writerFactory) { this.key = key; this.width = width; this.height = height; @@ -64,6 +100,7 @@ public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer this.diskCache = diskCache; this.priority = priority; this.cb = cb; + this.writerFactory = writerFactory; } public void cancel() { @@ -91,19 +128,21 @@ public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer } } + Resource<Z> result = null; + if (decoded != null) { Resource<Z> transformed = transformation.transform(decoded, width, height); if (decoded != transformed) { decoded.recycle(); } result = transformed; - } - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "transformed in " + (SystemClock.currentThreadTimeMillis() - start)); + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "transformed in " + (SystemClock.currentThreadTimeMillis() - start)); + } } if (result != null) { - diskCache.put(key, this); + diskCache.put(key, writerFactory.build(encoder, result)); start = SystemClock.currentThreadTimeMillis(); Resource<R> transcoded = transcoder.transcode(result); if (Log.isLoggable(TAG, Log.VERBOSE)) { @@ -120,12 +159,7 @@ public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer } private Resource<Z> encodeSourceAndDecodeFromCache(final T data) { - diskCache.put(key.getOriginalKey(), new DiskCache.Writer() { - @Override - public boolean write(OutputStream os) { - return sourceEncoder.encode(data, os); - } - }); + diskCache.put(key.getOriginalKey(), writerFactory.build(sourceEncoder, data)); return cacheLoader.load(key.getOriginalKey(), cacheDecoder, width, height); } @@ -147,17 +181,57 @@ public class SourceResourceRunner<T, Z, R> implements Runnable, DiskCache.Writer } @Override - public boolean write(OutputStream os) { - long start = SystemClock.currentThreadTimeMillis(); - boolean success = encoder.encode(result, os); - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "wrote to disk cache in " + (SystemClock.currentThreadTimeMillis() - start)); + public int getPriority() { + return priority.ordinal(); + } + + private static class DefaultWriterFactory implements WriterFactory { + + @Override + public <T> SourceWriter<T> build(Encoder<T> encoder, T data) { + return new SourceWriter<T>(encoder, data); } - return success; } - @Override - public int getPriority() { - return priority.ordinal(); + interface WriterFactory { + public <T> SourceWriter<T> build(Encoder<T> encoder, T data); + } + + static class SourceWriter<T> implements DiskCache.Writer { + + private final Encoder<T> encoder; + private final T data; + + public SourceWriter(Encoder<T> encoder, T data) { + this.encoder = encoder; + this.data = data; + } + + @Override + public boolean write(File file) { + long start = SystemClock.currentThreadTimeMillis(); + boolean success = false; + OutputStream os = null; + try { + os = new FileOutputStream(file); + success = encoder.encode(data, os); + } catch (FileNotFoundException e) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Failed to find file to write to disk cache", e); + } + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + // Do nothing. + } + } + } + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "wrote to disk cache in " + (SystemClock.currentThreadTimeMillis() - start)); + } + return success; + } } } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCache.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCache.java index aa27758f..81e6360e 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCache.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCache.java @@ -2,8 +2,7 @@ package com.bumptech.glide.load.engine.cache; import com.bumptech.glide.load.Key; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.File; /** * An interface for writing to and reading from a disk cache @@ -15,21 +14,26 @@ public interface DiskCache { */ public interface Writer { /** - * Writes data to the output stream and returns true if the write was successful and should be committed, and + * Writes data to the file and returns true if the write was successful and should be committed, and * false if the write should be aborted. * - * @param os The output stream the Writer should write to. + * @param file The File the Writer should write to. */ - public boolean write(OutputStream os); + public boolean write(File file); } /** - * Get an InputStream for the value at the given key. + * Get the cache for the value at the given key. + * + * <p> + * Note - This is potentially dangerous, someone may write a new value to the file at any point in time + * and we won't know about it. + * </p> * * @param key The key in the cache * @return An InputStream representing the data at key at the time get is called */ - public InputStream get(Key key); + public File get(Key key); /** * Write to a key in the cache. {@link Writer} is used so that the cache implementation diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCacheAdapter.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCacheAdapter.java index 4b01e204..74551168 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCacheAdapter.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCacheAdapter.java @@ -2,11 +2,11 @@ package com.bumptech.glide.load.engine.cache; import com.bumptech.glide.load.Key; -import java.io.InputStream; +import java.io.File; public class DiskCacheAdapter implements DiskCache { @Override - public InputStream get(Key key) { + public File get(Key key) { return null; } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java index 7d21d9fe..1388e90f 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java @@ -5,15 +5,12 @@ package com.bumptech.glide.load.engine.cache; import android.util.Log; + import com.bumptech.glide.load.Key; import com.jakewharton.disklrucache.DiskLruCache; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; /** * The default DiskCache implementation. There must be no more than one active instance for a given @@ -64,16 +61,16 @@ public class DiskLruCacheWrapper implements DiskCache { } @Override - public InputStream get(Key key) { + public File get(Key key) { String safeKey = safeKeyGenerator.getSafeKey(key); - InputStream result = null; + File result = null; try { //It is possible that the there will be a put in between these two gets. If so that shouldn't be a problem //because we will always put the same value at the same key so our input streams will still represent //the same data final DiskLruCache.Value value = getDiskCache().get(safeKey); if (value != null) { - result = new FileInputStream(value.getFile(0)); + result = value.getFile(0); } } catch (IOException e) { if (Log.isLoggable(TAG, Log.WARN)) { @@ -88,21 +85,10 @@ public class DiskLruCacheWrapper implements DiskCache { String safeKey = safeKeyGenerator.getSafeKey(key); try { DiskLruCache.Editor editor = getDiskCache().edit(safeKey); - //editor will be null if there are two concurrent puts - //worst case just silently fail + // Editor will be null if there are two concurrent puts. In the worst case we will just silently fail. if (editor != null) { - boolean success = false; - OutputStream os = null; - try { - File file = editor.getFile(0); - os = new FileOutputStream(file); - success = writer.write(os); - } finally { - if (os != null) { - os.close(); - } - } - if (success) { + File file = editor.getFile(0); + if (writer.write(file)) { editor.commit(); } } diff --git a/library/src/main/java/com/bumptech/glide/load/model/ImageVideoWrapperEncoder.java b/library/src/main/java/com/bumptech/glide/load/model/ImageVideoWrapperEncoder.java index abdb9388..887a4ea1 100644 --- a/library/src/main/java/com/bumptech/glide/load/model/ImageVideoWrapperEncoder.java +++ b/library/src/main/java/com/bumptech/glide/load/model/ImageVideoWrapperEncoder.java @@ -1,6 +1,7 @@ package com.bumptech.glide.load.model; import android.os.ParcelFileDescriptor; + import com.bumptech.glide.load.Encoder; import java.io.InputStream; diff --git a/library/src/main/java/com/bumptech/glide/load/resource/FileToStreamDecoder.java b/library/src/main/java/com/bumptech/glide/load/resource/FileToStreamDecoder.java new file mode 100644 index 00000000..907c7746 --- /dev/null +++ b/library/src/main/java/com/bumptech/glide/load/resource/FileToStreamDecoder.java @@ -0,0 +1,68 @@ +package com.bumptech.glide.load.resource; + +import com.bumptech.glide.load.ResourceDecoder; +import com.bumptech.glide.load.engine.Resource; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +/** + * A decoder that wraps an InputStream decoder to allow it to decode from a file. + * @param <T> The type of resource that the wrapped InputStream decoder decodes. + */ +public class FileToStreamDecoder<T> implements ResourceDecoder<File, T> { + private static final FileOpener DEFAULT_FILE_OPENER = new DefaultFileOpener(); + + private ResourceDecoder<InputStream, T> streamDecoder; + private final FileOpener fileOpener; + + public FileToStreamDecoder(ResourceDecoder<InputStream, T> streamDecoder) { + this(streamDecoder, DEFAULT_FILE_OPENER); + } + + // Exposed for testing. + FileToStreamDecoder(ResourceDecoder<InputStream, T> streamDecoder, FileOpener fileOpener) { + this.streamDecoder = streamDecoder; + this.fileOpener = fileOpener; + } + + @Override + public Resource<T> decode(File source, int width, int height) throws IOException { + InputStream is = null; + Resource<T> result = null; + try { + is = fileOpener.open(source); + result = streamDecoder.decode(is, width, height); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + // Do nothing. + } + } + + } + return result; + } + + @Override + public String getId() { + return ""; + } + + interface FileOpener { + public InputStream open(File file) throws FileNotFoundException; + } + + private static class DefaultFileOpener implements FileOpener { + + @Override + public InputStream open(File file) throws FileNotFoundException { + return new FileInputStream(file); + } + } +} diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java index e313bb01..afe6d4ee 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java @@ -2,30 +2,32 @@ package com.bumptech.glide.load.resource.bitmap; import android.graphics.Bitmap; import android.os.ParcelFileDescriptor; + import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.model.NullEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; -import java.io.InputStream; +import java.io.File; public class FileDescriptorBitmapDataLoadProvider implements DataLoadProvider<ParcelFileDescriptor, Bitmap> { - private final StreamBitmapDecoder cacheDecoder; + private final ResourceDecoder<File, Bitmap> cacheDecoder; private final FileDescriptorBitmapDecoder sourceDecoder; private final BitmapEncoder encoder; private final NullEncoder<ParcelFileDescriptor> sourceEncoder; public FileDescriptorBitmapDataLoadProvider(BitmapPool bitmapPool) { - cacheDecoder = new StreamBitmapDecoder(bitmapPool); + cacheDecoder = new FileToStreamDecoder<Bitmap>(new StreamBitmapDecoder(bitmapPool)); sourceDecoder = new FileDescriptorBitmapDecoder(bitmapPool); encoder = new BitmapEncoder(); sourceEncoder = NullEncoder.get(); } @Override - public ResourceDecoder<InputStream, Bitmap> getCacheDecoder() { + public ResourceDecoder<File, Bitmap> getCacheDecoder() { return cacheDecoder; } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/ImageVideoDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/ImageVideoDataLoadProvider.java index 632fb6fb..396ea576 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/ImageVideoDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/ImageVideoDataLoadProvider.java @@ -2,6 +2,7 @@ package com.bumptech.glide.load.resource.bitmap; import android.graphics.Bitmap; import android.os.ParcelFileDescriptor; + import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -11,26 +12,28 @@ import com.bumptech.glide.load.model.ImageVideoWrapper; import com.bumptech.glide.load.model.ImageVideoWrapperEncoder; import com.bumptech.glide.load.model.NullEncoder; import com.bumptech.glide.load.model.StreamEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; -import java.io.InputStream; +import java.io.File; public class ImageVideoDataLoadProvider implements DataLoadProvider<ImageVideoWrapper, Bitmap> { private final ImageVideoBitmapDecoder sourceDecoder; - private final StreamBitmapDecoder cacheDecoder; + private final ResourceDecoder<File, Bitmap> cacheDecoder; private final BitmapEncoder encoder; private final ImageVideoWrapperEncoder sourceEncoder; + private final StreamBitmapDecoder streamDecoder; public ImageVideoDataLoadProvider(BitmapPool bitmapPool) { encoder = new BitmapEncoder(); Encoder<ParcelFileDescriptor> fileDescriptorEncoder = NullEncoder.get(); sourceEncoder = new ImageVideoWrapperEncoder(new StreamEncoder(), fileDescriptorEncoder); - cacheDecoder = new StreamBitmapDecoder(bitmapPool); - sourceDecoder = new ImageVideoBitmapDecoder(cacheDecoder, - new FileDescriptorBitmapDecoder(bitmapPool)); + streamDecoder = new StreamBitmapDecoder(bitmapPool); + cacheDecoder = new FileToStreamDecoder<Bitmap>(streamDecoder); + sourceDecoder = new ImageVideoBitmapDecoder(streamDecoder, new FileDescriptorBitmapDecoder(bitmapPool)); } @Override - public ResourceDecoder<InputStream, Bitmap> getCacheDecoder() { + public ResourceDecoder<File, Bitmap> getCacheDecoder() { return cacheDecoder; } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java index de3413e3..3dce679e 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java @@ -1,29 +1,34 @@ package com.bumptech.glide.load.resource.bitmap; import android.graphics.Bitmap; + import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.model.StreamEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; +import java.io.File; import java.io.InputStream; public class StreamBitmapDataLoadProvider implements DataLoadProvider<InputStream, Bitmap> { private final StreamBitmapDecoder decoder; private final BitmapEncoder encoder; private final StreamEncoder sourceEncoder; + private final FileToStreamDecoder<Bitmap> cacheDecoder; public StreamBitmapDataLoadProvider(BitmapPool bitmapPool) { sourceEncoder = new StreamEncoder(); decoder = new StreamBitmapDecoder(bitmapPool); encoder = new BitmapEncoder(); + cacheDecoder = new FileToStreamDecoder<Bitmap>(decoder); } @Override - public ResourceDecoder<InputStream, Bitmap> getCacheDecoder() { - return decoder; + public ResourceDecoder<File, Bitmap> getCacheDecoder() { + return cacheDecoder; } @Override diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDataLoadProvider.java index 7c76badd..698b54da 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDataLoadProvider.java @@ -1,29 +1,34 @@ package com.bumptech.glide.load.resource.gif; import android.content.Context; + import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.model.StreamEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; +import java.io.File; import java.io.InputStream; public class GifDataLoadProvider implements DataLoadProvider<InputStream, GifData> { private final GifResourceDecoder decoder; private final GifResourceEncoder encoder; private final StreamEncoder sourceEncoder; + private final FileToStreamDecoder<GifData> cacheDecoder; public GifDataLoadProvider(Context context, BitmapPool bitmapPool) { decoder = new GifResourceDecoder(context, bitmapPool); + cacheDecoder = new FileToStreamDecoder<GifData>(decoder); encoder = new GifResourceEncoder(); sourceEncoder = new StreamEncoder(); } @Override - public ResourceDecoder<InputStream, GifData> getCacheDecoder() { - return decoder; + public ResourceDecoder<File, GifData> getCacheDecoder() { + return cacheDecoder; } @Override diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java index 254f30e6..0d343d0a 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java @@ -5,22 +5,24 @@ import android.graphics.Bitmap; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; + import com.bumptech.glide.Glide; import com.bumptech.glide.gifdecoder.GifDecoder; +import com.bumptech.glide.load.NullResourceEncoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import com.bumptech.glide.load.SkipCache; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.cache.MemorySizeCalculator; import com.bumptech.glide.load.model.NullEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; import com.bumptech.glide.load.resource.NullDecoder; import com.bumptech.glide.load.resource.bitmap.BitmapEncoder; import com.bumptech.glide.load.resource.bitmap.StreamBitmapDecoder; import com.bumptech.glide.request.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; -import java.io.InputStream; +import java.io.File; class GifFrameManager { // 16ms per frame = 60fps @@ -28,7 +30,7 @@ class GifFrameManager { private final MemorySizeCalculator calculator; private final GifFrameModelLoader frameLoader; private final GifFrameResourceDecoder frameResourceDecoder; - private final ResourceDecoder<InputStream, Bitmap> cacheDecoder; + private final ResourceDecoder<File, Bitmap> cacheDecoder; private final GifDecoder decoder; private final Handler mainHandler; private final ResourceEncoder<Bitmap> encoder; @@ -67,13 +69,15 @@ class GifFrameManager { if (!decoder.isTransparent()) { // For non transparent gifs, we can beat the performance of our gif decoder for each frame by decoding jpegs // from disk. - cacheDecoder = new StreamBitmapDecoder(context); + + //TODO: + cacheDecoder = new FileToStreamDecoder<Bitmap>(new StreamBitmapDecoder(context)); encoder = new BitmapEncoder(Bitmap.CompressFormat.JPEG, 70); } else { // For transparent gifs, we would have to encode as pngs which is actually slower than our gif decoder so we // avoid writing frames to the disk cache entirely. cacheDecoder = NullDecoder.get(); - encoder = SkipCache.get(); + encoder = NullResourceEncoder.get(); } } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gifbitmap/ImageVideoGifDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/gifbitmap/ImageVideoGifDataLoadProvider.java index 2299abb8..44f9a85a 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gifbitmap/ImageVideoGifDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gifbitmap/ImageVideoGifDataLoadProvider.java @@ -1,41 +1,41 @@ package com.bumptech.glide.load.resource.gifbitmap; import android.graphics.Bitmap; -import android.os.ParcelFileDescriptor; + import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.model.ImageVideoWrapper; -import com.bumptech.glide.load.model.NullEncoder; +import com.bumptech.glide.load.resource.FileToStreamDecoder; import com.bumptech.glide.load.resource.gif.GifData; +import java.io.File; import java.io.InputStream; public class ImageVideoGifDataLoadProvider implements DataLoadProvider<ImageVideoWrapper, GifBitmapWrapper> { - private final GifBitmapWrapperStreamResourceDecoder cacheDecoder; - private final GifBitmapWrapperResourceDecoder sourceDecoder; - private final GifBitmapWrapperResourceEncoder encoder; + private final ResourceDecoder<File, GifBitmapWrapper> cacheDecoder; + private final ResourceDecoder<ImageVideoWrapper, GifBitmapWrapper> sourceDecoder; + private final ResourceEncoder<GifBitmapWrapper> encoder; private final Encoder<ImageVideoWrapper> sourceEncoder; public ImageVideoGifDataLoadProvider(DataLoadProvider<ImageVideoWrapper, Bitmap> bitmapProvider, DataLoadProvider<InputStream, GifData> gifProvider) { - cacheDecoder = new GifBitmapWrapperStreamResourceDecoder(new GifBitmapWrapperResourceDecoder( + cacheDecoder = new FileToStreamDecoder<GifBitmapWrapper>(new GifBitmapWrapperStreamResourceDecoder(new + GifBitmapWrapperResourceDecoder( bitmapProvider.getSourceDecoder(), - gifProvider.getCacheDecoder())); + gifProvider.getSourceDecoder()))); sourceDecoder = new GifBitmapWrapperResourceDecoder( bitmapProvider.getSourceDecoder(), gifProvider.getSourceDecoder()); encoder = new GifBitmapWrapperResourceEncoder(bitmapProvider.getEncoder(), gifProvider.getEncoder()); - Encoder<ParcelFileDescriptor> fileDescriptorEncoder = NullEncoder.get(); - //TODO: what about the gif provider? sourceEncoder = bitmapProvider.getSourceEncoder(); } @Override - public ResourceDecoder<InputStream, GifBitmapWrapper> getCacheDecoder() { + public ResourceDecoder<File, GifBitmapWrapper> getCacheDecoder() { return cacheDecoder; } diff --git a/library/src/main/java/com/bumptech/glide/provider/ChildLoadProvider.java b/library/src/main/java/com/bumptech/glide/provider/ChildLoadProvider.java index 68384d13..c5ab59b4 100644 --- a/library/src/main/java/com/bumptech/glide/provider/ChildLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/provider/ChildLoadProvider.java @@ -3,14 +3,14 @@ package com.bumptech.glide.provider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.load.model.ModelLoader; +import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import java.io.InputStream; +import java.io.File; public class ChildLoadProvider<A, T, Z, R> implements LoadProvider<A, T, Z, R> { private LoadProvider<A, T, Z, R> parent; - private ResourceDecoder<InputStream, Z> cacheDecoder; + private ResourceDecoder<File, Z> cacheDecoder; private ResourceDecoder<T, Z> sourceDecoder; private ResourceEncoder<Z> encoder; private ResourceTranscoder<Z, R> transcoder; @@ -25,7 +25,7 @@ public class ChildLoadProvider<A, T, Z, R> implements LoadProvider<A, T, Z, R> { return parent.getModelLoader(); } - public void setCacheDecoder(ResourceDecoder<InputStream, Z> cacheDecoder) { + public void setCacheDecoder(ResourceDecoder<File, Z> cacheDecoder) { this.cacheDecoder = cacheDecoder; } @@ -46,7 +46,7 @@ public class ChildLoadProvider<A, T, Z, R> implements LoadProvider<A, T, Z, R> { } @Override - public ResourceDecoder<InputStream, Z> getCacheDecoder() { + public ResourceDecoder<File, Z> getCacheDecoder() { if (cacheDecoder != null) { return cacheDecoder; } else { diff --git a/library/src/main/java/com/bumptech/glide/provider/FixedLoadProvider.java b/library/src/main/java/com/bumptech/glide/provider/FixedLoadProvider.java index 4c5474ef..efbaa315 100644 --- a/library/src/main/java/com/bumptech/glide/provider/FixedLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/provider/FixedLoadProvider.java @@ -4,10 +4,10 @@ import com.bumptech.glide.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.load.model.ModelLoader; +import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import java.io.InputStream; +import java.io.File; public class FixedLoadProvider<A, T, Z, R> implements LoadProvider<A, T, Z, R> { private final ModelLoader<A, T> modelLoader; @@ -41,7 +41,7 @@ public class FixedLoadProvider<A, T, Z, R> implements LoadProvider<A, T, Z, R> } @Override - public ResourceDecoder<InputStream, Z> getCacheDecoder() { + public ResourceDecoder<File, Z> getCacheDecoder() { return dataLoadProvider.getCacheDecoder(); } diff --git a/library/src/main/java/com/bumptech/glide/request/GenericRequest.java b/library/src/main/java/com/bumptech/glide/request/GenericRequest.java index d13cba5d..374851dd 100644 --- a/library/src/main/java/com/bumptech/glide/request/GenericRequest.java +++ b/library/src/main/java/com/bumptech/glide/request/GenericRequest.java @@ -3,6 +3,7 @@ package com.bumptech.glide.request; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.Log; + import com.bumptech.glide.Priority; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -17,7 +18,7 @@ import com.bumptech.glide.provider.LoadProvider; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.util.LogTime; -import java.io.InputStream; +import java.io.File; import java.util.ArrayDeque; import java.util.Queue; @@ -306,7 +307,7 @@ public class GenericRequest<A, T, Z, R> implements Request, Target.SizeReadyCall width = Math.round(sizeMultiplier * width); height = Math.round(sizeMultiplier * height); - ResourceDecoder<InputStream, Z> cacheDecoder = loadProvider.getCacheDecoder(); + ResourceDecoder<File, Z> cacheDecoder = loadProvider.getCacheDecoder(); Encoder<T> sourceEncoder = loadProvider.getSourceEncoder(); ResourceDecoder<T, Z> decoder = loadProvider.getSourceDecoder(); ResourceEncoder <Z> encoder = loadProvider.getEncoder(); diff --git a/library/src/test/java/com/bumptech/glide/GlideTest.java b/library/src/test/java/com/bumptech/glide/GlideTest.java index bfc8ebcf..878b4376 100644 --- a/library/src/test/java/com/bumptech/glide/GlideTest.java +++ b/library/src/test/java/com/bumptech/glide/GlideTest.java @@ -203,7 +203,7 @@ public class GlideTest { ResourceDecoder<File, File> sourceDecoder = mock(ResourceDecoder.class); when(sourceDecoder.decode(eq(expected), anyInt(), anyInt())).thenReturn(expectedResource); when(sourceDecoder.getId()).thenReturn("sourceDecoderId"); - ResourceDecoder<InputStream, File> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, File> cacheDecoder = mock(ResourceDecoder.class); when(cacheDecoder.getId()).thenReturn("cacheDecoderId"); ResourceEncoder<File> encoder = mock(ResourceEncoder.class); when(encoder.getId()).thenReturn("encoderId"); diff --git a/library/src/test/java/com/bumptech/glide/load/CacheLoaderTest.java b/library/src/test/java/com/bumptech/glide/load/CacheLoaderTest.java index 0c4f1a65..f2726d66 100644 --- a/library/src/test/java/com/bumptech/glide/load/CacheLoaderTest.java +++ b/library/src/test/java/com/bumptech/glide/load/CacheLoaderTest.java @@ -2,14 +2,14 @@ package com.bumptech.glide.load; import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.cache.DiskCache; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import java.io.ByteArrayInputStream; +import java.io.File; import java.io.IOException; -import java.io.InputStream; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; @@ -25,7 +25,7 @@ public class CacheLoaderTest { private DiskCache diskCache; private CacheLoader cacheLoader; private Key key; - private ResourceDecoder<InputStream, Object> decoder; + private ResourceDecoder<File, Object> decoder; private Resource<Object> expected; @SuppressWarnings("unchecked") @@ -40,7 +40,7 @@ public class CacheLoaderTest { @Test public void testCacheDecoderIsCalledIfInCache() throws IOException { - InputStream result = new ByteArrayInputStream(new byte[0]); + File result = new File("test"); when(diskCache.get(eq(key))).thenReturn(result); int width = 100; @@ -54,9 +54,9 @@ public class CacheLoaderTest { public void testReturnsDecodedResourceIfInCache() throws IOException { int width = 50; int height = 75; - InputStream is = new ByteArrayInputStream(new byte[0]); - when(diskCache.get(eq(key))).thenReturn(is); - when(decoder.decode(eq(is), eq(width), eq(height))).thenReturn(expected); + File file = new File("test"); + when(diskCache.get(eq(key))).thenReturn(file); + when(decoder.decode(eq(file), eq(width), eq(height))).thenReturn(expected); assertEquals(expected, cacheLoader.load(key, decoder, width, height)); } @@ -68,8 +68,8 @@ public class CacheLoaderTest { @Test public void testDiskCacheEntryIsDeletedIfCacheDecoderThrows() throws IOException { - when(diskCache.get(eq(key))).thenReturn(new ByteArrayInputStream(new byte[0])); - when(decoder.decode(any(InputStream.class), anyInt(), anyInt())).thenThrow(new IOException("Test")); + when(diskCache.get(eq(key))).thenReturn(new File("test")); + when(decoder.decode(any(File.class), anyInt(), anyInt())).thenThrow(new IOException("Test")); cacheLoader.load(key, decoder, 100, 100); @@ -78,8 +78,8 @@ public class CacheLoaderTest { @Test public void testDiskCacheEntryIsDeletedIfDiskCacheContainsIdAndCacheDecoderReturnsNull() throws IOException { - when(diskCache.get(eq(key))).thenReturn(new ByteArrayInputStream(new byte[0])); - when(decoder.decode(any(InputStream.class), anyInt(), anyInt())).thenReturn(null); + when(diskCache.get(eq(key))).thenReturn(new File("test")); + when(decoder.decode(any(File.class), anyInt(), anyInt())).thenReturn(null); cacheLoader.load(key, decoder, 100, 101); diff --git a/library/src/test/java/com/bumptech/glide/load/SkipCacheTest.java b/library/src/test/java/com/bumptech/glide/load/NullResourceEncoderTest.java index 8e492393..2b721cd6 100644 --- a/library/src/test/java/com/bumptech/glide/load/SkipCacheTest.java +++ b/library/src/test/java/com/bumptech/glide/load/NullResourceEncoderTest.java @@ -9,23 +9,23 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static org.mockito.Mockito.mock; -public class SkipCacheTest { +public class NullResourceEncoderTest { @Test public void testEncode() throws Exception { - SkipCache skipCache = new SkipCache(); + NullResourceEncoder nullResourceEncoder = new NullResourceEncoder(); Resource resource = mock(Resource.class); ByteArrayOutputStream os = new ByteArrayOutputStream(); - skipCache.encode(resource, os); + nullResourceEncoder.encode(resource, os); assertEquals(0, os.toByteArray().length); } @Test public void testReturnsFalseFromEncode() { - SkipCache skipCache = new SkipCache(); + NullResourceEncoder nullResourceEncoder = new NullResourceEncoder(); - assertFalse(skipCache.encode(mock(Resource.class), new ByteArrayOutputStream())); + assertFalse(nullResourceEncoder.encode(mock(Resource.class), new ByteArrayOutputStream())); } } diff --git a/library/src/test/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactoryTest.java b/library/src/test/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactoryTest.java index 977ef527..06fdef1f 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactoryTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactoryTest.java @@ -1,6 +1,7 @@ package com.bumptech.glide.load.engine; import android.os.Handler; + import com.bumptech.glide.Priority; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -9,12 +10,13 @@ import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.engine.cache.DiskCache; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import java.io.InputStream; +import java.io.File; import java.util.concurrent.ExecutorService; import static junit.framework.Assert.assertNotNull; @@ -48,7 +50,7 @@ public class DefaultResourceRunnerFactoryTest { DefaultResourceRunnerFactory factory = new DefaultResourceRunnerFactory(diskCache, mainHandler, diskCacheService, resizeService); - ResourceDecoder<InputStream, Object> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> cacheDecoder = mock(ResourceDecoder.class); DataFetcher<Object> fetcher = mock(DataFetcher.class); ResourceDecoder<Object, Object> decoder = mock(ResourceDecoder.class); ResourceEncoder<Object> encoder = mock(ResourceEncoder.class); diff --git a/library/src/test/java/com/bumptech/glide/load/engine/EngineTest.java b/library/src/test/java/com/bumptech/glide/load/engine/EngineTest.java index 3ae5de4a..7032bf61 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/EngineTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/EngineTest.java @@ -13,13 +13,14 @@ import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.request.ResourceCallback; import com.bumptech.glide.tests.BackgroundUtil; import com.bumptech.glide.tests.GlideShadowLooper; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.io.InputStream; +import java.io.File; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; @@ -393,7 +394,7 @@ public class EngineTest { private static class EngineTestHarness { EngineKey cacheKey = mock(EngineKey.class); EngineKeyFactory keyFactory = mock(EngineKeyFactory.class); - ResourceDecoder<InputStream, Object> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> cacheDecoder = mock(ResourceDecoder.class); DataFetcher<Object> fetcher = mock(DataFetcher.class); ResourceDecoder<Object, Object> decoder = mock(ResourceDecoder.class); ResourceEncoder<Object> encoder = mock(ResourceEncoder.class); diff --git a/library/src/test/java/com/bumptech/glide/load/engine/ResourceRunnerTest.java b/library/src/test/java/com/bumptech/glide/load/engine/ResourceRunnerTest.java index 57ddcf2a..94eb9bfc 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/ResourceRunnerTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/ResourceRunnerTest.java @@ -1,18 +1,19 @@ package com.bumptech.glide.load.engine; -import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.Priority; +import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -180,7 +181,7 @@ public class ResourceRunnerTest { private static class ResourceRunnerHarness { EngineKey key = mock(EngineKey.class); Key originalKey = mock(Key.class); - ResourceDecoder<InputStream, Object> decoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> decoder = mock(ResourceDecoder.class); SourceResourceRunner<Object, Object, Object> sourceRunner = mock(SourceResourceRunner.class); ResourceTranscoder<Object, Object> transcoder = mock(ResourceTranscoder.class); ExecutorService resizeService = mock(ExecutorService.class); diff --git a/library/src/test/java/com/bumptech/glide/load/engine/SourceResourceRunnerTest.java b/library/src/test/java/com/bumptech/glide/load/engine/SourceResourceRunnerTest.java index a50a4ab0..647e432b 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/SourceResourceRunnerTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/SourceResourceRunnerTest.java @@ -1,7 +1,7 @@ package com.bumptech.glide.load.engine; -import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.Priority; +import com.bumptech.glide.load.CacheLoader; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.ResourceDecoder; @@ -11,6 +11,7 @@ import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.engine.cache.DiskCache; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.request.ResourceCallback; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,14 +20,12 @@ import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyObject; @@ -80,18 +79,11 @@ public class SourceResourceRunnerTest { final SourceResourceRunner<Object, Object, Object> runner = harness.getRunner(); when(harness.cacheLoader.load(eq(harness.originalKey), eq(harness.cacheDecoder), eq(harness.width), eq(harness.height))).thenReturn(harness.decoded); - final OutputStream expected = new ByteArrayOutputStream(); - doAnswer(new Answer<Object>() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - runner.write(expected); - return null; - } - }).when(harness.diskCache).put(eq(harness.key), eq(runner)); + when(harness.factory.build(eq(harness.encoder), eq(harness.transformed))).thenReturn(harness.writer); runner.run(); - verify(harness.encoder).encode(eq(harness.transformed), eq(expected)); + verify(harness.diskCache).put(eq(harness.key), eq(harness.writer)); } @Test @@ -129,13 +121,11 @@ public class SourceResourceRunnerTest { InputStream is = new ByteArrayInputStream(new byte[0]); when(harness.fetcher.loadData(eq(harness.priority))).thenReturn(is); when(harness.decoder.decode(eq(is), eq(harness.width), eq(harness.height))).thenReturn(harness.decoded); - - final OutputStream expected = new ByteArrayOutputStream(); + when(harness.factory.build(eq(harness.encoder), eq(harness.transformed))).thenReturn(harness.writer); runner.run(); - runner.write(expected); - verify(harness.encoder).encode(eq(harness.transformed), eq(expected)); + verify(harness.diskCache).put(eq(harness.key), eq(harness.writer)); } @Test @@ -144,15 +134,13 @@ public class SourceResourceRunnerTest { InputStream is = new ByteArrayInputStream(new byte[0]); when(harness.fetcher.loadData(eq(harness.priority))).thenReturn(is); when(harness.decoder.decode(eq(is), eq(harness.width), eq(harness.height))).thenReturn(harness.decoded); - Resource transformed = mock(Resource.class); when(harness.transformation.transform(eq(harness.decoded), eq(harness.width), eq(harness.height))) - .thenReturn(transformed); + .thenReturn(harness.transformed); + when(harness.factory.build(eq(harness.encoder), eq(harness.transformed))).thenReturn(harness.writer); - OutputStream expected = new ByteArrayOutputStream(); runner.run(); - runner.write(expected); - verify(harness.encoder).encode(eq(transformed), eq(expected)); + verify(harness.diskCache).put(eq(harness.key), eq(harness.writer)); } @Test @@ -252,16 +240,6 @@ public class SourceResourceRunnerTest { } @Test - public void testReturnsEncodersWriteResultFromWrite() { - when(harness.encoder.encode(any(Resource.class), any(OutputStream.class))).thenReturn(true); - assertTrue(harness.getRunner().write(new ByteArrayOutputStream())); - - when(harness.encoder.encode(any(Resource.class), any(OutputStream.class))).thenReturn(false); - assertFalse(harness.getRunner() - .write(new ByteArrayOutputStream())); - } - - @Test public void testDoesNotNormallyEncodeRetrievedData() throws Exception { Object data = new Object(); when(harness.fetcher.loadData(any(Priority.class))).thenReturn(data); @@ -276,11 +254,11 @@ public class SourceResourceRunnerTest { harness.cacheSource = true; Object data = new Object(); when(harness.fetcher.loadData(any(Priority.class))).thenReturn(data); - doAnswer(new CallWriter()).when(harness.diskCache).put(eq(harness.originalKey), any(DiskCache.Writer.class)); + when(harness.factory.build(eq(harness.sourceEncoder), eq(data))).thenReturn(harness.sourceWriter); harness.getRunner().run(); - verify(harness.sourceEncoder).encode(eq(data), any(OutputStream.class)); + verify(harness.diskCache).put(eq(harness.originalKey), eq(harness.sourceWriter)); } @Test @@ -288,10 +266,9 @@ public class SourceResourceRunnerTest { harness.cacheSource = true; Object data = new Object(); when(harness.fetcher.loadData(any(Priority.class))).thenReturn(data); - doAnswer(new CallWriter() { + doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { - super.answer(invocation); when(harness.cacheLoader.load(eq(harness.originalKey), eq(harness.cacheDecoder), eq(harness.width), eq(harness.height))).thenReturn(harness.decoded); return null; @@ -303,19 +280,10 @@ public class SourceResourceRunnerTest { verify(harness.cb).onResourceReady(eq(harness.transcoded)); } - private static class CallWriter implements Answer<Void> { - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - DiskCache.Writer writer = (DiskCache.Writer) invocation.getArguments()[1]; - writer.write(new ByteArrayOutputStream()); - return null; - } - } - @SuppressWarnings("unchecked") private static class SourceResourceHarness { CacheLoader cacheLoader = mock(CacheLoader.class); - ResourceDecoder<InputStream, Object> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> cacheDecoder = mock(ResourceDecoder.class); DataFetcher<Object> fetcher = mock(DataFetcher.class); ResourceDecoder<Object, Object> decoder = mock(ResourceDecoder.class); ResourceEncoder<Object> encoder = mock(ResourceEncoder.class); @@ -327,6 +295,10 @@ public class SourceResourceRunnerTest { Resource<Object> transformed = mock(Resource.class); Resource<Object> transcoded = mock(Resource.class); Transformation<Object> transformation = mock(Transformation.class); + SourceResourceRunner.WriterFactory factory = mock(SourceResourceRunner.WriterFactory.class); + SourceResourceRunner.SourceWriter<Resource<Object>> writer = mock(SourceResourceRunner.SourceWriter.class); + SourceResourceRunner.SourceWriter<Object> sourceWriter = mock(SourceResourceRunner.SourceWriter + .class); boolean cacheSource = false; Encoder<Object> sourceEncoder = mock(Encoder.class); int width = 150; @@ -337,7 +309,7 @@ public class SourceResourceRunnerTest { public SourceResourceRunner<Object, Object, Object> getRunner() { return new SourceResourceRunner<Object, Object, Object>(key, width, height, cacheLoader, cacheDecoder, fetcher, cacheSource, sourceEncoder, decoder, transformation, encoder, transcoder, diskCache, - priority, cb); + priority, cb, factory); } public SourceResourceHarness() { diff --git a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java index 8dcdbeef..15d7f0cb 100644 --- a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java +++ b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java @@ -1,6 +1,7 @@ package com.bumptech.glide.load.engine.cache; import com.bumptech.glide.load.Key; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -8,9 +9,11 @@ import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.util.Arrays; @@ -34,12 +37,12 @@ public class DiskLruCacheWrapperTest { } @Test - public void testCanInsertAndGet() { + public void testCanInsertAndGet() throws FileNotFoundException { cache.put(key, new DiskCache.Writer() { @Override - public boolean write(OutputStream os) { + public boolean write(File file) { try { - os.write(data); + new FileOutputStream(file).write(data); } catch (IOException e) { e.printStackTrace(); } @@ -47,7 +50,7 @@ public class DiskLruCacheWrapperTest { } }); - byte[] received = isToBytes(cache.get(key), data.length); + byte[] received = isToBytes(new FileInputStream(cache.get(key)), data.length); assertTrue(Arrays.equals(data, received)); } @@ -56,7 +59,7 @@ public class DiskLruCacheWrapperTest { public void testDoesNotCommitIfWriterReturnsFalse() { cache.put(key, new DiskCache.Writer() { @Override - public boolean write(OutputStream os) { + public boolean write(File file) { return false; } }); @@ -68,9 +71,9 @@ public class DiskLruCacheWrapperTest { public void testDoesNotCommitIfWriterWritesButReturnsFalse() { cache.put(key, new DiskCache.Writer() { @Override - public boolean write(OutputStream os) { + public boolean write(File file) { try { - os.write(data); + new FileOutputStream(file).write(data); } catch (IOException e) { e.printStackTrace(); } diff --git a/library/src/test/java/com/bumptech/glide/load/resource/FileToStreamDecoderTest.java b/library/src/test/java/com/bumptech/glide/load/resource/FileToStreamDecoderTest.java new file mode 100644 index 00000000..12bc9d3b --- /dev/null +++ b/library/src/test/java/com/bumptech/glide/load/resource/FileToStreamDecoderTest.java @@ -0,0 +1,87 @@ +package com.bumptech.glide.load.resource; + +import com.bumptech.glide.load.ResourceDecoder; +import com.bumptech.glide.load.engine.Resource; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class FileToStreamDecoderTest { + + private ResourceDecoder<InputStream, Object> streamDecoder; + private FileToStreamDecoder<Object> decoder; + private FileToStreamDecoder.FileOpener fileOpener; + + @SuppressWarnings("unchecked") + @Before + public void setUp() { + fileOpener = mock(FileToStreamDecoder.FileOpener.class); + streamDecoder = mock(ResourceDecoder.class); + decoder = new FileToStreamDecoder<Object>(streamDecoder, fileOpener); + } + + @Test + public void testHasEmptyId() { + assertEquals("", decoder.getId()); + } + + @Test + public void testReturnsResourceFromStreamDecoder() throws IOException { + File file = new File("test"); + InputStream expected = new ByteArrayInputStream(new byte[0]); + when(fileOpener.open(eq(file))).thenReturn(expected); + Resource<Object> resource = mock(Resource.class); + int width = 123; + int height = 456; + + when(streamDecoder.decode(eq(expected), eq(width), eq(height))).thenReturn(resource); + + assertEquals(resource, decoder.decode(file, width, height)); + } + + @Test + public void testClosesStream() throws IOException { + InputStream is = mock(InputStream.class); + when(fileOpener.open(any(File.class))).thenReturn(is); + + decoder.decode(new File("test"), 100, 100); + + verify(is).close(); + } + + @Test + public void testClosesStreamIfStreamDecoderThrows() throws IOException { + InputStream is = mock(InputStream.class); + when(fileOpener.open(any(File.class))).thenReturn(is); + + when(streamDecoder.decode(eq(is), anyInt(), anyInt())).thenAnswer(new Answer<Object>() { + @Override + public Object answer(InvocationOnMock invocationOnMock) throws Throwable { + throw new IOException("test"); + } + }); + + try { + decoder.decode(new File("test"), 100, 100); + } catch (IOException e) { + // Expected. + } + + verify(is).close(); + } +}
\ No newline at end of file diff --git a/library/src/test/java/com/bumptech/glide/provider/ChildLoadProviderTest.java b/library/src/test/java/com/bumptech/glide/provider/ChildLoadProviderTest.java index 11882ffc..693143c0 100644 --- a/library/src/test/java/com/bumptech/glide/provider/ChildLoadProviderTest.java +++ b/library/src/test/java/com/bumptech/glide/provider/ChildLoadProviderTest.java @@ -3,12 +3,13 @@ package com.bumptech.glide.provider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.load.model.ModelLoader; +import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; + import org.junit.Before; import org.junit.Test; -import java.io.InputStream; +import java.io.File; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; @@ -102,7 +103,7 @@ public class ChildLoadProviderTest { @SuppressWarnings("unchecked") private static class ChildLoadHarness { ResourceEncoder<Object> encoder = mock(ResourceEncoder.class); - ResourceDecoder<InputStream, Object> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> cacheDecoder = mock(ResourceDecoder.class); ResourceDecoder<Object, Object> decoder = mock(ResourceDecoder.class); Encoder<Object> sourceEncoder = mock(Encoder.class); ModelLoader<Object, Object> modelLoader = mock(ModelLoader.class); diff --git a/library/src/test/java/com/bumptech/glide/request/GenericRequestTest.java b/library/src/test/java/com/bumptech/glide/request/GenericRequestTest.java index 2c4b0dda..15c7659b 100644 --- a/library/src/test/java/com/bumptech/glide/request/GenericRequestTest.java +++ b/library/src/test/java/com/bumptech/glide/request/GenericRequestTest.java @@ -5,6 +5,7 @@ import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; + import com.bumptech.glide.Priority; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -17,6 +18,7 @@ import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.provider.LoadProvider; import com.bumptech.glide.request.target.Target; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,8 +27,8 @@ import org.mockito.stubbing.Answer; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import java.io.File; import java.io.IOException; -import java.io.InputStream; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; @@ -61,7 +63,7 @@ public class GenericRequestTest { int errorResourceId = 0; Drawable errorDrawable = null; LoadProvider<Object, Object, Object, Object> loadProvider = mock(LoadProvider.class); - ResourceDecoder<InputStream, Object> cacheDecoder = mock(ResourceDecoder.class); + ResourceDecoder<File, Object> cacheDecoder = mock(ResourceDecoder.class); ResourceDecoder<Object, Object> sourceDecoder = mock(ResourceDecoder.class); ResourceEncoder<Object> encoder = mock(ResourceEncoder.class); ResourceTranscoder transcoder = mock(ResourceTranscoder.class); |