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