Glide.java revision fc3f03260933d96fae33a43846860f226dd661fe
1d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddpackage com.bumptech.glide;
2d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
30e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Juddimport android.content.ComponentCallbacks2;
4d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport android.content.Context;
50ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Juddimport android.graphics.Bitmap;
677e0200ba76c89177b6ec8c781f4f8f86984989bSam Juddimport android.graphics.drawable.BitmapDrawable;
7b44604067356bb73cae3c910ac0e0044d26974a5Sam Juddimport android.graphics.drawable.Drawable;
84e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport android.net.Uri;
9fcd787c911d5fbca2a34ff0963d4665543a03275Sam Juddimport android.os.ParcelFileDescriptor;
10e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Juddimport android.util.Log;
11b44604067356bb73cae3c910ac0e0044d26974a5Sam Juddimport android.view.View;
12d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport android.widget.ImageView;
1329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Juddimport com.android.volley.RequestQueue;
14127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.Engine;
15127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
16127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.cache.DiskCache;
17127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.cache.MemoryCache;
189fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.GenericLoaderFactory;
19127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.model.GlideUrl;
20dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport com.bumptech.glide.load.model.ImageVideoWrapper;
219fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.ModelLoader;
229fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.ModelLoaderFactory;
239fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorFileLoader;
249fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorModelLoader;
259fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorResourceLoader;
269fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorStringLoader;
279fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorUriLoader;
289fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamFileLoader;
299fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamModelLoader;
309fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamResourceLoader;
319fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamStringLoader;
329fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamUriLoader;
339fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamUrlLoader;
34be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.FileDescriptorBitmapDataLoadProvider;
35be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.ImageVideoDataLoadProvider;
36be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.StreamBitmapDataLoadProvider;
37be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.gif.GifDataLoadProvider;
38fc3f03260933d96fae33a43846860f226dd661feSam Juddimport com.bumptech.glide.load.resource.gifbitmap.GifBitmapWrapper;
39be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.gifbitmap.ImageVideoGifDataLoadProvider;
40be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.BitmapDrawableTranscoder;
41be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.GifBitmapDrawableTranscoder;
42be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
43be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.TranscoderFactory;
4495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddimport com.bumptech.glide.provider.DataLoadProviderFactory;
459fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.Request;
46785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.target.ImageViewTargetFactory;
479fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.Target;
489fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.ViewTarget;
492d923581ee57592181845aa98231eec988fab9f6Sam Juddimport com.bumptech.glide.volley.VolleyUrlLoader;
50d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
51d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport java.io.File;
520ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Juddimport java.io.InputStream;
53d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport java.net.URL;
5478790c322a30ac2e62498b79bdc965832bf2342dSam Judd
55d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd/**
5644e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd * A singleton to present a simple static interface for building requests with {@link BitmapRequestBuilder} and maintaining
570e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * an {@link Engine}, {@link BitmapPool}, {@link DiskCache} and {@link MemoryCache}.
5856e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd *
59058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd * <p>
6056e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd * Note - This class is not thread safe.
61058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd * </p>
62d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd */
63d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddpublic class Glide {
640e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    // 250 MB
650e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    static final int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
660e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
670e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
68e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd    private static final String TAG = "Glide";
6929f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    private static Glide GLIDE;
700e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
71c95a13d712f57271047e467d367e1145517b0c2aSam Judd    private final GenericLoaderFactory loaderFactory = new GenericLoaderFactory();
7229f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    private final RequestQueue requestQueue;
73b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    private final Engine engine;
7427eb05702fd4531d6974640c62df1d569629edb6Sam Judd    private final BitmapPool bitmapPool;
750e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private final MemoryCache memoryCache;
7695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
7795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final TranscoderFactory transcoderFactory = new TranscoderFactory();
7895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final DataLoadProviderFactory dataLoadProviderFactory;
790e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
800e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
810e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Try to get the external cache directory if available and default to the internal. Use a default name for the
820e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * cache directory if no name is provided
830e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
840e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param context A context
850e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @return A File representing the default disk cache directory
860e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
870e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public static File getPhotoCacheDir(Context context) {
880e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return getPhotoCacheDir(context, DEFAULT_DISK_CACHE_DIR);
890e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
900e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
910e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
920e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Try to get the external cache directory if available and default to the internal. Use a default name for the
930e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * cache directory if no name is provided
940e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
950e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param context A context
960e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param cacheName The name of the subdirectory in which to store the cache
970e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @return A File representing the default disk cache directory
980e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
990e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    @SuppressWarnings("ResultOfMethodCallIgnored")
1000e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public static File getPhotoCacheDir(Context context, String cacheName) {
1010e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        File cacheDir = context.getCacheDir();
1020e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (cacheDir != null) {
1030e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            File result = new File(cacheDir, cacheName);
1040e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            result.mkdirs();
1050e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            return result;
1060e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        }
1070e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (Log.isLoggable(TAG, Log.ERROR)) {
1080e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            Log.e(TAG, "default disk cache dir is null");
1090e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        }
1100e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return null;
1110e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
112d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
11356e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd    /**
11456e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     * Get the singleton.
11556e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     *
11656e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     * @return the singleton
11756e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     */
11829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static Glide get(Context context) {
11929f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        if (GLIDE == null) {
12029f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            GLIDE = new GlideBuilder(context).createGlide();
12129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        }
12229f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
123d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd        return GLIDE;
124d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
125d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
1269f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    /**
1279f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * Returns false if the {@link Glide} singleton has not yet been created and can therefore be setup using
1289f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * {@link #setup(GlideBuilder)}.
1299f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1309f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @see #setup(GlideBuilder)
1319f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     */
13229f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static boolean isSetup() {
13329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        return GLIDE != null;
13429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    }
13529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
1369f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    /**
1379f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * Creates the {@link Glide} singleton using the given builder. Can be used to set options like cache sizes and
1389f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * locations.
1399f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1409f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @see #isSetup()
1419f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1429f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @param builder The builder.
1439f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @throws IllegalArgumentException if the Glide singleton has already been created.
1449f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     */
14529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static void setup(GlideBuilder builder) {
1460e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (isSetup()) {
14729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            throw new IllegalArgumentException("Glide is already setup, check with isSetup() first");
14829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        }
14929f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
15029f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        GLIDE = builder.createGlide();
15129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    }
15229f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
153b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    static void tearDown() {
154b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        GLIDE = null;
155b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    }
156b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd
15777e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    Glide(Engine engine, RequestQueue requestQueue, MemoryCache memoryCache, BitmapPool bitmapPool,
158be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd            Context context) {
159b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        this.engine = engine;
16029f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        this.requestQueue = requestQueue;
16127eb05702fd4531d6974640c62df1d569629edb6Sam Judd        this.bitmapPool = bitmapPool;
1620e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        this.memoryCache = memoryCache;
163c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
16495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        dataLoadProviderFactory = new DataLoadProviderFactory();
16595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        dataLoadProviderFactory.register(InputStream.class, Bitmap.class, new StreamBitmapDataLoadProvider(bitmapPool));
166be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
16795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        dataLoadProviderFactory.register(ParcelFileDescriptor.class, Bitmap.class,
16895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                new FileDescriptorBitmapDataLoadProvider(bitmapPool));
169be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
170be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        ImageVideoDataLoadProvider imageVideoDataLoadProvider = new ImageVideoDataLoadProvider(bitmapPool);
171be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        dataLoadProviderFactory.register(ImageVideoWrapper.class, Bitmap.class, imageVideoDataLoadProvider);
172be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
173be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        GifDataLoadProvider gifDataLoadProvider = new GifDataLoadProvider(context, bitmapPool);
174fc3f03260933d96fae33a43846860f226dd661feSam Judd        dataLoadProviderFactory.register(ImageVideoWrapper.class, GifBitmapWrapper.class,
175be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd                new ImageVideoGifDataLoadProvider(imageVideoDataLoadProvider, gifDataLoadProvider));
176c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
177896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());
178896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(File.class, InputStream.class, new StreamFileLoader.Factory());
179896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Integer.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
180896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Integer.class, InputStream.class, new StreamResourceLoader.Factory());
181896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(String.class, ParcelFileDescriptor.class, new FileDescriptorStringLoader.Factory());
182896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(String.class, InputStream.class, new StreamStringLoader.Factory());
183896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Uri.class, ParcelFileDescriptor.class, new FileDescriptorUriLoader.Factory());
184896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Uri.class, InputStream.class, new StreamUriLoader.Factory());
185c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd        register(URL.class, InputStream.class, new StreamUrlLoader.Factory());
186c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd        register(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(requestQueue));
18777e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd
18895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        transcoderFactory.register(Bitmap.class, BitmapDrawable.class,
189be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd                new BitmapDrawableTranscoder(context.getResources(), bitmapPool));
190fc3f03260933d96fae33a43846860f226dd661feSam Judd        transcoderFactory.register(GifBitmapWrapper.class, Drawable.class,
191be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd                new GifBitmapDrawableTranscoder(context));
192e13dcedf144c02927c122fae32179f460b21fef5Sam Judd    }
193e13dcedf144c02927c122fae32179f460b21fef5Sam Judd
194be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd    public BitmapPool getBitmapPool() {
195d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return bitmapPool;
196d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
197d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
198be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd    public MemoryCache getMemoryCache() {
199be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        return memoryCache;
200be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd    }
201be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
202d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <Z, R> ResourceTranscoder<Z, R> buildTranscoder(Class<Z> decodedClass, Class<R> transcodedClass) {
203d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return transcoderFactory.get(decodedClass, transcodedClass);
204d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
205d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
206d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <T, Z> DataLoadProvider<T, Z> buildDataProvider(Class<T> dataClass, Class<Z> decodedClass) {
207d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return dataLoadProviderFactory.get(dataClass, decodedClass);
208d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
209d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
210d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <R> Target<R> buildImageViewTarget(ImageView imageView, Class<R> transcodedClass) {
211d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return imageViewTargetFactory.buildTarget(imageView, transcodedClass);
212d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
213d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
214d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    Engine getEngine() {
215d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return engine;
216d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
217d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
2180e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private GenericLoaderFactory getLoaderFactory() {
2190e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return loaderFactory;
2200e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2210e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
222d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    /**
22329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd     * Returns the {@link RequestQueue} Glide is using to fetch images over http/https.
224d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd     */
22529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public RequestQueue getRequestQueue() {
22629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        return requestQueue;
227d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
228d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
229d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    /**
2300e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Clears as much memory as possible.
2310e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
2320e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @see ComponentCallbacks2#onLowMemory()
2330e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
2340e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public void clearMemory() {
2350e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        bitmapPool.clearMemory();
2360e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        memoryCache.clearMemory();
2370e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2380e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2390e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
2400e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Clears some memory with the exact amount depending on the given level.
2410e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
2420e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @see ComponentCallbacks2#onTrimMemory(int)
2430e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
2440e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public void trimMemory(int level) {
2450e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        bitmapPool.trimMemory(level);
2460e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        memoryCache.trimMemory(level);
2470e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2480e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2490e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
2507050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * Adjusts Glide's current and maximum memory usage based on the given {@link MemoryCategory}.
2517050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *
2527050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * <p>
2537050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     The default {@link MemoryCategory} is {@link MemoryCategory#NORMAL}. {@link MemoryCategory#HIGH} increases
2547050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     Glide's maximum memory usage by up to 50% and {@link MemoryCategory#LOW} decreases Glide's maximum memory
2557050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     usage by 50%. This method should be used to temporarily increase or decrease memory useage for a single
2567050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     Activity or part of the app. Use {@link GlideBuilder#setMemoryCache(MemoryCache)} to set a permanent
2577050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     memory size if you want to change the default.
2587050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * </p>
2597050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     */
2607050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    public void setMemoryCategory(MemoryCategory memoryCategory) {
2617050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd        memoryCache.setSizeMultiplier(memoryCategory.getMultiplier());
2627050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd        bitmapPool.setSizeMultiplier(memoryCategory.getMultiplier());
2637050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    }
2647050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd
2657050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    /**
266b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Cancel any pending loads Glide may have for the target and free any resources (such as {@link Bitmap}s) that may
267b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * have been loaded for the target so they may be reused.
268b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
269b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param target The Target to cancel loads for.
270b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
271b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public static void clear(Target target) {
272b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Request request = target.getRequest();
273b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (request!= null) {
274b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            request.clear();
275b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
276b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
277b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
278b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
279b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Cancel any pending loads Glide may have for the view and free any resources that may have been loaded for the
280b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * view.
281b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
282b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
283b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note that this will only work if {@link View#setTag(Object)} is not called on this view outside of Glide.
284b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
285b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
286b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see #clear(Target).
287b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
288b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param view The view to cancel loads and free resources for.
289b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @throws IllegalArgumentException if an object other than Glide's metadata is set as the view's tag.
290b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
291b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public static void clear(View view) {
292b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Target viewTarget = new ClearTarget(view);
293b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        clear(viewTarget);
294b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
295b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
296b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
297da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd     * Use the given factory to build a {@link ModelLoader} for models of the given class. Generally the best use of
298da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd     * this method is to replace one of the default factories or add an implementation for other similar low level
299d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd     * models. Typically the {@link ModelRequest#using(StreamModelLoader)} or
300d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd     * {@link ModelRequest#using(FileDescriptorModelLoader)} syntax is preferred because it directly links the model
301031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * with the ModelLoader being used to load it. Any factory replaced by the given factory will have its
302031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * {@link ModelLoaderFactory#teardown()}} method called.
303633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd     *
304058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd     * <p>
3059c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *     Note - If a factory already exists for the given class, it will be replaced. If that factory is not being
3060ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd     *     used for any other model class, {@link ModelLoaderFactory#teardown()}
3079c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *     will be called.
3089c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     * </p>
3099c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
310c95a13d712f57271047e467d367e1145517b0c2aSam Judd     * <p>
311c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *     Note - The factory must not be an anonymous inner class of an Activity or another object that cannot be
312c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *     retained statically.
313c95a13d712f57271047e467d367e1145517b0c2aSam Judd     * </p>
314c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *
315d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd     * @see ModelRequest#using(FileDescriptorModelLoader)
316d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd     * @see ModelRequest#using(StreamModelLoader)
317896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     *
318896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param modelClass The model class.
319896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param resourceClass The resource class the model loader will translate the model type into.
320896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param factory The factory to use.
321896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param <T> The type of the model.
322896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param <Y> the type of the resource.
3239c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
324896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd    public <T, Y> void register(Class<T> modelClass, Class<Y> resourceClass, ModelLoaderFactory<T, Y> factory) {
325896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        ModelLoaderFactory<T, Y> removed = loaderFactory.register(modelClass, resourceClass, factory);
3269c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd        if (removed != null) {
3279c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd            removed.teardown();
3289c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd        }
3299c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    }
3309c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
3319c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    /**
332031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * Removes any {@link ModelLoaderFactory} registered for the given model and resource classes if one exists. If a
333031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * {@link ModelLoaderFactory} is removed, its {@link ModelLoaderFactory#teardown()}} method will be called.
334031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     *
335031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param modelClass The model class.
336031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param resourceClass The resource class.
337031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param <T> The type of the model.
338031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param <Y> The type of the resource.
339031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     */
340031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    public <T, Y> void unregister(Class<T> modelClass, Class<Y> resourceClass) {
341031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        ModelLoaderFactory<T, Y> removed = loaderFactory.unregister(modelClass, resourceClass);
342031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        if (removed != null) {
343031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd            removed.teardown();
344031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        }
345031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    }
346031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
347031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    /**
34815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * Build a {@link ModelLoader} for the given model class using registered {@link ModelLoaderFactory}s.
3499c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
35015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildModelLoader(Object, Class, Context)
35115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildStreamModelLoader(Class, Context)
35215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildFileDescriptorModelLoader(Class, Context)
35315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
35415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param modelClass The class to get a {@link ModelLoader} for.
35515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param resourceClass The resource class to get a {@link ModelLoader} for.
35615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param context Any context.
35715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <T> The type of the model.
35815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <Y> The type of the resource.
35915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @return A new {@link ModelLoader} for the given model class.
3609c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
3610ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd    public static <T, Y> ModelLoader<T, Y> buildModelLoader(Class<T> modelClass, Class<Y> resourceClass,
3620ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd            Context context) {
36315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return Glide.get(context).getLoaderFactory().buildModelLoader(modelClass, resourceClass, context);
36415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
36515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
36615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
36715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A convenience method to build a {@link ModelLoader} for a given model object using registered
36815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * {@link ModelLoaderFactory}s.
36915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
37015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Class, Class, Context)
37115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
37215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param model A non null model object whose class we will get a {@link ModelLoader} for.
37315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param resourceClass The resource class to get a {@link ModelLoader} for.
37415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param context Any context.
37515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <T> The type of the model.
37615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <Y> The type of the resource.
377e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd     * @return A new {@link ModelLoader} for the given model and resource classes, or null if model is null.
37815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
37915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    @SuppressWarnings("unchecked")
38015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T, Y> ModelLoader<T, Y> buildModelLoader(T model, Class<Y> resourceClass, Context context) {
38115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        if (model == null) {
382e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            if (Log.isLoggable(TAG, Log.DEBUG)) {
383e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd                Log.d(TAG, "Unable to load null model, setting placeholder only");
384e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            }
385e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            return null;
38615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        }
38715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader((Class<T>) model.getClass(), resourceClass, context);
3889c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    }
3899c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
390ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    /**
39115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model that produces {@link InputStream}s using a registered
39215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * factory.
393ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     *
394ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * @see #buildModelLoader(Class, Class, android.content.Context)
395ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     */
396ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    public static <T> ModelLoader<T, InputStream> buildStreamModelLoader(Class<T> modelClass, Context context) {
397ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd        return buildModelLoader(modelClass, InputStream.class, context);
398ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    }
399ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd
400ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    /**
40115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model that produces {@link InputStream}s using a registered
40215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * factory.
40315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
40415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Object, Class, Context)
40515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
40615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T> ModelLoader<T, InputStream> buildStreamModelLoader(T model, Context context) {
40715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader(model, InputStream.class, context);
40815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
40915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
41015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
41115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model class that produces
412ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * {@link ParcelFileDescriptor}s using a registered factory.
413ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     *
414ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * @see #buildModelLoader(Class, Class, android.content.Context)
415ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     */
416ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    public static <T> ModelLoader<T, ParcelFileDescriptor> buildFileDescriptorModelLoader(Class<T> modelClass,
417ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd            Context context) {
418ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd        return buildModelLoader(modelClass, ParcelFileDescriptor.class, context);
419ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    }
420ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd
4218c7ae0d1551752a2ff6260dd807580a90020451eSam Judd    /**
42215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model class that produces
42315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * {@link ParcelFileDescriptor}s using a registered factory.
42415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
42515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Object, Class, android.content.Context)
42615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
42715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T> ModelLoader<T, ParcelFileDescriptor> buildFileDescriptorModelLoader(T model, Context context) {
42815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader(model, ParcelFileDescriptor.class, context);
42915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
43015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
43115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
4328c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * Begin a load with Glide by passing in a context.
4339c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
4348c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * @param context Any context, will not be retained.
4358c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * @return A model request to pass in the object representing the image to be loaded.
4369c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
437d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    public static ModelRequest with(Context context) {
438d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return new ModelRequest(context, Glide.get(context));
439d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
440d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
441ba414a3eba45ab6566a94c48babace5c1d6d721fSam Judd    private static class ClearTarget extends ViewTarget<View, Object> {
442b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        public ClearTarget(View view) {
443b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd            super(view);
444b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        }
445b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd
446b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        @Override
447785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd        public void onResourceReady(Object resource) { }
448b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd
449b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        @Override
450b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        public void setPlaceholder(Drawable placeholder) { }
451b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd    }
452d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd}
453