12d923581ee57592181845aa98231eec988fab9f6Sam Juddpackage com.bumptech.glide.volley;
2633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd
3633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Juddimport com.android.volley.NetworkResponse;
4633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Juddimport com.android.volley.Request;
5633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Juddimport com.android.volley.RequestQueue;
6633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Juddimport com.android.volley.Response;
798df997689b40779cc93b3678f559cf7ae32f13eSam Juddimport com.android.volley.toolbox.HttpHeaderParser;
89bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.Priority;
9bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.data.DataFetcher;
10633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd
11633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Juddimport java.io.ByteArrayInputStream;
120ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Juddimport java.io.InputStream;
13633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd
14633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd/**
15bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd * A DataFetcher backed by volley for fetching images via http.
16633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd */
17bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddpublic class VolleyStreamFetcher implements DataFetcher<InputStream> {
18633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    private final RequestQueue requestQueue;
19633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    private final String url;
20c9348b94306eb775d5f52273b836a839355541c5Sam Judd    private VolleyRequestFuture<InputStream> requestFuture;
21633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd
22fdb5f853e615ab46a4f3dea3a46bfca09c75f27aSam Judd    @SuppressWarnings("unused")
230ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd    public VolleyStreamFetcher(RequestQueue requestQueue, String url) {
2445d19e27d8f8cc8f24f9a68efdf9f28e5f97851eSam Judd        this(requestQueue, url,  null);
25d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd    }
26d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd
2745d19e27d8f8cc8f24f9a68efdf9f28e5f97851eSam Judd    public VolleyStreamFetcher(RequestQueue requestQueue, String url, VolleyRequestFuture<InputStream> requestFuture) {
28633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd        this.requestQueue = requestQueue;
29633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd        this.url = url;
30b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        this.requestFuture = requestFuture;
31b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        if (requestFuture == null) {
32b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd            this.requestFuture = VolleyRequestFuture.newFuture();
33b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        }
34633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    }
35633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd
36633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    @Override
37bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd    public InputStream loadData(Priority priority) throws Exception {
389bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd        GlideRequest request = new GlideRequest(url, requestFuture, glideToVolleyPriority(priority));
390ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd
40c9348b94306eb775d5f52273b836a839355541c5Sam Judd        requestFuture.setRequest(requestQueue.add(request));
410ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd
420ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd        return requestFuture.get();
430ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd    }
440ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd
450ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd    @Override
467f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd    public void cleanup() {
477f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd        // Do nothing.
487f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd    }
497f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd
507f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd    @Override
5178bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd    public String getId() {
5278bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd        return url;
5378bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd    }
5478bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd
5578bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd    @Override
56633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    public void cancel() {
57c9348b94306eb775d5f52273b836a839355541c5Sam Judd        VolleyRequestFuture<InputStream> localFuture = requestFuture;
5898df997689b40779cc93b3678f559cf7ae32f13eSam Judd        if (localFuture != null) {
59c9348b94306eb775d5f52273b836a839355541c5Sam Judd            localFuture.cancel(true);
6098df997689b40779cc93b3678f559cf7ae32f13eSam Judd        }
61633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd    }
62d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd
639bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd    private static Request.Priority glideToVolleyPriority(Priority priority) {
649bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd        switch (priority) {
651d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            case LOW:
661d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd                return Request.Priority.LOW;
671d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            case HIGH:
681d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd                return Request.Priority.HIGH;
691d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            case IMMEDIATE:
701d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd                return Request.Priority.IMMEDIATE;
711d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            default:
721d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd                return Request.Priority.NORMAL;
731d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd
741d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        }
751d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd    }
761d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd
7798df997689b40779cc93b3678f559cf7ae32f13eSam Judd    private static class GlideRequest extends Request<byte[]> {
78c9348b94306eb775d5f52273b836a839355541c5Sam Judd        private final VolleyRequestFuture<InputStream> future;
791d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        private Priority priority;
80d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd
811d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        public GlideRequest(String url, VolleyRequestFuture<InputStream> future, Priority priority) {
820ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd            super(Method.GET, url, future);
830ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd            this.future = future;
841d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            this.priority = priority;
851d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        }
861d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd
871d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        @Override
881d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd        public Priority getPriority() {
891d11261d4ec2ab97c5eec91a3d1c14625c5b23caSam Judd            return priority;
90d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd        }
91d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd
92d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd        @Override
9398df997689b40779cc93b3678f559cf7ae32f13eSam Judd        protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {
9498df997689b40779cc93b3678f559cf7ae32f13eSam Judd            return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response));
95d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd        }
96d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd
97d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd        @Override
9898df997689b40779cc93b3678f559cf7ae32f13eSam Judd        protected void deliverResponse(byte[] response) {
9998df997689b40779cc93b3678f559cf7ae32f13eSam Judd            future.onResponse(new ByteArrayInputStream(response));
1000ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd        }
101d50efbfe3f305040ff0f1880238a1517ab7091c5Sam Judd    }
102633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd}
103