GenericRequestBuilder.java revision 9bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38
1b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddpackage com.bumptech.glide;
2b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
3b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.content.Context;
4b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.graphics.Bitmap;
5a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.graphics.drawable.Drawable;
6b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.view.View;
7a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.view.animation.Animation;
8b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.widget.ImageView;
99bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.MultiTransformation;
109fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.ResourceDecoder;
119bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.Transformation;
129fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.data.bitmap.BitmapDecoder;
139bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.data.bitmap.CenterCrop;
149fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.data.bitmap.Downsampler;
159bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.data.bitmap.FitCenter;
169fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.data.bitmap.VideoBitmapDecoder;
179bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.model.ModelLoader;
189bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.provider.ChildLoadProvider;
199fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.provider.LoadProvider;
209fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.MultiTypeRequestCoordinator;
219fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.Request;
229fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.RequestCoordinator;
239fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.ThumbnailRequestCoordinator;
249bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.request.bitmap.BitmapRequestBuilder;
259bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.request.bitmap.RequestListener;
269fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.ImageViewTarget;
279fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.Target;
28b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
29b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.ArrayList;
30b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.List;
31b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
32b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd/**
33b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * A generic class that can handle loading a bitmap either from an image or as a thumbnail from a video given
34b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * models loaders to translate a model into generic resources for either an image or a video and decoders that can
35b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * decode those resources into bitmaps.
36b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd *
37b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param  The type of model representing the image or video.
38b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param  The resource type that the image {@link ModelLoader} will provide that can be decoded
39b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd *                           by the image {@link BitmapDecoder}.
40b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param  The resource type that the video {@link ModelLoader} will provide that can be decoded
41b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd *                           by the video {@link BitmapDecoder}.
42b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */
43b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddpublic class GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> {
4427eb05702fd4531d6974640c62df1d569629edb6Sam Judd    protected final Context context;
4531b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    private final List<Transformation<Bitmap>> transformations = new ArrayList<Transformation<Bitmap>>();
46b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private final ModelType model;
47c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd    private final ChildLoadProvider<ModelType, ImageResourceType, Bitmap> imageLoadProvider;
48c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd    private final ChildLoadProvider<ModelType, VideoResourceType, Bitmap> videoLoadProvider;
49b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int animationId;
50a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Animation animation;
51b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int placeholderId;
52b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private int errorId;
53b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private RequestListener<ModelType> requestListener;
54b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private Float thumbSizeMultiplier;
55b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> thumbnailRequestBuilder;
56b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private Float sizeMultiplier = 1f;
57a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Drawable placeholderDrawable;
58a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    private Drawable errorPlaceholder;
5908b61677e60069ba681b56cf6312fc0b92020962Sam Judd    private Priority priority = null;
60b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
61c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd    public GenericRequestBuilder(Context context, ModelType model,
62c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            LoadProvider<ModelType, ImageResourceType, Bitmap> imageLoadProvider,
63c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            LoadProvider<ModelType, VideoResourceType, Bitmap> videoLoadProvider) {
64c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        this.imageLoadProvider = imageLoadProvider != null ?
65c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                new ChildLoadProvider<ModelType, ImageResourceType, Bitmap>(imageLoadProvider) : null;
66c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        this.videoLoadProvider = videoLoadProvider != null ?
67c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                new ChildLoadProvider<ModelType, VideoResourceType, Bitmap>(videoLoadProvider) : null;
68c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd
6927eb05702fd4531d6974640c62df1d569629edb6Sam Judd        if (context == null) {
70b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new NullPointerException("Context can't be null");
71b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
72c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        if (model != null && imageLoadProvider == null && videoLoadProvider == null) {
73c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            throw new NullPointerException("At least one of imageLoadProvider and videoLoadProvider must not be null");
74b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd        }
75c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        this.context = context;
76b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd
77b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.model = model;
78b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
79b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
80b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
81b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads and displays the image retrieved by the given thumbnail request if it finishes before this request.
82b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Best used for loading thumbnail images that are smaller and will be loaded more quickly than the fullsize
83b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * image. There are no guarantees about the order in which the requests will actually finish. However, if the
84b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * thumb request completes after the full request, the thumb image will never replace the full image.
85b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
86b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see #thumbnail(float)
87b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
88b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
89b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note - Any options on the main request will not be passed on to the thumbnail request. For example, if
90b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     you want an animation to occur when either the full image loads or the thumbnail loads, you need to call
91b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #animate(int)} on both the thumb and the full request. For a simpler thumbnail option, see
92b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #thumbnail(float)}.
93b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
94b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
95b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
96b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Only the thumbnail call on the main request will be obeyed.
97b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
98b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
99b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param thumbnailRequest The request to use to load the thumbnail.
100b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
101b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
102b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> thumbnail(
103b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> thumbnailRequest) {
104b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.thumbnailRequestBuilder = thumbnailRequest;
105b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
106b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
107b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
108b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
109b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
110b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads an image in an identical manner to this request except with the dimensions of the target multiplied
111b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * by the given size multiplier. If the thumbnail load completes before the fullsize load, the thumbnail will
112b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * be shown. If the thumbnail load completes afer the fullsize load, the thumbnail will not be shown.
113b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
114b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
115b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Note - The thumbnail image will be smaller than the size requested so the target (or {@link ImageView})
116b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     must be able to scale the thumbnail appropriately. See {@link ImageView.ScaleType}.
117b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
118b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
119b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
120b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Almost all options will be copied from the original load, including the {@link ModelLoader},
121b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link BitmapDecoder}, and {@link Transformation}s. However, {@link #placeholder(int)} and
122b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     {@link #error(int)}, and {@link #listener(RequestListener)} will only be used on the fullsize load and
123b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     will not be copied for the thumbnail load.
124b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
125b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
126b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
127b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Only the thumbnail call on the main request will be obeyed.
128b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
129b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
130b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the thumbnail.
131b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
132b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
133b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> thumbnail(float sizeMultiplier) {
134b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (sizeMultiplier < 0f || sizeMultiplier > 1f) {
135b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");
136b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
137b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.thumbSizeMultiplier = sizeMultiplier;
138b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
139b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
140b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
141b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
142b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
143b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Applies a multiplier to the {@link Target}'s size before loading the image. Useful for loading thumbnails
144b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * or trying to avoid loading huge bitmaps on devices with overly dense screens.
145b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
146b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the image.
147b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This builder object.
148b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
149b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> sizeMultiplier(
150b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            float sizeMultiplier) {
151b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (sizeMultiplier < 0f || sizeMultiplier > 1f) {
152b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");
153b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
154b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.sizeMultiplier = sizeMultiplier;
155b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
156b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
157b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
158b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
159b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
160b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads the image from the given resource type into an {@link Bitmap} using the given {@link BitmapDecoder}.
161b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
162b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
163b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Will be ignored if the data represented by the given model is not an image.
164b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
165b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
166b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see Downsampler
167b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
168b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param decoder The {@link BitmapDecoder} to use to decode the image resource.
169b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder.
170b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
171b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> imageDecoder(
17227eb05702fd4531d6974640c62df1d569629edb6Sam Judd            ResourceDecoder<ImageResourceType, Bitmap> decoder) {
173c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        imageLoadProvider.setSourceDecoder(decoder);
174b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
175b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
176b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
177b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
178b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
179b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Loads the video from the given resource type into an {@link Bitmap} using the given {@link BitmapDecoder}.
180b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
181b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * <p>
182b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *     Will be ignored if the data represented by the given model is not a video.
183b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * </p>
184b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
185b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see VideoBitmapDecoder
186b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
187b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param decoder The {@link BitmapDecoder} to use to decode the video resource.
18876fbad3dbce72240e9f5b82c826e3229c1176fb6Sam Judd     * @return This request builder.
189b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
190b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> videoDecoder(
19127eb05702fd4531d6974640c62df1d569629edb6Sam Judd            ResourceDecoder<VideoResourceType, Bitmap> decoder) {
192c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        videoLoadProvider.setSourceDecoder(decoder);
193b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
194b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
195b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
196b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
197b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
19808b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * Sets the priority for this load.
19908b61677e60069ba681b56cf6312fc0b92020962Sam Judd     *
20008b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * @param priority A priority.
20108b61677e60069ba681b56cf6312fc0b92020962Sam Judd     * @return This request builder.
20208b61677e60069ba681b56cf6312fc0b92020962Sam Judd     */
20308b61677e60069ba681b56cf6312fc0b92020962Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> priority(Priority priority) {
20408b61677e60069ba681b56cf6312fc0b92020962Sam Judd        this.priority = priority;
20508b61677e60069ba681b56cf6312fc0b92020962Sam Judd
20608b61677e60069ba681b56cf6312fc0b92020962Sam Judd        return this;
20708b61677e60069ba681b56cf6312fc0b92020962Sam Judd    }
20808b61677e60069ba681b56cf6312fc0b92020962Sam Judd
20908b61677e60069ba681b56cf6312fc0b92020962Sam Judd    /**
21031b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd     * Transform images using {@link CenterCrop}.
211b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
212b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
213b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
214b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> centerCrop() {
21531b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd        return transform(new CenterCrop(Glide.get(context).getBitmapPool()));
216b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
217b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
218b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
21931b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd     * Transform images using {@link FitCenter}.
220b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
221b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
222b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
223b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> fitCenter() {
22431b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd        return transform(new FitCenter(Glide.get(context).getBitmapPool()));
225b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
226b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
227b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
228b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Transform images with the given {@link Transformation}. Appends this transformation onto any existing
229b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * transformations
230b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
231b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param transformation the transformation to apply.
232b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
233b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
234b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> transform(
23531b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd            Transformation<Bitmap> transformation) {
236b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        transformations.add(transformation);
237b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
238b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
239b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
240b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
241b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
242b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image
243b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * was loaded asynchronously (ie was not in the memory cache)
244b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
245b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param animationId The resource id of the animation to run
246b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
247b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
248b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> animate(int animationId) {
249b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.animationId = animationId;
250b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
251b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
252b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
253b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
254b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
255a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image
256a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * was loaded asynchronously (ie was not in the memory cache)
257a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
258a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param animation The animation to run
259a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder
260a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
261a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> animate(Animation animation) {
262a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.animation = animation;
263a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
264a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
265a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
266a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
267a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
268b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a resource to display while an image is loading
269b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
270b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param resourceId The id of the resource to use as a placeholder
271b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This RequestBuilder
272b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
273b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> placeholder(int resourceId) {
274b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.placeholderId = resourceId;
275b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
276b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
277b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
278b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
279b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
280a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets a drawable to display while an image is loading.
281a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
282a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param drawable The drawable to display as a placeholder.
283a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder.
284a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
285a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> placeholder(Drawable drawable) {
286a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.placeholderDrawable = drawable;
287a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
288a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
289a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
290a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
291a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
292b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a resource to display if a load fails
293b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
294b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param resourceId The id of the resource to use as a placeholder
295b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This request
296b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
297b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> error(int resourceId) {
298b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.errorId = resourceId;
299b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
300b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
301b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
302b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
303b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
304a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * Sets a {@link Drawable} to display if a load fails.
305a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     *
306a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @param drawable The drawable to display.
307a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     * @return This RequestBuilder.
308a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd     */
309a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> error(Drawable drawable) {
310a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        this.errorPlaceholder = drawable;
311a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
312a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd        return this;
313a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    }
314a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
315a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd    /**
316b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets a RequestBuilder listener to monitor the image load. It's best to create a single instance of an
317b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * exception handler per type of request (usually activity/fragment) rather than pass one in per request to
318b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * avoid some redundant object allocation.
319b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
320b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param requestListener The request listener to use
321b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return This request
322b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
323b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public GenericRequestBuilder<ModelType, ImageResourceType, VideoResourceType> listener(
324b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            RequestListener<ModelType> requestListener) {
325b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        this.requestListener = requestListener;
326b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
327b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return this;
328b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
329b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
330b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
331b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Set the target the image will be loaded into.
332b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
333b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param target The target to load te image for
334b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return The given target.
335b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
336b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public <Y extends Target> Y into(Y target) {
337b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Request previous = target.getRequest();
338b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (previous != null) {
339b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            previous.clear();
340b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
341b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
342b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        Request request = buildRequest(target);
343b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        target.setRequest(request);
344e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd        if (request != null) {
345e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd            request.run();
346e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd        }
347b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return target;
348b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
349b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
350b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    /**
351b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * Sets the {@link ImageView} the image will be loaded into, cancels any existing loads into the view, and frees
352b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * any resources Glide has loaded into the view so they may be reused.
353b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
354b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @see Glide#clear(View)
355b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     *
356b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @param view The view to cancel previous loads for and load the new image into.
357b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     * @return The {@link ImageViewTarget} used to wrap the given {@link ImageView}.
358b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd     */
359b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    public ImageViewTarget into(ImageView view) {
360b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return into(new ImageViewTarget(view));
361b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
362b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
363b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    private <Y extends Target> Request buildRequest(Y target) {
364b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        final Request result;
365f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd
36608b61677e60069ba681b56cf6312fc0b92020962Sam Judd        if (priority == null) {
3679bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd            priority = Priority.NORMAL;
36808b61677e60069ba681b56cf6312fc0b92020962Sam Judd        }
369e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd
370b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        if (thumbnailRequestBuilder != null) {
371b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
37227eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request fullRequest = buildBitmapRequest(target, sizeMultiplier, priority, requestCoordinator);
373b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
374bcd0ac8b8367f88ca502e0540cfa871ee4eb07b2Sam Judd            if (thumbnailRequestBuilder.animationId <= 0) {
375b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                thumbnailRequestBuilder.animationId = animationId;
376b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            }
377b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
378a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd            if (thumbnailRequestBuilder.animation == null) {
379a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd                thumbnailRequestBuilder.animation = animation;
380a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd            }
381a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd
382b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            if (thumbnailRequestBuilder.requestListener == null && requestListener != null) {
383b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                thumbnailRequestBuilder.requestListener = requestListener;
384b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            }
38508b61677e60069ba681b56cf6312fc0b92020962Sam Judd
38608b61677e60069ba681b56cf6312fc0b92020962Sam Judd            if (thumbnailRequestBuilder.priority == null) {
38708b61677e60069ba681b56cf6312fc0b92020962Sam Judd                thumbnailRequestBuilder.priority = getThumbnailPriority();
38808b61677e60069ba681b56cf6312fc0b92020962Sam Judd            }
38908b61677e60069ba681b56cf6312fc0b92020962Sam Judd
39027eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request thumbnailRequest = thumbnailRequestBuilder.buildBitmapRequest(target,
39127eb05702fd4531d6974640c62df1d569629edb6Sam Judd                    thumbnailRequestBuilder.sizeMultiplier, thumbnailRequestBuilder.priority, requestCoordinator);
392b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
393b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            requestCoordinator.setRequests(fullRequest, thumbnailRequest);
394b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            result = requestCoordinator;
395b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        } else if (thumbSizeMultiplier != null) {
396b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
39727eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request fullRequest = buildBitmapRequest(target, sizeMultiplier, priority, requestCoordinator);
39827eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request thumbnailRequest = buildBitmapRequest(target, thumbSizeMultiplier, getThumbnailPriority(),
39927eb05702fd4531d6974640c62df1d569629edb6Sam Judd                    requestCoordinator);
400b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            requestCoordinator.setRequests(fullRequest, thumbnailRequest);
401b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            result = requestCoordinator;
402b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        } else {
40327eb05702fd4531d6974640c62df1d569629edb6Sam Judd            result = buildBitmapRequest(target, sizeMultiplier, priority, null);
404b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
405b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        return result;
406b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
407b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
40808b61677e60069ba681b56cf6312fc0b92020962Sam Judd    private Priority getThumbnailPriority() {
40908b61677e60069ba681b56cf6312fc0b92020962Sam Judd        final Priority result;
41008b61677e60069ba681b56cf6312fc0b92020962Sam Judd        if (priority == Priority.LOW) {
41108b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.NORMAL;
41208b61677e60069ba681b56cf6312fc0b92020962Sam Judd        } else if (priority == Priority.NORMAL) {
41308b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.HIGH;
41408b61677e60069ba681b56cf6312fc0b92020962Sam Judd        } else {
41508b61677e60069ba681b56cf6312fc0b92020962Sam Judd            result = Priority.IMMEDIATE;
41608b61677e60069ba681b56cf6312fc0b92020962Sam Judd        }
41708b61677e60069ba681b56cf6312fc0b92020962Sam Judd        return result;
41808b61677e60069ba681b56cf6312fc0b92020962Sam Judd    }
41908b61677e60069ba681b56cf6312fc0b92020962Sam Judd
42027eb05702fd4531d6974640c62df1d569629edb6Sam Judd    private <Y extends Target> Request buildBitmapRequest(Y target, float sizeMultiplier, Priority priority,
42127eb05702fd4531d6974640c62df1d569629edb6Sam Judd            RequestCoordinator requestCoordinator) {
422f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd        if (model == null) {
423c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            return buildBitmapRequestForType(target, imageLoadProvider, sizeMultiplier, priority, null).build();
424f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd        }
425c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        if (imageLoadProvider == null) {
426c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            return buildBitmapRequestForType(target, videoLoadProvider, sizeMultiplier, priority, requestCoordinator)
427c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                    .build();
428c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        } else if (videoLoadProvider == null) {
429c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            return buildBitmapRequestForType(target, imageLoadProvider, sizeMultiplier, priority, requestCoordinator)
430c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                    .build();
43127eb05702fd4531d6974640c62df1d569629edb6Sam Judd        } else {
43227eb05702fd4531d6974640c62df1d569629edb6Sam Judd            MultiTypeRequestCoordinator typeCoordinator = new MultiTypeRequestCoordinator(requestCoordinator);
43327eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request imageRequest =
434c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                    buildBitmapRequestForType(target, imageLoadProvider, sizeMultiplier, priority, typeCoordinator)
435c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                            .build();
43627eb05702fd4531d6974640c62df1d569629edb6Sam Judd            Request videoRequest =
437c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                    buildBitmapRequestForType(target, videoLoadProvider, sizeMultiplier, priority, typeCoordinator)
438c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                            .build();
43927eb05702fd4531d6974640c62df1d569629edb6Sam Judd            typeCoordinator.setRequests(imageRequest, videoRequest);
44027eb05702fd4531d6974640c62df1d569629edb6Sam Judd            return typeCoordinator;
44127eb05702fd4531d6974640c62df1d569629edb6Sam Judd        }
44227eb05702fd4531d6974640c62df1d569629edb6Sam Judd    }
44327eb05702fd4531d6974640c62df1d569629edb6Sam Judd
44427eb05702fd4531d6974640c62df1d569629edb6Sam Judd    private <Y extends Target, Z> BitmapRequestBuilder<ModelType, Z> buildBitmapRequestForType(Y target,
445c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            LoadProvider<ModelType, Z, Bitmap> loadProvider, float sizeMultiplier, Priority priority,
446c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd            RequestCoordinator requestCoordinator) {
4479bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd
448c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd        return new BitmapRequestBuilder<ModelType, Z>()
449b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setContext(context)
450c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                .setLoadProvider(loadProvider)
45108b61677e60069ba681b56cf6312fc0b92020962Sam Judd                .setPriority(priority)
452c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd                .setEngine(Glide.get(context).getEngine())
453b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setModel(model)
454b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setTarget(target)
455b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setAnimation(animationId)
456a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd                .setAnimation(animation)
457b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setRequestListener(requestListener)
458b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setPlaceholderResource(placeholderId)
459a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd                .setPlaceholderDrawable(placeholderDrawable)
460b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                .setErrorResource(errorId)
461a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd                .setErrorDrawable(errorPlaceholder)
46227eb05702fd4531d6974640c62df1d569629edb6Sam Judd                .setSizeMultiplier(sizeMultiplier)
46327eb05702fd4531d6974640c62df1d569629edb6Sam Judd                .setPriority(priority)
46431b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd                .setTransformation(getFinalTransformation())
46527eb05702fd4531d6974640c62df1d569629edb6Sam Judd                .setRequestCoordinator(requestCoordinator);
466e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd    }
467e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd
46831b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    @SuppressWarnings("unchecked")
46931b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    private Transformation<Bitmap> getFinalTransformation() {
470b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        switch (transformations.size()) {
471b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            case 0:
472b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                return Transformation.NONE;
473b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            case 1:
474b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                return transformations.get(0);
475b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd            default:
47631b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd                return new MultiTransformation<Bitmap>(transformations);
477b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd        }
478b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd    }
479b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd}
480