blob: 8c3a999aa15956dc9c74dff4827fb4450945966b [file] [log] [blame]
package com.bumptech.glide.load.data;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.bumptech.glide.Priority;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* A DataFetcher that uses an {@link android.content.ContentResolver} to load data from a {@link android.net.Uri}
* pointing to a local resource.
*
* @param <T> The type of data that will obtained for the given uri (For example, {@link java.io.InputStream} or
* {@link android.os.ParcelFileDescriptor}.
*/
public abstract class LocalUriFetcher<T> implements DataFetcher<T> {
private static final String TAG = "LocalUriFetcher";
private final Uri uri;
private final Context context;
private T data;
/**
* Opens an input stream for a uri pointing to a local asset. Only certain uris are supported
*
* @see ContentResolver#openInputStream(android.net.Uri)
*
* @param context A context (this will be weakly referenced and the load will fail if the weak reference
* is cleared before {@link #loadData(Priority)}} is called.
* @param uri A Uri pointing to a local asset. This load will fail if the uri isn't openable by
* {@link ContentResolver#openInputStream(android.net.Uri)}
*/
public LocalUriFetcher(Context context, Uri uri) {
this.context = context.getApplicationContext();
this.uri = uri;
}
@Override
public final T loadData(Priority priority) throws Exception {
ContentResolver contentResolver = context.getContentResolver();
data = loadResource(uri, contentResolver);
return data;
}
@Override
public void cleanup() {
if (data != null) {
try {
close(data);
} catch (IOException e) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "failed to close data", e);
}
}
}
}
@Override
public void cancel() {
// Do nothing.
}
@Override
public String getId() {
return uri.toString();
}
/**
* Returns a concrete data type from the given {@link android.net.Uri} using the given
* {@link android.content.ContentResolver}.
*
* @throws FileNotFoundException
*/
protected abstract T loadResource(Uri uri, ContentResolver contentResolver) throws FileNotFoundException;
/**
* Closes the concrete data type if necessary.
*
* <p>
* Note - We can't rely on the closeable interface because it was added after our min API level. See issue #157.
* </p>
*
* @param data The data to close.
* @throws IOException
*/
protected abstract void close(T data) throws IOException;
}