aboutsummaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorSam Judd <judds@google.com>2014-06-30 21:10:41 -0700
committerSam Judd <judds@google.com>2014-07-02 15:53:49 -0700
commit0db3c45b412be1a5bfcb1da046836e89d3ffd0b4 (patch)
treebad0de839de5ba61d0bc0b35b72455048d4be58f /library
parent20b43f38eeddc90706aedea7d5a4a10e21524f73 (diff)
downloadglide-0db3c45b412be1a5bfcb1da046836e89d3ffd0b4.tar.gz
Get Files rather than InputStreams from cache.
Diffstat (limited to 'library')
-rw-r--r--library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java4
-rw-r--r--library/src/main/java/com/bumptech/glide/DataLoadProvider.java4
-rw-r--r--library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java5
-rw-r--r--library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java10
-rw-r--r--library/src/main/java/com/bumptech/glide/GifRequestBuilder.java4
-rw-r--r--library/src/main/java/com/bumptech/glide/load/CacheLoader.java7
-rw-r--r--library/src/main/java/com/bumptech/glide/load/NullResourceEncoder.java (renamed from library/src/main/java/com/bumptech/glide/load/SkipCache.java)6
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactory.java7
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/Engine.java5
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/ResourceRunner.java9
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/ResourceRunnerFactory.java4
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/SourceResourceRunner.java132
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCache.java18
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/cache/DiskCacheAdapter.java4
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java28
-rw-r--r--library/src/main/java/com/bumptech/glide/load/model/ImageVideoWrapperEncoder.java1
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/FileToStreamDecoder.java68
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java10
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/bitmap/ImageVideoDataLoadProvider.java15
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java9
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/gif/GifDataLoadProvider.java9
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java14
-rw-r--r--library/src/main/java/com/bumptech/glide/load/resource/gifbitmap/ImageVideoGifDataLoadProvider.java20
-rw-r--r--library/src/main/java/com/bumptech/glide/provider/ChildLoadProvider.java10
-rw-r--r--library/src/main/java/com/bumptech/glide/provider/FixedLoadProvider.java6
-rw-r--r--library/src/main/java/com/bumptech/glide/request/GenericRequest.java5
-rw-r--r--library/src/test/java/com/bumptech/glide/GlideTest.java2
-rw-r--r--library/src/test/java/com/bumptech/glide/load/CacheLoaderTest.java22
-rw-r--r--library/src/test/java/com/bumptech/glide/load/NullResourceEncoderTest.java (renamed from library/src/test/java/com/bumptech/glide/load/SkipCacheTest.java)10
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/DefaultResourceRunnerFactoryTest.java6
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/EngineTest.java5
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/ResourceRunnerTest.java7
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/SourceResourceRunnerTest.java66
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java19
-rw-r--r--library/src/test/java/com/bumptech/glide/load/resource/FileToStreamDecoderTest.java87
-rw-r--r--library/src/test/java/com/bumptech/glide/provider/ChildLoadProviderTest.java7
-rw-r--r--library/src/test/java/com/bumptech/glide/request/GenericRequestTest.java6
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);