GenericRequestBuilder.java revision 7260e7b8e840ae9e03cc20df73accfc4121cb190
1b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddpackage com.bumptech.glide;
2b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
3b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.content.Context;
4a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.graphics.drawable.Drawable;
5785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport android.view.View;
6a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.view.animation.Animation;
7b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.widget.ImageView;
89bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.MultiTransformation;
99fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.ResourceDecoder;
10d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport com.bumptech.glide.load.ResourceEncoder;
1180b7691daac313059e4311214249fa6da53451edSam Juddimport com.bumptech.glide.load.SkipCache;
129bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.Transformation;
137260e7b8e840ae9e03cc20df73accfc4121cb190Sam Juddimport com.bumptech.glide.load.model.ModelLoader;
14bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.resource.bitmap.BitmapDecoder;
15bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
169bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.provider.ChildLoadProvider;
179fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.provider.LoadProvider;
18785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.Request;
199fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.RequestCoordinator;
209fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.ThumbnailRequestCoordinator;
2144e0516ee31912216c9e668c255f2d5baf86ac6dSam Juddimport com.bumptech.glide.request.bitmap.GenericRequest;
229bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.request.bitmap.RequestListener;
23785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.target.BitmapImageViewTarget;
249fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.Target;
25b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
26d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport java.io.InputStream;
27b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.ArrayList;
28b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.List;
29b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
30b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd/**
31b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * A generic class that can handle loading a bitmap either from an image or as a thumbnail from a video given
32b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * models loaders to translate a model into generic resources for either an image or a video and decoders that can
33b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * decode those resources into bitmaps.
34b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd *
35b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param  The type of model representing the image or video.
36dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd * @param  The data type that the image {@link ModelLoader} will provide that can be decoded by the image
3744e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd *      {@link BitmapDecoder}.
3844e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd * @param  The type of the resource that will be loaded.
39b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */
40dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddpublic class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> {
41d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    private final Context context;
4244e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd    private final List<Transformation<ResourceType>> transformations = new ArrayList<Transformation<ResourceType>>();
43b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private final ModelType model;
44dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    private final ChildLoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider;
4577e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    private final Class<TranscodeType> transcodeClass;
467260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd    private final Glide glide;
47b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int animationId;
48a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Animation animation;
49b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int placeholderId;
50b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int errorId;
51b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private RequestListener<ModelType> requestListener;
52b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private Float thumbSizeMultiplier;
53dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    private GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>
54ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd            thumbnailRequestBuilder;
55b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private Float sizeMultiplier = 1f;
56a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Drawable placeholderDrawable;
57a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Drawable errorPlaceholder;
5808b61677e60069ba681b56cf6312fc0b92020962Sam Judd    private Priority priority = null;
5980b7691daac313059e4311214249fa6da53451edSam Judd    private boolean isCacheable = true;
6080b7691daac313059e4311214249fa6da53451edSam Judd    private ResourceEncoder<ResourceType> preSkipEncoder;
61b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
627260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd    GenericRequestBuilder(Context context, ModelType model,
63dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider,
64d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            Class<TranscodeType> transcodeClass, Glide glide) {
6577e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd        this.transcodeClass = transcodeClass;
66d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        this.glide = glide;
67dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        this.loadProvider = loadProvider != null ?
68dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd                new ChildLoadProvider<ModelType, DataType, ResourceType, TranscodeType>(loadProvider) : null;
6980b7691daac313059e4311214249fa6da53451edSam Judd        preSkipEncoder = loadProvider != null ? loadProvider.getEncoder() : null;
70c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
7127eb05702fd4531d6974640c62df1d569629edb6Sam Judd        if (context == null) {
72b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new NullPointerException("Context can't be null");
73b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
74dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        if (model != null && loadProvider == null) {
75dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            throw new NullPointerException("LoadProvider must not be null");
76b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        }
77c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        this.context = context;
78b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.model = model;
79b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
80b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
81b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
82b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads and displays the image retrieved by the given thumbnail request if it finishes before this request.
83b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Best used for loading thumbnail images that are smaller and will be loaded more quickly than the fullsize
84b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * image. There are no guarantees about the order in which the requests will actually finish. However, if the
85b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * thumb request completes after the full request, the thumb image will never replace the full image.
86b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
87b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see #thumbnail(float)
88b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
89b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
90b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note - Any options on the main request will not be passed on to the thumbnail request. For example, if
91b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     you want an animation to occur when either the full image loads or the thumbnail loads, you need to call
92b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #animate(int)} on both the thumb and the full request. For a simpler thumbnail option, see
93b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #thumbnail(float)}.
94b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
95b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
96b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
97b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Only the thumbnail call on the main request will be obeyed.
98b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
99b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
100b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param thumbnailRequest The request to use to load the thumbnail.
101b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
102b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
103dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> thumbnail(
104dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>
10577e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd                    thumbnailRequest) {
106b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.thumbnailRequestBuilder = thumbnailRequest;
107b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
108b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
109b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
110b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
111b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
112b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads an image in an identical manner to this request except with the dimensions of the target multiplied
113b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * by the given size multiplier. If the thumbnail load completes before the fullsize load, the thumbnail will
114b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * be shown. If the thumbnail load completes afer the fullsize load, the thumbnail will not be shown.
115b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
116b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
117b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note - The thumbnail image will be smaller than the size requested so the target (or {@link ImageView})
118b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     must be able to scale the thumbnail appropriately. See {@link ImageView.ScaleType}.
119b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
120b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
121b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
122b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Almost all options will be copied from the original load, including the {@link ModelLoader},
123b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link BitmapDecoder}, and {@link Transformation}s. However, {@link #placeholder(int)} and
124b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #error(int)}, and {@link #listener(RequestListener)} will only be used on the fullsize load and
125b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     will not be copied for the thumbnail load.
126b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
127b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
128b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
129b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Only the thumbnail call on the main request will be obeyed.
130b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
131b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
132b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the thumbnail.
133b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
134b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
135dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> thumbnail(
13677e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd            float sizeMultiplier) {
137b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (sizeMultiplier < 0f || sizeMultiplier > 1f) {
138b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");
139b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
140b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.thumbSizeMultiplier = sizeMultiplier;
141b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
142b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
143b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
144b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
145b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
146b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Applies a multiplier to the {@link Target}'s size before loading the image. Useful for loading thumbnails
147b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * or trying to avoid loading huge bitmaps on devices with overly dense screens.
148b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
149b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the image.
150b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
151b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
152dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> sizeMultiplier(
153b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            float sizeMultiplier) {
154b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (sizeMultiplier < 0f || sizeMultiplier > 1f) {
155b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");
156b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
157b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.sizeMultiplier = sizeMultiplier;
158b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
159b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
160b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
161b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
162b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
163dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd     * Loads the resource from the given data type using the given {@link BitmapDecoder}.
164b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
165b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
166b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Will be ignored if the data represented by the given model is not a video.
167b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
168b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
169b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param decoder The {@link BitmapDecoder} to use to decode the video resource.
17076fbad3dbce72240e9f5b82c826e3229c1176fb6Sam Judd     * @return This request builder.
171b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
172dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> decoder(
173dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            ResourceDecoder<DataType, ResourceType> decoder) {
1747260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to
1757260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // ignore the decoder.
1767260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        if (loadProvider != null) {
1777260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            loadProvider.setSourceDecoder(decoder);
1787260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        }
179b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
180b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
181b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
182b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
183dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> cacheDecoder(
1847260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            ResourceDecoder <InputStream, ResourceType> cacheDecoder) {
1857260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to
1867260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // ignore the decoder.
1877260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        if (loadProvider != null) {
1887260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            loadProvider.setCacheDecoder(cacheDecoder);
1897260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        }
190d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
191d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return this;
192d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
193d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
194dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> encoder(
195d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            ResourceEncoder<ResourceType> encoder) {
1967260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to
1977260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        // ignore the encoder.
1987260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        if (loadProvider != null) {
1997260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            loadProvider.setEncoder(encoder);
2007260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            preSkipEncoder = encoder;
2017260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd        }
202d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
203d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return this;
204d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
205d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
206b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
20708b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * Sets the priority for this load.
20808b61677e60069ba681b56cf6312fc0b92020962Sam Judd     *
20908b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * @param priority A priority.
21008b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * @return This request builder.
21108b61677e60069ba681b56cf6312fc0b92020962Sam Judd     */
212dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> priority(
213d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            Priority priority) {
21408b61677e60069ba681b56cf6312fc0b92020962Sam Judd        this.priority = priority;
21508b61677e60069ba681b56cf6312fc0b92020962Sam Judd
21608b61677e60069ba681b56cf6312fc0b92020962Sam Judd        return this;
21708b61677e60069ba681b56cf6312fc0b92020962Sam Judd    }
21808b61677e60069ba681b56cf6312fc0b92020962Sam Judd
219b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
220b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Transform images with the given {@link Transformation}. Appends this transformation onto any existing
221b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * transformations
222b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
223b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param transformation the transformation to apply.
224b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
225b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
226dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> transform(
22744e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd            Transformation<ResourceType> transformation) {
228b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        transformations.add(transformation);
229b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
230b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
231b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
232b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
233dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> transcoder(
234d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            ResourceTranscoder<ResourceType, TranscodeType> transcoder) {
235dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd        if (loadProvider != null) {
236dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            loadProvider.setTranscoder(transcoder);
237d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        }
238d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
239d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return this;
240d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd    }
241d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
242b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
243b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image
244b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * was loaded asynchronously (ie was not in the memory cache)
245b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
246b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param animationId The resource id of the animation to run
247b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
248b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
249dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate(
250d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            int animationId) {
251b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.animationId = animationId;
252b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
253b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
254b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
255b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
256b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
257a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image
258a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * was loaded asynchronously (ie was not in the memory cache)
259a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
260a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param animation The animation to run
261a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder
262a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
263dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate(
264d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            Animation animation) {
265a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.animation = animation;
266a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
267a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
268a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
269a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
270a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
271b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a resource to display while an image is loading
272b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
273b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param resourceId The id of the resource to use as a placeholder
274b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
275b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
276dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> placeholder(
277d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            int resourceId) {
278b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.placeholderId = resourceId;
279b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
280b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
281b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
282b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
283b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
284a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets a drawable to display while an image is loading.
285a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
286a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param drawable The drawable to display as a placeholder.
287a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder.
288a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
289dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> placeholder(
290d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            Drawable drawable) {
291a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.placeholderDrawable = drawable;
292a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
293a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
294a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
295a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
296a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
297b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a resource to display if a load fails
298b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
299b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param resourceId The id of the resource to use as a placeholder
300b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This request
301b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
302dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> error(
303d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            int resourceId) {
304b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.errorId = resourceId;
305b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
306b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
307b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
308b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
309b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
310a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets a {@link Drawable} to display if a load fails.
311a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
312a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param drawable The drawable to display.
313a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder.
314a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
315dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> error(
316d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            Drawable drawable) {
317a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.errorPlaceholder = drawable;
318a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
319a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
320a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
321a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
322a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
323b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a RequestBuilder listener to monitor the image load. It's best to create a single instance of an
324b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * exception handler per type of request (usually activity/fragment) rather than pass one in per request to
325b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * avoid some redundant object allocation.
326b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
32780b7691daac313059e4311214249fa6da53451edSam Judd     * @param requestListener The request listener to use.
32880b7691daac313059e4311214249fa6da53451edSam Judd     * @return This RequestBuilder.
329b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
330dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> listener(
331b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            RequestListener<ModelType> requestListener) {
332b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.requestListener = requestListener;
333b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
334b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
335b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
336b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
337b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
33880b7691daac313059e4311214249fa6da53451edSam Judd     * Allows the loaded resource to skip the memory cache.
33980b7691daac313059e4311214249fa6da53451edSam Judd     *
34080b7691daac313059e4311214249fa6da53451edSam Judd     * <p>
34180b7691daac313059e4311214249fa6da53451edSam Judd     *     Note - this is not a guarantee. If a request is already pending for this resource and that request is not
34280b7691daac313059e4311214249fa6da53451edSam Judd     *     also skipping the memory cache, the resource will be cached in memory.
34380b7691daac313059e4311214249fa6da53451edSam Judd     * </p>
34480b7691daac313059e4311214249fa6da53451edSam Judd     *
34580b7691daac313059e4311214249fa6da53451edSam Judd     * @param skip True to allow the resource to skip the memory cache.
34680b7691daac313059e4311214249fa6da53451edSam Judd     * @return This RequestBuilder.
34780b7691daac313059e4311214249fa6da53451edSam Judd     */
34880b7691daac313059e4311214249fa6da53451edSam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipMemoryCache(boolean skip) {
34980b7691daac313059e4311214249fa6da53451edSam Judd        this.isCacheable = !skip;
35080b7691daac313059e4311214249fa6da53451edSam Judd
35180b7691daac313059e4311214249fa6da53451edSam Judd        return this;
35280b7691daac313059e4311214249fa6da53451edSam Judd    }
35380b7691daac313059e4311214249fa6da53451edSam Judd
35480b7691daac313059e4311214249fa6da53451edSam Judd    /**
35580b7691daac313059e4311214249fa6da53451edSam Judd     * Allows the loaded resource to skip the disk cache.
35680b7691daac313059e4311214249fa6da53451edSam Judd     *
35780b7691daac313059e4311214249fa6da53451edSam Judd     * <p>
35880b7691daac313059e4311214249fa6da53451edSam Judd     *     Note - this is not a guarantee. If a request is already pending for this resource and that request is not
35980b7691daac313059e4311214249fa6da53451edSam Judd     *     also skipping the disk cache, the resource will be cached on disk.
36080b7691daac313059e4311214249fa6da53451edSam Judd     * </p>
36180b7691daac313059e4311214249fa6da53451edSam Judd     *
36280b7691daac313059e4311214249fa6da53451edSam Judd     * @param skip True to allow the resource to skip the disk cache.
36380b7691daac313059e4311214249fa6da53451edSam Judd     * @return This RequestBuilder.
36480b7691daac313059e4311214249fa6da53451edSam Judd     */
36580b7691daac313059e4311214249fa6da53451edSam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipDiskCache(boolean skip) {
36680b7691daac313059e4311214249fa6da53451edSam Judd        if (skip) {
3677260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            if (loadProvider != null) {
3687260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd                preSkipEncoder = loadProvider.getEncoder();
3697260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd            }
37080b7691daac313059e4311214249fa6da53451edSam Judd            final SkipCache<ResourceType> skipCache = SkipCache.get();
37180b7691daac313059e4311214249fa6da53451edSam Judd            return encoder(skipCache);
37280b7691daac313059e4311214249fa6da53451edSam Judd        } else {
37380b7691daac313059e4311214249fa6da53451edSam Judd            return encoder(preSkipEncoder);
37480b7691daac313059e4311214249fa6da53451edSam Judd        }
37580b7691daac313059e4311214249fa6da53451edSam Judd    }
37680b7691daac313059e4311214249fa6da53451edSam Judd
37780b7691daac313059e4311214249fa6da53451edSam Judd    /**
37880b7691daac313059e4311214249fa6da53451edSam Judd     * Allows the resource to skip both the memory and the disk cache.
37980b7691daac313059e4311214249fa6da53451edSam Judd     *
38080b7691daac313059e4311214249fa6da53451edSam Judd     * @see #skipDiskCache(boolean)
38180b7691daac313059e4311214249fa6da53451edSam Judd     * @see #skipMemoryCache(boolean)
38280b7691daac313059e4311214249fa6da53451edSam Judd     *
38380b7691daac313059e4311214249fa6da53451edSam Judd     * @param skip True to allow the resource to skip both the memory and the disk cache.
38480b7691daac313059e4311214249fa6da53451edSam Judd     * @return This RequestBuilder.
38580b7691daac313059e4311214249fa6da53451edSam Judd     */
38680b7691daac313059e4311214249fa6da53451edSam Judd    public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipCache(boolean skip) {
38780b7691daac313059e4311214249fa6da53451edSam Judd        skipMemoryCache(skip);
38880b7691daac313059e4311214249fa6da53451edSam Judd        skipDiskCache(skip);
38980b7691daac313059e4311214249fa6da53451edSam Judd
39080b7691daac313059e4311214249fa6da53451edSam Judd        return this;
39180b7691daac313059e4311214249fa6da53451edSam Judd    }
39280b7691daac313059e4311214249fa6da53451edSam Judd
39380b7691daac313059e4311214249fa6da53451edSam Judd    /**
394b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Set the target the image will be loaded into.
395b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
396b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param target The target to load te image for
397b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return The given target.
398b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
39977e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    public <Y extends Target<TranscodeType>> Y into(Y target) {
400785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd        Request previous = target.getRequest();
401b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (previous != null) {
402b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            previous.clear();
403b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
404b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
405785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd        Request request = buildRequest(target);
406b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        target.setRequest(request);
407e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd        if (request != null) {
408e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            request.run();
409e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd        }
410b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return target;
411b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
412b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
413785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd    /**
414785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     * Sets the {@link ImageView} the image will be loaded into, cancels any existing loads into the view, and frees
415785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     * any resources Glide has loaded into the view so they may be reused.
416785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     *
417785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     * @see Glide#clear(View)
418785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     *
419785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     * @param view The view to cancel previous loads for and load the new image into.
420785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     * @return The {@link BitmapImageViewTarget} used to wrap the given {@link ImageView}.
421785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd     */
42277e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    public Target<TranscodeType> into(ImageView view) {
423d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd        return into(glide.buildImageViewTarget(view, transcodeClass));
424785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd    }
425785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd
42677e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    private Request buildRequest(Target<TranscodeType> target) {
427785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd        final Request result;
428f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd
42908b61677e60069ba681b56cf6312fc0b92020962Sam Judd        if (priority == null) {
4309bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd            priority = Priority.NORMAL;
43108b61677e60069ba681b56cf6312fc0b92020962Sam Judd        }
432e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd
433b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (thumbnailRequestBuilder != null) {
434b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
435785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd            Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator);
436b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
437bcd0ac8b8367f88ca502e0540cfa871ee4eb07b2Sam Judd            if (thumbnailRequestBuilder.animationId <= 0) {
438b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                thumbnailRequestBuilder.animationId = animationId;
439b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            }
440b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
441a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd            if (thumbnailRequestBuilder.animation == null) {
442a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd                thumbnailRequestBuilder.animation = animation;
443a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd            }
444a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
445b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            if (thumbnailRequestBuilder.requestListener == null && requestListener != null) {
446b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                thumbnailRequestBuilder.requestListener = requestListener;
447b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            }
44808b61677e60069ba681b56cf6312fc0b92020962Sam Judd
44908b61677e60069ba681b56cf6312fc0b92020962Sam Judd            if (thumbnailRequestBuilder.priority == null) {
45008b61677e60069ba681b56cf6312fc0b92020962Sam Judd                thumbnailRequestBuilder.priority = getThumbnailPriority();
45108b61677e60069ba681b56cf6312fc0b92020962Sam Judd            }
45208b61677e60069ba681b56cf6312fc0b92020962Sam Judd
453785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd            Request thumbnailRequest = thumbnailRequestBuilder.buildRequest(target,
45427eb05702fd4531d6974640c62df1d569629edb6Sam Judd                    thumbnailRequestBuilder.sizeMultiplier, thumbnailRequestBuilder.priority, requestCoordinator);
455b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
456b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            requestCoordinator.setRequests(fullRequest, thumbnailRequest);
457b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            result = requestCoordinator;
458b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        } else if (thumbSizeMultiplier != null) {
459b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
460785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd            Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator);
461785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd            Request thumbnailRequest = buildRequest(target, thumbSizeMultiplier, getThumbnailPriority(),
46227eb05702fd4531d6974640c62df1d569629edb6Sam Judd                    requestCoordinator);
463b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            requestCoordinator.setRequests(fullRequest, thumbnailRequest);
464b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            result = requestCoordinator;
465b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        } else {
46644e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd            result = buildRequest(target, sizeMultiplier, priority, null);
467b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
468b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return result;
469b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
470b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
47108b61677e60069ba681b56cf6312fc0b92020962Sam Judd    private Priority getThumbnailPriority() {
47208b61677e60069ba681b56cf6312fc0b92020962Sam Judd        final Priority result;
47308b61677e60069ba681b56cf6312fc0b92020962Sam Judd        if (priority == Priority.LOW) {
47408b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.NORMAL;
47508b61677e60069ba681b56cf6312fc0b92020962Sam Judd        } else if (priority == Priority.NORMAL) {
47608b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.HIGH;
47708b61677e60069ba681b56cf6312fc0b92020962Sam Judd        } else {
47808b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.IMMEDIATE;
47908b61677e60069ba681b56cf6312fc0b92020962Sam Judd        }
48008b61677e60069ba681b56cf6312fc0b92020962Sam Judd        return result;
48108b61677e60069ba681b56cf6312fc0b92020962Sam Judd    }
48208b61677e60069ba681b56cf6312fc0b92020962Sam Judd
48377e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    private Request buildRequest(Target<TranscodeType> target, float sizeMultiplier, Priority priority,
48427eb05702fd4531d6974640c62df1d569629edb6Sam Judd            RequestCoordinator requestCoordinator) {
485f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd        if (model == null) {
486dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, null);
48727eb05702fd4531d6974640c62df1d569629edb6Sam Judd        } else {
488dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd            return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, requestCoordinator);
48927eb05702fd4531d6974640c62df1d569629edb6Sam Judd        }
49027eb05702fd4531d6974640c62df1d569629edb6Sam Judd    }
49127eb05702fd4531d6974640c62df1d569629edb6Sam Judd
49277e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd    private <Z> Request buildRequestForDataType(Target<TranscodeType> target,
493ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd            LoadProvider<ModelType, Z, ResourceType, TranscodeType> loadProvider, float sizeMultiplier,
494ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd            Priority priority, RequestCoordinator requestCoordinator) {
495ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd        return new GenericRequest<ModelType, Z, ResourceType, TranscodeType>(loadProvider, model, context, priority,
496ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd                target, sizeMultiplier, placeholderDrawable, placeholderId, errorPlaceholder, errorId, requestListener,
497d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd                animationId, animation, requestCoordinator, glide.getEngine(), getFinalTransformation(),
49880b7691daac313059e4311214249fa6da53451edSam Judd                transcodeClass, isCacheable);
499e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd    }
500e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd
50131b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    @SuppressWarnings("unchecked")
50244e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd    private Transformation<ResourceType> getFinalTransformation() {
503b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        switch (transformations.size()) {
504b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            case 0:
505b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                return Transformation.NONE;
506b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            case 1:
507b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                return transformations.get(0);
508b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            default:
50944e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd                return new MultiTransformation<ResourceType>(transformations);
510b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
511b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
512b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd}
513