1bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddpackage com.bumptech.glide.load.data; 24e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 34e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport android.content.ContentResolver; 44e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport android.content.Context; 54e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport android.net.Uri; 69aee125089100198f025b5af6f6925eb0050f9b6Sam Juddimport android.util.Log; 79bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.Priority; 84e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 99aee125089100198f025b5af6f6925eb0050f9b6Sam Juddimport java.io.Closeable; 10fcd787c911d5fbca2a34ff0963d4665543a03275Sam Juddimport java.io.FileNotFoundException; 119aee125089100198f025b5af6f6925eb0050f9b6Sam Juddimport java.io.IOException; 124e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport java.lang.ref.WeakReference; 134e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 144e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd/** 154e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * 164e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd */ 17bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddpublic abstract class LocalUriFetcher<T extends Closeable> implements DataFetcher<T> { 189aee125089100198f025b5af6f6925eb0050f9b6Sam Judd private static final String TAG = "LocalUriFetcher"; 194e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd private final WeakReference<Context> contextRef; 204e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd private final Uri uri; 219aee125089100198f025b5af6f6925eb0050f9b6Sam Judd private T data; 224e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 234e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd /** 2493988c0256d2bbd47ca5d45b316efe9de7dbfd5fSam Judd * Opens an input stream for a uri pointing to a local asset. Only certain uris are supported 254e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * 264e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * @see ContentResolver#openInputStream(android.net.Uri) 274e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * 289bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd * @param context A context (this will be weakly referenced and the load will fail if the weak reference 29bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd * is cleared before {@link #loadData(Priority)}} is called. 304e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * @param uri A Uri pointing to a local asset. This load will fail if the uri isn't openable by 314e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * {@link ContentResolver#openInputStream(android.net.Uri)} 324e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd */ 330ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd public LocalUriFetcher(Context context, Uri uri) { 344e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd contextRef = new WeakReference<Context>(context); 354e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd this.uri = uri; 364e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd } 374e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 384e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd @Override 39bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Judd public final T loadData(Priority priority) throws Exception { 400ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd Context context = contextRef.get(); 410ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd if (context == null) { 420ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd throw new NullPointerException("Context has been cleared in LocalUriFetcher uri: " + uri); 434e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd } 440ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd ContentResolver contentResolver = context.getContentResolver(); 459aee125089100198f025b5af6f6925eb0050f9b6Sam Judd data = loadResource(uri, contentResolver); 469aee125089100198f025b5af6f6925eb0050f9b6Sam Judd return data; 470ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd } 484e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 490ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd @Override 507f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd public void cleanup() { 519aee125089100198f025b5af6f6925eb0050f9b6Sam Judd if (data != null) { 529aee125089100198f025b5af6f6925eb0050f9b6Sam Judd try { 539aee125089100198f025b5af6f6925eb0050f9b6Sam Judd data.close(); 549aee125089100198f025b5af6f6925eb0050f9b6Sam Judd } catch (IOException e) { 559aee125089100198f025b5af6f6925eb0050f9b6Sam Judd if (Log.isLoggable(TAG, Log.VERBOSE)) { 569aee125089100198f025b5af6f6925eb0050f9b6Sam Judd Log.v(TAG, "failed to close data", e); 579aee125089100198f025b5af6f6925eb0050f9b6Sam Judd } 589aee125089100198f025b5af6f6925eb0050f9b6Sam Judd } 597f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd 609aee125089100198f025b5af6f6925eb0050f9b6Sam Judd } 619aee125089100198f025b5af6f6925eb0050f9b6Sam Judd } 627f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd 637f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd @Override 647f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd public void cancel() { 657f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd // Do nothing. 667f6d858477e6852fff5c5e49897fc2f9e7140edcSam Judd } 67fcd787c911d5fbca2a34ff0963d4665543a03275Sam Judd 6878bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd @Override 6978bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd public String getId() { 7078bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd return uri.toString(); 7178bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd } 7278bad2aa32f824f9e098b5058dfa3506a7ed3f62Sam Judd 73fcd787c911d5fbca2a34ff0963d4665543a03275Sam Judd protected abstract T loadResource(Uri uri, ContentResolver contentResolver) throws FileNotFoundException; 744e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd} 754e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd 76