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