1d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddpackage com.bumptech.glide;
2d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
3fcca8d79a3a04e71924d06799de2af46c923a84eSam Juddimport android.annotation.TargetApi;
48a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Juddimport android.app.Activity;
50e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Juddimport android.content.ComponentCallbacks2;
6d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport android.content.Context;
70ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Juddimport android.graphics.Bitmap;
877e0200ba76c89177b6ec8c781f4f8f86984989bSam Juddimport android.graphics.drawable.BitmapDrawable;
9b44604067356bb73cae3c910ac0e0044d26974a5Sam Juddimport android.graphics.drawable.Drawable;
104e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Juddimport android.net.Uri;
11fcd787c911d5fbca2a34ff0963d4665543a03275Sam Juddimport android.os.ParcelFileDescriptor;
128a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Juddimport android.support.v4.app.Fragment;
138a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Juddimport android.support.v4.app.FragmentActivity;
14e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Juddimport android.util.Log;
15b44604067356bb73cae3c910ac0e0044d26974a5Sam Juddimport android.view.View;
16d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport android.widget.ImageView;
1729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Juddimport com.android.volley.RequestQueue;
18127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.Engine;
19127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
20127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.cache.DiskCache;
21127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.engine.cache.MemoryCache;
229fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.GenericLoaderFactory;
23127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Juddimport com.bumptech.glide.load.model.GlideUrl;
24dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddimport com.bumptech.glide.load.model.ImageVideoWrapper;
259fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.ModelLoader;
269fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.ModelLoaderFactory;
279fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorFileLoader;
289fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorModelLoader;
299fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorResourceLoader;
309fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorStringLoader;
319fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorUriLoader;
329fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamFileLoader;
339fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamModelLoader;
349fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamResourceLoader;
359fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamStringLoader;
369fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamUriLoader;
379fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.model.stream.StreamUrlLoader;
3870db081bbc0a80737f457c6388f4af4c1391f5f5Sam Juddimport com.bumptech.glide.load.resource.bitmap.CenterCrop;
39be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.FileDescriptorBitmapDataLoadProvider;
4070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Juddimport com.bumptech.glide.load.resource.bitmap.FitCenter;
41be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.ImageVideoDataLoadProvider;
42be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.bitmap.StreamBitmapDataLoadProvider;
43cbba04826bfaf4f8055f922bc41937572983c17fSam Juddimport com.bumptech.glide.load.resource.gif.GifData;
44be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.gif.GifDataLoadProvider;
45cbba04826bfaf4f8055f922bc41937572983c17fSam Juddimport com.bumptech.glide.load.resource.gif.GifDrawable;
46fc3f03260933d96fae33a43846860f226dd661feSam Juddimport com.bumptech.glide.load.resource.gifbitmap.GifBitmapWrapper;
4770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Juddimport com.bumptech.glide.load.resource.gifbitmap.GifBitmapWrapperTransformation;
48be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.gifbitmap.ImageVideoGifDataLoadProvider;
49be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.BitmapDrawableTranscoder;
5044b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Juddimport com.bumptech.glide.load.resource.transcode.GifBitmapWrapperDrawableTranscoder;
5144b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Juddimport com.bumptech.glide.load.resource.transcode.GifDataDrawableTranscoder;
52be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
53be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddimport com.bumptech.glide.load.resource.transcode.TranscoderFactory;
548a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Juddimport com.bumptech.glide.manager.RequestManagerRetriever;
5595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddimport com.bumptech.glide.provider.DataLoadProviderFactory;
56531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.GlideAnimation;
579fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.Request;
58785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.target.ImageViewTargetFactory;
599fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.Target;
609fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.ViewTarget;
612d923581ee57592181845aa98231eec988fab9f6Sam Juddimport com.bumptech.glide.volley.VolleyUrlLoader;
62d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
63d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport java.io.File;
640ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Juddimport java.io.InputStream;
65d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddimport java.net.URL;
6678790c322a30ac2e62498b79bdc965832bf2342dSam Judd
67d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd/**
6844e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd * A singleton to present a simple static interface for building requests with {@link BitmapRequestBuilder} and maintaining
690e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * an {@link Engine}, {@link BitmapPool}, {@link DiskCache} and {@link MemoryCache}.
7056e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd *
71058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd * <p>
7256e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd * Note - This class is not thread safe.
73058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd * </p>
74d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd */
75d76f655fc29c5b3858d6657f22a5c656c3143767Sam Juddpublic class Glide {
760e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    // 250 MB
770e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    static final int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
790e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
80e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd    private static final String TAG = "Glide";
8129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    private static Glide GLIDE;
820e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
83c95a13d712f57271047e467d367e1145517b0c2aSam Judd    private final GenericLoaderFactory loaderFactory = new GenericLoaderFactory();
8429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    private final RequestQueue requestQueue;
85b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    private final Engine engine;
8627eb05702fd4531d6974640c62df1d569629edb6Sam Judd    private final BitmapPool bitmapPool;
870e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private final MemoryCache memoryCache;
8895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
8995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final TranscoderFactory transcoderFactory = new TranscoderFactory();
9095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final DataLoadProviderFactory dataLoadProviderFactory;
9170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    private final CenterCrop bitmapCenterCrop;
9270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    private final GifBitmapWrapperTransformation drawableCenterCrop;
9370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    private final FitCenter bitmapFitCenter;
9470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    private final GifBitmapWrapperTransformation drawableFitCenter;
950e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
960e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
970e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Try to get the external cache directory if available and default to the internal. Use a default name for the
980e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * cache directory if no name is provided
990e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
1000e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param context A context
1010e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @return A File representing the default disk cache directory
1020e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
1030e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public static File getPhotoCacheDir(Context context) {
1040e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return getPhotoCacheDir(context, DEFAULT_DISK_CACHE_DIR);
1050e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
1060e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
1070e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
1080e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Try to get the external cache directory if available and default to the internal. Use a default name for the
1090e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * cache directory if no name is provided
1100e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
1110e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param context A context
1120e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @param cacheName The name of the subdirectory in which to store the cache
1130e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @return A File representing the default disk cache directory
1140e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
1150e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    @SuppressWarnings("ResultOfMethodCallIgnored")
1160e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public static File getPhotoCacheDir(Context context, String cacheName) {
1170e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        File cacheDir = context.getCacheDir();
1180e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (cacheDir != null) {
1190e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            File result = new File(cacheDir, cacheName);
1200e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            result.mkdirs();
1210e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            return result;
1220e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        }
1230e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (Log.isLoggable(TAG, Log.ERROR)) {
1240e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            Log.e(TAG, "default disk cache dir is null");
1250e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        }
1260e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return null;
1270e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
128d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
12956e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd    /**
13056e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     * Get the singleton.
13156e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     *
13256e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     * @return the singleton
13356e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd     */
13429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static Glide get(Context context) {
13529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        if (GLIDE == null) {
13629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            GLIDE = new GlideBuilder(context).createGlide();
13729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        }
13829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
139d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd        return GLIDE;
140d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
141d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
1429f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    /**
1439f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * Returns false if the {@link Glide} singleton has not yet been created and can therefore be setup using
1449f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * {@link #setup(GlideBuilder)}.
1459f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1469f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @see #setup(GlideBuilder)
1479f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     */
14829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static boolean isSetup() {
14929f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        return GLIDE != null;
15029f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    }
15129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
1529f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    /**
1539f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * Creates the {@link Glide} singleton using the given builder. Can be used to set options like cache sizes and
1549f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * locations.
1559f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1569f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @see #isSetup()
1579f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     *
1589f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @param builder The builder.
1599f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     * @throws IllegalArgumentException if the Glide singleton has already been created.
1609f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd     */
16129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public static void setup(GlideBuilder builder) {
1620e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        if (isSetup()) {
16329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            throw new IllegalArgumentException("Glide is already setup, check with isSetup() first");
16429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        }
16529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
16629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        GLIDE = builder.createGlide();
16729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    }
16829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
169b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    static void tearDown() {
170b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        GLIDE = null;
171b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    }
172b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd
17377e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    Glide(Engine engine, RequestQueue requestQueue, MemoryCache memoryCache, BitmapPool bitmapPool,
174be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd            Context context) {
175b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        this.engine = engine;
17629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        this.requestQueue = requestQueue;
17727eb05702fd4531d6974640c62df1d569629edb6Sam Judd        this.bitmapPool = bitmapPool;
1780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        this.memoryCache = memoryCache;
179c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
18095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        dataLoadProviderFactory = new DataLoadProviderFactory();
181be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
182cbba04826bfaf4f8055f922bc41937572983c17fSam Judd        dataLoadProviderFactory.register(InputStream.class, Bitmap.class, new StreamBitmapDataLoadProvider(bitmapPool));
18395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        dataLoadProviderFactory.register(ParcelFileDescriptor.class, Bitmap.class,
18495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                new FileDescriptorBitmapDataLoadProvider(bitmapPool));
185be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
186be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        ImageVideoDataLoadProvider imageVideoDataLoadProvider = new ImageVideoDataLoadProvider(bitmapPool);
187be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        dataLoadProviderFactory.register(ImageVideoWrapper.class, Bitmap.class, imageVideoDataLoadProvider);
188be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
189be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd        GifDataLoadProvider gifDataLoadProvider = new GifDataLoadProvider(context, bitmapPool);
190cbba04826bfaf4f8055f922bc41937572983c17fSam Judd        dataLoadProviderFactory.register(InputStream.class, GifData.class, gifDataLoadProvider);
191cbba04826bfaf4f8055f922bc41937572983c17fSam Judd
192fc3f03260933d96fae33a43846860f226dd661feSam Judd        dataLoadProviderFactory.register(ImageVideoWrapper.class, GifBitmapWrapper.class,
193be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd                new ImageVideoGifDataLoadProvider(imageVideoDataLoadProvider, gifDataLoadProvider));
194c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
195896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());
196896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(File.class, InputStream.class, new StreamFileLoader.Factory());
197896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Integer.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
198896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Integer.class, InputStream.class, new StreamResourceLoader.Factory());
199896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(String.class, ParcelFileDescriptor.class, new FileDescriptorStringLoader.Factory());
200896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(String.class, InputStream.class, new StreamStringLoader.Factory());
201896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Uri.class, ParcelFileDescriptor.class, new FileDescriptorUriLoader.Factory());
202896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        register(Uri.class, InputStream.class, new StreamUriLoader.Factory());
203c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd        register(URL.class, InputStream.class, new StreamUrlLoader.Factory());
204c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd        register(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(requestQueue));
20577e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd
20695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        transcoderFactory.register(Bitmap.class, BitmapDrawable.class,
207be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd                new BitmapDrawableTranscoder(context.getResources(), bitmapPool));
208fc3f03260933d96fae33a43846860f226dd661feSam Judd        transcoderFactory.register(GifBitmapWrapper.class, Drawable.class,
20944b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd                new GifBitmapWrapperDrawableTranscoder(new BitmapDrawableTranscoder(context.getResources(), bitmapPool),
21044b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd                        new GifDataDrawableTranscoder()));
211cbba04826bfaf4f8055f922bc41937572983c17fSam Judd        transcoderFactory.register(GifData.class, GifDrawable.class, new GifDataDrawableTranscoder());
21270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
21370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        bitmapCenterCrop = new CenterCrop(bitmapPool);
21470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        drawableCenterCrop = new GifBitmapWrapperTransformation(bitmapCenterCrop);
21570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
21670db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        bitmapFitCenter = new FitCenter(bitmapPool);
21770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        drawableFitCenter = new GifBitmapWrapperTransformation(bitmapFitCenter);
218e13dcedf144c02927c122fae32179f460b21fef5Sam Judd    }
219e13dcedf144c02927c122fae32179f460b21fef5Sam Judd
220be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd    public BitmapPool getBitmapPool() {
221d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return bitmapPool;
222d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
223d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
224d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <Z, R> ResourceTranscoder<Z, R> buildTranscoder(Class<Z> decodedClass, Class<R> transcodedClass) {
225d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return transcoderFactory.get(decodedClass, transcodedClass);
226d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
227d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
228d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <T, Z> DataLoadProvider<T, Z> buildDataProvider(Class<T> dataClass, Class<Z> decodedClass) {
229d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return dataLoadProviderFactory.get(dataClass, decodedClass);
230d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
231d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
232d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    <R> Target<R> buildImageViewTarget(ImageView imageView, Class<R> transcodedClass) {
233d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return imageViewTargetFactory.buildTarget(imageView, transcodedClass);
234d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
235d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
236d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    Engine getEngine() {
237d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return engine;
238d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
239d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
24070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    CenterCrop getBitmapCenterCrop() {
24170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        return bitmapCenterCrop;
24270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    }
24370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
24470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    FitCenter getBitmapFitCenter() {
24570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        return bitmapFitCenter;
24670db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    }
24770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
24870db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    GifBitmapWrapperTransformation getDrawableCenterCrop() {
24970db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        return drawableCenterCrop;
25070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    }
25170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
25270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    GifBitmapWrapperTransformation getDrawableFitCenter() {
25370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd        return drawableFitCenter;
25470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd    }
25570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
2560e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    private GenericLoaderFactory getLoaderFactory() {
2570e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        return loaderFactory;
2580e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2590e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
260d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    /**
26129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd     * Returns the {@link RequestQueue} Glide is using to fetch images over http/https.
262d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd     */
26329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd    public RequestQueue getRequestQueue() {
26429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd        return requestQueue;
265d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
266d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
267d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    /**
2680e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Clears as much memory as possible.
2690e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
2700e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @see ComponentCallbacks2#onLowMemory()
2710e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
2720e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public void clearMemory() {
2730e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        bitmapPool.clearMemory();
2740e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        memoryCache.clearMemory();
2750e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2760e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2770e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
2780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * Clears some memory with the exact amount depending on the given level.
2790e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     *
2800e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     * @see ComponentCallbacks2#onTrimMemory(int)
2810e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd     */
2820e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    public void trimMemory(int level) {
2830e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        bitmapPool.trimMemory(level);
2840e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd        memoryCache.trimMemory(level);
2850e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    }
2860e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2870e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd    /**
2887050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * Adjusts Glide's current and maximum memory usage based on the given {@link MemoryCategory}.
2897050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *
2907050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * <p>
2917050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     The default {@link MemoryCategory} is {@link MemoryCategory#NORMAL}. {@link MemoryCategory#HIGH} increases
2927050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     Glide's maximum memory usage by up to 50% and {@link MemoryCategory#LOW} decreases Glide's maximum memory
2937050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     usage by 50%. This method should be used to temporarily increase or decrease memory useage for a single
2947050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     Activity or part of the app. Use {@link GlideBuilder#setMemoryCache(MemoryCache)} to set a permanent
2957050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     *     memory size if you want to change the default.
2967050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     * </p>
2977050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd     */
2987050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    public void setMemoryCategory(MemoryCategory memoryCategory) {
2997050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd        memoryCache.setSizeMultiplier(memoryCategory.getMultiplier());
3007050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd        bitmapPool.setSizeMultiplier(memoryCategory.getMultiplier());
3017050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    }
3027050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd
3037050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd    /**
304b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Cancel any pending loads Glide may have for the target and free any resources (such as {@link Bitmap}s) that may
305b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * have been loaded for the target so they may be reused.
306b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
307b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param target The Target to cancel loads for.
308b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
309b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public static void clear(Target target) {
310b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Request request = target.getRequest();
311b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (request!= null) {
312b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            request.clear();
313b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
314b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
315b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
316b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
317b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Cancel any pending loads Glide may have for the view and free any resources that may have been loaded for the
318b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * view.
319b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
320b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
321b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note that this will only work if {@link View#setTag(Object)} is not called on this view outside of Glide.
322b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
323b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
324b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see #clear(Target).
325b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
326b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param view The view to cancel loads and free resources for.
327b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @throws IllegalArgumentException if an object other than Glide's metadata is set as the view's tag.
328b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
329b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public static void clear(View view) {
330b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Target viewTarget = new ClearTarget(view);
331b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        clear(viewTarget);
332b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
333b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
334b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
335da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd     * Use the given factory to build a {@link ModelLoader} for models of the given class. Generally the best use of
336da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd     * this method is to replace one of the default factories or add an implementation for other similar low level
337e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * models. Typically the {@link RequestManager#using(StreamModelLoader)} or
338e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link RequestManager#using(FileDescriptorModelLoader)} syntax is preferred because it directly links the model
339031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * with the ModelLoader being used to load it. Any factory replaced by the given factory will have its
340031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * {@link ModelLoaderFactory#teardown()}} method called.
341633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam Judd     *
342058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd     * <p>
3439c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *     Note - If a factory already exists for the given class, it will be replaced. If that factory is not being
3440ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd     *     used for any other model class, {@link ModelLoaderFactory#teardown()}
3459c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *     will be called.
3469c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     * </p>
3479c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
348c95a13d712f57271047e467d367e1145517b0c2aSam Judd     * <p>
349c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *     Note - The factory must not be an anonymous inner class of an Activity or another object that cannot be
350c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *     retained statically.
351c95a13d712f57271047e467d367e1145517b0c2aSam Judd     * </p>
352c95a13d712f57271047e467d367e1145517b0c2aSam Judd     *
353e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see RequestManager#using(FileDescriptorModelLoader)
354e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see RequestManager#using(StreamModelLoader)
355896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     *
356896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param modelClass The model class.
357896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param resourceClass The resource class the model loader will translate the model type into.
358896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param factory The factory to use.
359896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param <T> The type of the model.
360896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd     * @param <Y> the type of the resource.
3619c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
362896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd    public <T, Y> void register(Class<T> modelClass, Class<Y> resourceClass, ModelLoaderFactory<T, Y> factory) {
363896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd        ModelLoaderFactory<T, Y> removed = loaderFactory.register(modelClass, resourceClass, factory);
3649c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd        if (removed != null) {
3659c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd            removed.teardown();
3669c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd        }
3679c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    }
3689c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
3699c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    /**
370031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * Removes any {@link ModelLoaderFactory} registered for the given model and resource classes if one exists. If a
371031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * {@link ModelLoaderFactory} is removed, its {@link ModelLoaderFactory#teardown()}} method will be called.
372031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     *
373031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param modelClass The model class.
374031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param resourceClass The resource class.
375031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param <T> The type of the model.
376031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     * @param <Y> The type of the resource.
377031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd     */
378031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    public <T, Y> void unregister(Class<T> modelClass, Class<Y> resourceClass) {
379031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        ModelLoaderFactory<T, Y> removed = loaderFactory.unregister(modelClass, resourceClass);
380031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        if (removed != null) {
381031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd            removed.teardown();
382031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd        }
383031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    }
384031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
385031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd    /**
38615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * Build a {@link ModelLoader} for the given model class using registered {@link ModelLoaderFactory}s.
3879c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
38815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildModelLoader(Object, Class, Context)
38915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildStreamModelLoader(Class, Context)
39015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see  #buildFileDescriptorModelLoader(Class, Context)
39115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
39215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param modelClass The class to get a {@link ModelLoader} for.
39315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param resourceClass The resource class to get a {@link ModelLoader} for.
39415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param context Any context.
39515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <T> The type of the model.
39615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <Y> The type of the resource.
39715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @return A new {@link ModelLoader} for the given model class.
3989c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
3990ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd    public static <T, Y> ModelLoader<T, Y> buildModelLoader(Class<T> modelClass, Class<Y> resourceClass,
4000ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd            Context context) {
40115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return Glide.get(context).getLoaderFactory().buildModelLoader(modelClass, resourceClass, context);
40215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
40315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
40415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
40515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A convenience method to build a {@link ModelLoader} for a given model object using registered
40615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * {@link ModelLoaderFactory}s.
40715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
40815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Class, Class, Context)
40915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
41015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param model A non null model object whose class we will get a {@link ModelLoader} for.
41115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param resourceClass The resource class to get a {@link ModelLoader} for.
41215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param context Any context.
41315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <T> The type of the model.
41415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @param <Y> The type of the resource.
415e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd     * @return A new {@link ModelLoader} for the given model and resource classes, or null if model is null.
41615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
41715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    @SuppressWarnings("unchecked")
41815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T, Y> ModelLoader<T, Y> buildModelLoader(T model, Class<Y> resourceClass, Context context) {
41915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        if (model == null) {
420e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            if (Log.isLoggable(TAG, Log.DEBUG)) {
421e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd                Log.d(TAG, "Unable to load null model, setting placeholder only");
422e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            }
423e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            return null;
42415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        }
42515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader((Class<T>) model.getClass(), resourceClass, context);
4269c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd    }
4279c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
428ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    /**
42915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model that produces {@link InputStream}s using a registered
43015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * factory.
431ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     *
432ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * @see #buildModelLoader(Class, Class, android.content.Context)
433ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     */
434ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    public static <T> ModelLoader<T, InputStream> buildStreamModelLoader(Class<T> modelClass, Context context) {
435ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd        return buildModelLoader(modelClass, InputStream.class, context);
436ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    }
437ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd
438ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    /**
43915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model that produces {@link InputStream}s using a registered
44015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * factory.
44115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
44215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Object, Class, Context)
44315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
44415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T> ModelLoader<T, InputStream> buildStreamModelLoader(T model, Context context) {
44515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader(model, InputStream.class, context);
44615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
44715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
44815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
44915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model class that produces
450ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * {@link ParcelFileDescriptor}s using a registered factory.
451ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     *
452ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     * @see #buildModelLoader(Class, Class, android.content.Context)
453ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd     */
454ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    public static <T> ModelLoader<T, ParcelFileDescriptor> buildFileDescriptorModelLoader(Class<T> modelClass,
455ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd            Context context) {
456ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd        return buildModelLoader(modelClass, ParcelFileDescriptor.class, context);
457ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd    }
458ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd
4598c7ae0d1551752a2ff6260dd807580a90020451eSam Judd    /**
46015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * A method to build a {@link ModelLoader} for the given model class that produces
46115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * {@link ParcelFileDescriptor}s using a registered factory.
46215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     *
46315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     * @see #buildModelLoader(Object, Class, android.content.Context)
46415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd     */
46515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    public static <T> ModelLoader<T, ParcelFileDescriptor> buildFileDescriptorModelLoader(T model, Context context) {
46615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd        return buildModelLoader(model, ParcelFileDescriptor.class, context);
46715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    }
46815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
46915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd    /**
4708c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * Begin a load with Glide by passing in a context.
4719c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     *
4728c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * @param context Any context, will not be retained.
4738c7ae0d1551752a2ff6260dd807580a90020451eSam Judd     * @return A model request to pass in the object representing the image to be loaded.
4749c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd     */
475e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public static RequestManager with(Context context) {
476e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return RequestManagerRetriever.get(context);
4778a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd    }
4788a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
479e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public static RequestManager with(Activity activity) {
480e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return RequestManagerRetriever.get(activity);
4818a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd    }
4828a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
483e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public static RequestManager with(FragmentActivity activity) {
484e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return RequestManagerRetriever.get(activity);
4858a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd    }
4868a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
487fcca8d79a3a04e71924d06799de2af46c923a84eSam Judd    @TargetApi(11)
488e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public static RequestManager with(android.app.Fragment fragment) {
489e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return RequestManagerRetriever.get(fragment);
4908a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd    }
4918a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
492e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public static RequestManager with(Fragment fragment) {
493e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return RequestManagerRetriever.get(fragment);
494d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd    }
495d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
496ba414a3eba45ab6566a94c48babace5c1d6d721fSam Judd    private static class ClearTarget extends ViewTarget<View, Object> {
497b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        public ClearTarget(View view) {
498b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd            super(view);
499b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        }
500b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd
501b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        @Override
502531667420f0cb59e01e0ae5928392469006148ddSam Judd        public void onResourceReady(Object resource, GlideAnimation<Object> glideAnimation) { }
503b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd
504b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        @Override
505b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd        public void setPlaceholder(Drawable placeholder) { }
506b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd    }
507d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd}
508