package com.bumptech.glide.volley; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import com.bumptech.glide.Priority; import com.bumptech.glide.load.data.DataFetcher; import java.io.ByteArrayInputStream; import java.io.InputStream; /** * A DataFetcher backed by volley for fetching images via http. */ public class VolleyStreamFetcher implements DataFetcher { private final RequestQueue requestQueue; private final String url; private VolleyRequestFuture requestFuture; @SuppressWarnings("unused") public VolleyStreamFetcher(RequestQueue requestQueue, String url) { this(requestQueue, url, null); } public VolleyStreamFetcher(RequestQueue requestQueue, String url, VolleyRequestFuture requestFuture) { this.requestQueue = requestQueue; this.url = url; this.requestFuture = requestFuture; if (requestFuture == null) { this.requestFuture = VolleyRequestFuture.newFuture(); } } @Override public InputStream loadData(Priority priority) throws Exception { GlideRequest request = new GlideRequest(url, requestFuture, glideToVolleyPriority(priority)); requestFuture.setRequest(requestQueue.add(request)); return requestFuture.get(); } @Override public void cleanup() { // Do nothing. } @Override public String getId() { return url; } @Override public void cancel() { VolleyRequestFuture localFuture = requestFuture; if (localFuture != null) { localFuture.cancel(true); } } private static Request.Priority glideToVolleyPriority(Priority priority) { switch (priority) { case LOW: return Request.Priority.LOW; case HIGH: return Request.Priority.HIGH; case IMMEDIATE: return Request.Priority.IMMEDIATE; default: return Request.Priority.NORMAL; } } private static class GlideRequest extends Request { private final VolleyRequestFuture future; private Priority priority; public GlideRequest(String url, VolleyRequestFuture future, Priority priority) { super(Method.GET, url, future); this.future = future; this.priority = priority; } @Override public Priority getPriority() { return priority; } @Override protected Response parseNetworkResponse(NetworkResponse response) { return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(byte[] response) { future.onResponse(new ByteArrayInputStream(response)); } } }