diff --git a/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyRequestFactory.java b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyRequestFactory.java new file mode 100644 index 0000000000..713ac9c6f1 --- /dev/null +++ b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyRequestFactory.java @@ -0,0 +1,19 @@ +package com.bumptech.glide.integration.volley; + +import com.android.volley.Request; +import com.android.volley.Request.Priority; + +import java.io.InputStream; + +/** + * Used to construct a custom Volley request, such as for authentication header decoration. + */ +public interface VolleyRequestFactory { + + /** + * Returns a Volley request for the given image url. The given future should be set as a + * listener or called when the request completes. + */ + Request create(String url, VolleyRequestFuture future, Priority priority); + +} diff --git a/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyStreamFetcher.java b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyStreamFetcher.java index ee3f5cb78f..00de8e619f 100644 --- a/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyStreamFetcher.java +++ b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyStreamFetcher.java @@ -16,7 +16,19 @@ * A DataFetcher backed by volley for fetching images via http. */ public class VolleyStreamFetcher implements DataFetcher { + public static final VolleyRequestFactory DEFAULT_REQUEST_FACTORY = new VolleyRequestFactory() { + + @Override + public Request create( + String url, VolleyRequestFuture future, + Request.Priority priority) { + return new GlideRequest(url, future, priority); + } + + }; + private final RequestQueue requestQueue; + private final VolleyRequestFactory requestFactory; private final GlideUrl url; private VolleyRequestFuture requestFuture; @@ -27,8 +39,14 @@ public VolleyStreamFetcher(RequestQueue requestQueue, GlideUrl url) { public VolleyStreamFetcher(RequestQueue requestQueue, GlideUrl url, VolleyRequestFuture requestFuture) { + this(requestQueue, url, requestFuture, DEFAULT_REQUEST_FACTORY); + } + + public VolleyStreamFetcher(RequestQueue requestQueue, GlideUrl url, + VolleyRequestFuture requestFuture, VolleyRequestFactory requestFactory) { this.requestQueue = requestQueue; this.url = url; + this.requestFactory = requestFactory; this.requestFuture = requestFuture; if (requestFuture == null) { this.requestFuture = VolleyRequestFuture.newFuture(); @@ -39,7 +57,8 @@ public VolleyStreamFetcher(RequestQueue requestQueue, GlideUrl url, public InputStream loadData(Priority priority) throws Exception { // Make sure the string url safely encodes non ascii characters. String stringUrl = url.toURL().toString(); - GlideRequest request = new GlideRequest(stringUrl, requestFuture, glideToVolleyPriority(priority)); + Request request = requestFactory.create( + stringUrl, requestFuture, glideToVolleyPriority(priority)); requestFuture.setRequest(requestQueue.add(request)); @@ -80,7 +99,7 @@ private static Request.Priority glideToVolleyPriority(Priority priority) { private static class GlideRequest extends Request { private final VolleyRequestFuture future; - private Priority priority; + private final Priority priority; public GlideRequest(String url, VolleyRequestFuture future, Priority priority) { super(Method.GET, url, future); diff --git a/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyUrlLoader.java b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyUrlLoader.java index 686cb21a07..b1be94abdf 100644 --- a/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyUrlLoader.java +++ b/integration/volley/src/main/java/com/bumptech/glide/integration/volley/VolleyUrlLoader.java @@ -23,6 +23,7 @@ public class VolleyUrlLoader implements ModelLoader { public static class Factory implements ModelLoaderFactory { private static RequestQueue internalQueue; private RequestQueue requestQueue; + private final VolleyRequestFactory requestFactory; private static RequestQueue getInternalQueue(Context context) { if (internalQueue == null) { @@ -46,12 +47,21 @@ public Factory(Context context) { * Constructor for a new Factory that runs requests using the given {@link RequestQueue}. */ public Factory(RequestQueue requestQueue) { + this(requestQueue, VolleyStreamFetcher.DEFAULT_REQUEST_FACTORY); + } + + /** + * Constructor for a new Factory with a custom Volley request factory that runs requests + * using the given {@link RequestQueue}. + */ + public Factory(RequestQueue requestQueue, VolleyRequestFactory requestFactory) { + this.requestFactory = requestFactory; this.requestQueue = requestQueue; } @Override public ModelLoader build(Context context, GenericLoaderFactory factories) { - return new VolleyUrlLoader(requestQueue); + return new VolleyUrlLoader(requestQueue, requestFactory); } @Override @@ -61,13 +71,20 @@ public void teardown() { } private final RequestQueue requestQueue; + private final VolleyRequestFactory requestFactory; public VolleyUrlLoader(RequestQueue requestQueue) { + this(requestQueue, VolleyStreamFetcher.DEFAULT_REQUEST_FACTORY); + } + + public VolleyUrlLoader(RequestQueue requestQueue, VolleyRequestFactory requestFactory) { this.requestQueue = requestQueue; + this.requestFactory = requestFactory; } @Override public DataFetcher getResourceFetcher(GlideUrl url, int width, int height) { - return new VolleyStreamFetcher(requestQueue, url, new VolleyRequestFuture()); + return new VolleyStreamFetcher( + requestQueue, url, new VolleyRequestFuture(), requestFactory); } }