1dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddpackage com.bumptech.glide.load.model;
2dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
3dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport android.os.ParcelFileDescriptor;
4dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport android.util.Log;
5dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport com.bumptech.glide.Priority;
6bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.data.DataFetcher;
7dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
8dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport java.io.InputStream;
9dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
10dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddpublic class ImageVideoModelLoader<A> implements ModelLoader<A, ImageVideoWrapper> {
11dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    private static final String TAG = "IVML";
12dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
13dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    private final ModelLoader<A, InputStream> streamLoader;
14dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    private final ModelLoader<A, ParcelFileDescriptor> fileDescriptorLoader;
15dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
16dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public ImageVideoModelLoader(ModelLoader<A, InputStream> streamLoader,
17dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            ModelLoader<A, ParcelFileDescriptor> fileDescriptorLoader) {
18dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        if (streamLoader == null && fileDescriptorLoader == null) {
19dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            throw new NullPointerException("At least one of streamLoader and fileDescriptorLoader must be non null");
20dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
21dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        this.streamLoader = streamLoader;
22dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        this.fileDescriptorLoader = fileDescriptorLoader;
23dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    }
24dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
25dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    @Override
26bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd    public DataFetcher<ImageVideoWrapper> getResourceFetcher(A model, int width, int height) {
27bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        DataFetcher<InputStream> streamFetcher = null;
28dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        if (streamLoader != null) {
29dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            streamFetcher = streamLoader.getResourceFetcher(model, width, height);
30dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
31bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        DataFetcher<ParcelFileDescriptor> fileDescriptorFetcher = null;
32dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        if (fileDescriptorLoader != null) {
33dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            fileDescriptorFetcher = fileDescriptorLoader.getResourceFetcher(model, width, height);
34dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
35dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        return new ImageVideoFetcher(streamFetcher, fileDescriptorFetcher);
36dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    }
37dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
38bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd    public static class ImageVideoFetcher implements DataFetcher<ImageVideoWrapper> {
39bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        private final DataFetcher<InputStream> streamFetcher;
40bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        private final DataFetcher<ParcelFileDescriptor> fileDescriptorFetcher;
41dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
42bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        public ImageVideoFetcher(DataFetcher<InputStream> streamFetcher,
43bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd                DataFetcher<ParcelFileDescriptor> fileDescriptorFetcher) {
44dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            this.streamFetcher = streamFetcher;
45dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            this.fileDescriptorFetcher = fileDescriptorFetcher;
46dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
47dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        @Override
48bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd        public ImageVideoWrapper loadData(Priority priority) throws Exception {
49dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            InputStream is = null;
50dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (streamFetcher != null) {
51dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                try {
52bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd                    is = streamFetcher.loadData(priority);
53dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                } catch (Exception e) {
54dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
55dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                        Log.v(TAG, "Exception fetching input stream, trying ParcelFileDescriptor", e);
56dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    }
57dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    if (fileDescriptorFetcher == null) {
58dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                        throw e;
59dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    }
60dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                }
61dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
62dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            ParcelFileDescriptor fileDescriptor = null;
63dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (fileDescriptorFetcher != null) {
64dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                try {
65bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd                    fileDescriptor = fileDescriptorFetcher.loadData(priority);
66dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                } catch (Exception e) {
67dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
68dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                        Log.v(TAG, "Exception fetching ParcelFileDescriptor", e);
69dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    }
70dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    if (is == null) {
71dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                        throw e;
72dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                    }
73dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                }
74dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
75dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            return new ImageVideoWrapper(is, fileDescriptor);
76dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
77dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
78dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        @Override
79dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        public void cleanup() {
80dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            //TODO: what if this throws?
81dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (streamFetcher != null) {
82dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                streamFetcher.cleanup();
83dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
84dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (fileDescriptorFetcher != null) {
85dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                fileDescriptorFetcher.cleanup();
86dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
87dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
88dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd
89dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        @Override
9078bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd        public String getId() {
9178bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd            // Both the stream fetcher and the file descriptor fetcher should return the same id.
9278bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd            if (streamFetcher != null) {
9378bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd                return streamFetcher.getId();
9478bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd            } else {
9578bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd                return fileDescriptorFetcher.getId();
9678bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd            }
9778bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd        }
9878bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd
9978bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd        @Override
100dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        public void cancel() {
101dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (streamFetcher != null) {
102dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                streamFetcher.cancel();
103dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
104dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            if (fileDescriptorFetcher != null) {
105dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                fileDescriptorFetcher.cancel();
106dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            }
107dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        }
108dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    }
109dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd}
110