GenericRequestBuilder.java revision cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9
1b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddpackage com.bumptech.glide; 2b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 3b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.content.Context; 4a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.graphics.drawable.Drawable; 5785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport android.view.View; 6531667420f0cb59e01e0ae5928392469006148ddSam Juddimport android.view.ViewPropertyAnimator; 7a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Juddimport android.view.animation.Animation; 8b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport android.widget.ImageView; 9cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Juddimport com.bumptech.glide.load.Encoder; 109bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.MultiTransformation; 119fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.load.ResourceDecoder; 12d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport com.bumptech.glide.load.ResourceEncoder; 1380b7691daac313059e4311214249fa6da53451edSam Juddimport com.bumptech.glide.load.SkipCache; 149bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.load.Transformation; 15ee914288218f2fa29a96ed746c9bd9995857c8cdSam Juddimport com.bumptech.glide.load.UnitTransformation; 167260e7b8e840ae9e03cc20df73accfc4121cb190Sam Juddimport com.bumptech.glide.load.model.ModelLoader; 17cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Juddimport com.bumptech.glide.load.model.NullEncoder; 18bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.resource.bitmap.BitmapDecoder; 19bcf4a0dae04a4ad14287eeb34069a97c96fe9bb1Sam Juddimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder; 208a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Juddimport com.bumptech.glide.manager.RequestManager; 219bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Juddimport com.bumptech.glide.provider.ChildLoadProvider; 229fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.provider.LoadProvider; 23531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.GenericRequest; 24531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.GlideAnimationFactory; 25531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.NoAnimation; 26785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.Request; 279fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.RequestCoordinator; 281a0d2f25951a536b465c5b2a1dfa5d3c076de912Sam Juddimport com.bumptech.glide.request.RequestListener; 29531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.ThumbnailRequestCoordinator; 30531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.ViewAnimation; 31531667420f0cb59e01e0ae5928392469006148ddSam Juddimport com.bumptech.glide.request.ViewPropertyAnimation; 32785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Juddimport com.bumptech.glide.request.target.BitmapImageViewTarget; 339fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddimport com.bumptech.glide.request.target.Target; 34b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 35d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddimport java.io.InputStream; 36b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.ArrayList; 37b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Juddimport java.util.List; 38b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 39b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd/** 40b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * A generic class that can handle loading a bitmap either from an image or as a thumbnail from a video given 41b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * models loaders to translate a model into generic resources for either an image or a video and decoders that can 42b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * decode those resources into bitmaps. 43b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 44b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @paramThe type of model representing the image or video. 45dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd * @param The data type that the image {@link ModelLoader} will provide that can be decoded by the image 4644e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd * {@link BitmapDecoder}. 4744e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd * @param The type of the resource that will be loaded. 48b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 49dbb67f826b0e76645c809be6d589e9dcb8271324Sam Juddpublic class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> { 50d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd private final Context context; 51b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd private final ModelType model; 52dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd private final ChildLoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider; 5377e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd private final Class<TranscodeType> transcodeClass; 547260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd private final Glide glide; 558a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd private final RequestManager requestManager; 56cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd private List<Transformation<ResourceType>> transformations = null; 57cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd private Transformation<ResourceType> singleTransformation = UnitTransformation.get(); 58b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd private int placeholderId; 59b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd private int errorId; 60444371118bf079a412017948166cf4eb4db48103Sam Judd private RequestListener<ModelType, TranscodeType> requestListener; 61b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd private Float thumbSizeMultiplier; 62dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd private GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> 63ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd thumbnailRequestBuilder; 64b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd private Float sizeMultiplier = 1f; 65a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd private Drawable placeholderDrawable; 66a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd private Drawable errorPlaceholder; 6708b61677e60069ba681b56cf6312fc0b92020962Sam Judd private Priority priority = null; 6880b7691daac313059e4311214249fa6da53451edSam Judd private boolean isCacheable = true; 6980b7691daac313059e4311214249fa6da53451edSam Judd private ResourceEncoder<ResourceType> preSkipEncoder; 70531667420f0cb59e01e0ae5928392469006148ddSam Judd private GlideAnimationFactory<TranscodeType> animationFactory = NoAnimation.getFactory(); 71b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd private int overrideHeight = -1; 72b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd private int overrideWidth = -1; 73cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd private boolean cacheSource = false; 74cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd private Encoder<DataType> preSkipSourceEncoder; 75b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 767260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd GenericRequestBuilder(Context context, ModelType model, 77dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider, 788a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd Class<TranscodeType> transcodeClass, Glide glide, RequestManager requestManager) { 7977e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd this.transcodeClass = transcodeClass; 80d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd this.glide = glide; 818a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd this.requestManager = requestManager; 82dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd this.loadProvider = loadProvider != null ? 83dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd new ChildLoadProvider<ModelType, DataType, ResourceType, TranscodeType>(loadProvider) : null; 8480b7691daac313059e4311214249fa6da53451edSam Judd preSkipEncoder = loadProvider != null ? loadProvider.getEncoder() : null; 85c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd 8627eb05702fd4531d6974640c62df1d569629edb6Sam Judd if (context == null) { 87b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd throw new NullPointerException("Context can't be null"); 88b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 89dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd if (model != null && loadProvider == null) { 90dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd throw new NullPointerException("LoadProvider must not be null"); 91b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd } 92c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd this.context = context; 93b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.model = model; 94b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 95b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 96b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 97b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Loads and displays the image retrieved by the given thumbnail request if it finishes before this request. 98b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Best used for loading thumbnail images that are smaller and will be loaded more quickly than the fullsize 99b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * image. There are no guarantees about the order in which the requests will actually finish. However, if the 100b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * thumb request completes after the full request, the thumb image will never replace the full image. 101b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 102b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @see #thumbnail(float) 103b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 104b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 105b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Note - Any options on the main request will not be passed on to the thumbnail request. For example, if 106b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * you want an animation to occur when either the full image loads or the thumbnail loads, you need to call 107b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * {@link #animate(int)} on both the thumb and the full request. For a simpler thumbnail option, see 108b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * {@link #thumbnail(float)}. 109b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 110b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 111b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 112b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Only the thumbnail call on the main request will be obeyed. 113b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 114b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 115b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param thumbnailRequest The request to use to load the thumbnail. 116b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This builder object. 117b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 118dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> thumbnail( 119dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> 12077e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd thumbnailRequest) { 121b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.thumbnailRequestBuilder = thumbnailRequest; 122b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 123b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 124b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 125b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 126b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 127b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Loads an image in an identical manner to this request except with the dimensions of the target multiplied 128b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * by the given size multiplier. If the thumbnail load completes before the fullsize load, the thumbnail will 129b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * be shown. If the thumbnail load completes afer the fullsize load, the thumbnail will not be shown. 130b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 131b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 132b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Note - The thumbnail image will be smaller than the size requested so the target (or {@link ImageView}) 133b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * must be able to scale the thumbnail appropriately. See {@link ImageView.ScaleType}. 134b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 135b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 136b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 137b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Almost all options will be copied from the original load, including the {@link ModelLoader}, 138b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * {@link BitmapDecoder}, and {@link Transformation}s. However, {@link #placeholder(int)} and 139b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * {@link #error(int)}, and {@link #listener(RequestListener)} will only be used on the fullsize load and 140b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * will not be copied for the thumbnail load. 141b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 142b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 143b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 144b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Only the thumbnail call on the main request will be obeyed. 145b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 146b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 147b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the thumbnail. 148b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This builder object. 149b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 150dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> thumbnail( 15177e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd float sizeMultiplier) { 152b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd if (sizeMultiplier < 0f || sizeMultiplier > 1f) { 153b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1"); 154b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 155b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.thumbSizeMultiplier = sizeMultiplier; 156b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 157b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 158b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 159b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 160b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 161b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Applies a multiplier to the {@link Target}'s size before loading the image. Useful for loading thumbnails 162b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * or trying to avoid loading huge bitmaps on devices with overly dense screens. 163b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 164b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading the image. 165b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This builder object. 166b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 167dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> sizeMultiplier( 168b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd float sizeMultiplier) { 169b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd if (sizeMultiplier < 0f || sizeMultiplier > 1f) { 170b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1"); 171b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 172b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.sizeMultiplier = sizeMultiplier; 173b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 174b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 175b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 176b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 177b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 178dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd * Loads the resource from the given data type using the given {@link BitmapDecoder}. 179b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 180b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * <p> 181b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Will be ignored if the data represented by the given model is not a video. 182b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * </p> 183b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 184b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param decoder The {@link BitmapDecoder} to use to decode the video resource. 18576fbad3dbce72240e9f5b82c826e3229c1176fb6Sam Judd * @return This request builder. 186b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 187dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> decoder( 188dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd ResourceDecoder<DataType, ResourceType> decoder) { 1897260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to 1907260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // ignore the decoder. 1917260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd if (loadProvider != null) { 1927260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd loadProvider.setSourceDecoder(decoder); 1937260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd } 194b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 195b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 196b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 197b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 198dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> cacheDecoder( 1997260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd ResourceDecoder <InputStream, ResourceType> cacheDecoder) { 2007260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to 2017260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // ignore the decoder. 2027260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd if (loadProvider != null) { 2037260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd loadProvider.setCacheDecoder(cacheDecoder); 2047260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd } 205d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 206d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd return this; 207d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd } 208d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 209cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd /** 210cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * Sets the source encoder to use to encode the data retrieved by this request directly into cache. The returned 211cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * resouce will then be decoded from the cached data. 212cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 213cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * <p> 214cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * Note - This encoder will not be used unless 215cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * </p> 216cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 217cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @param sourceEncoder The encoder to use. 218cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @return This request builder. 219cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd */ 220cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> sourceEncoder( 221cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd Encoder<DataType> sourceEncoder) { 222cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd if (loadProvider != null) { 223cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd loadProvider.setSourceEncoder(sourceEncoder); 224cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd preSkipSourceEncoder = sourceEncoder; 225cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } 226cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd 227cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd return this; 228cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } 229cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd 230cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd /** 231cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * Attempts to write the data retrieved by this request to cache first and then decodes the resource from the cached 232cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * source data. Only makes sense for remote or transient data as a means of either avoiding downloading the same 233cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * data repeatedly or preserving some content you expect to be removed. 234cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 235cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * <p> 236cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * Note that if this is set to true the {@link ResourceDecoder} set as the decoder will not be used, instead the 237cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * cache decoder will be used. 238cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * </p> 239cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 240cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * <p> 241cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * If no {@link Encoder} is set or available for the given data type, this may cause the load to fail. 242cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * </p> 243cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 244cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @see #sourceEncoder(Encoder) 245cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @see #decoder(ResourceDecoder) 246cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @see #cacheDecoder(ResourceDecoder) 247cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @see #skipCache(boolean) 248cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * 249cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @param cacheSource True to write the data directly to cache . 250cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd * @return This request builder. 251cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd */ 252cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> cacheSource(boolean cacheSource) { 253cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd this.cacheSource = cacheSource; 254cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd if (!cacheSource) { 255cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd if (loadProvider != null) { 256cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd preSkipSourceEncoder = loadProvider.getSourceEncoder(); 257cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } 258cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd final Encoder<DataType> skipCache = NullEncoder.get(); 259cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd return sourceEncoder(skipCache); 260cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } else { 261cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd return sourceEncoder(preSkipSourceEncoder); 262cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } 263cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd } 264cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd 265dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> encoder( 266d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd ResourceEncoder<ResourceType> encoder) { 2677260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // loadProvider will be null if model is null, in which case we're not going to load anything so it's ok to 2687260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd // ignore the encoder. 2697260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd if (loadProvider != null) { 2707260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd loadProvider.setEncoder(encoder); 2717260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd preSkipEncoder = encoder; 2727260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd } 273d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 274d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd return this; 275d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd } 276d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 277b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 27808b61677e60069ba681b56cf6312fc0b92020962Sam Judd * Sets the priority for this load. 27908b61677e60069ba681b56cf6312fc0b92020962Sam Judd * 28008b61677e60069ba681b56cf6312fc0b92020962Sam Judd * @param priority A priority. 28108b61677e60069ba681b56cf6312fc0b92020962Sam Judd * @return This request builder. 28208b61677e60069ba681b56cf6312fc0b92020962Sam Judd */ 283dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> priority( 284d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd Priority priority) { 28508b61677e60069ba681b56cf6312fc0b92020962Sam Judd this.priority = priority; 28608b61677e60069ba681b56cf6312fc0b92020962Sam Judd 28708b61677e60069ba681b56cf6312fc0b92020962Sam Judd return this; 28808b61677e60069ba681b56cf6312fc0b92020962Sam Judd } 28908b61677e60069ba681b56cf6312fc0b92020962Sam Judd 290b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 291b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Transform images with the given {@link Transformation}. Appends this transformation onto any existing 292b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * transformations 293b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 294b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param transformation the transformation to apply. 295b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This RequestBuilder 296b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 297dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> transform( 29844e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd Transformation<ResourceType> transformation) { 299ee914288218f2fa29a96ed746c9bd9995857c8cdSam Judd if (singleTransformation == UnitTransformation.get()) { 3001f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd singleTransformation = transformation; 3011f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd } else { 3021f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd transformations = new ArrayList<Transformation<ResourceType>>(); 3031f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd transformations.add(singleTransformation); 3041f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd transformations.add(transformation); 3051f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd } 306b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 307b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 308b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 309b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 310dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> transcoder( 311d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd ResourceTranscoder<ResourceType, TranscodeType> transcoder) { 312dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd if (loadProvider != null) { 313dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd loadProvider.setTranscoder(transcoder); 314d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd } 315d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 316d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd return this; 317d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd } 318d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd 319b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 320b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image 321b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * was loaded asynchronously (ie was not in the memory cache) 322b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 323b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param animationId The resource id of the animation to run 324b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This RequestBuilder 325b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 326531667420f0cb59e01e0ae5928392469006148ddSam Judd // This is safe because the view animation doesn't care about the resource type it receives. 327531667420f0cb59e01e0ae5928392469006148ddSam Judd @SuppressWarnings("unchecked") 328dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate( 329d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd int animationId) { 330531667420f0cb59e01e0ae5928392469006148ddSam Judd return animate(new ViewAnimation.ViewAnimationFactory(context, animationId)); 331b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 332b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 333b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 334a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * Sets an animation to run on the wrapped target when an image load finishes. Will only be run if the image 335a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * was loaded asynchronously (ie was not in the memory cache) 336a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * 337a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @param animation The animation to run 338a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @return This RequestBuilder 339a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd */ 340531667420f0cb59e01e0ae5928392469006148ddSam Judd // This is safe because the view animation doesn't care about the resource type it receives. 341531667420f0cb59e01e0ae5928392469006148ddSam Judd @SuppressWarnings("unchecked") 342dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate( 343d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd Animation animation) { 344531667420f0cb59e01e0ae5928392469006148ddSam Judd return animate(new ViewAnimation.ViewAnimationFactory(animation)); 345531667420f0cb59e01e0ae5928392469006148ddSam Judd } 346531667420f0cb59e01e0ae5928392469006148ddSam Judd 347531667420f0cb59e01e0ae5928392469006148ddSam Judd /** 348531667420f0cb59e01e0ae5928392469006148ddSam Judd * Sets an animator to run a {@link ViewPropertyAnimator} on a view that the target may be wrapping when a resource 349531667420f0cb59e01e0ae5928392469006148ddSam Judd * load finishes. Will only be run if the load was loaded asynchronously (ie was not in the memory cache). 350531667420f0cb59e01e0ae5928392469006148ddSam Judd * 351531667420f0cb59e01e0ae5928392469006148ddSam Judd * @param animator The {@link ViewPropertyAnimation.Animator} to run. 352531667420f0cb59e01e0ae5928392469006148ddSam Judd * @return This RequestBuilder. 353531667420f0cb59e01e0ae5928392469006148ddSam Judd */ 354531667420f0cb59e01e0ae5928392469006148ddSam Judd // This is safe because the view property animation doesn't care about the resource type it receives. 355531667420f0cb59e01e0ae5928392469006148ddSam Judd @SuppressWarnings("unchecked") 356531667420f0cb59e01e0ae5928392469006148ddSam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate( 357531667420f0cb59e01e0ae5928392469006148ddSam Judd ViewPropertyAnimation.Animator animator) { 358531667420f0cb59e01e0ae5928392469006148ddSam Judd return animate(new ViewPropertyAnimation.ViewPropertyAnimationFactory(animator)); 359531667420f0cb59e01e0ae5928392469006148ddSam Judd } 360531667420f0cb59e01e0ae5928392469006148ddSam Judd 361531667420f0cb59e01e0ae5928392469006148ddSam Judd GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> animate( 362531667420f0cb59e01e0ae5928392469006148ddSam Judd GlideAnimationFactory<TranscodeType> animationFactory) { 363531667420f0cb59e01e0ae5928392469006148ddSam Judd if (animationFactory == null) { 364531667420f0cb59e01e0ae5928392469006148ddSam Judd throw new NullPointerException("Animation factory must not be null!"); 365531667420f0cb59e01e0ae5928392469006148ddSam Judd } 366531667420f0cb59e01e0ae5928392469006148ddSam Judd this.animationFactory = animationFactory; 367a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 368a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd return this; 369a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd } 370a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 371a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd /** 372b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Sets a resource to display while an image is loading 373b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 374b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param resourceId The id of the resource to use as a placeholder 375b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This RequestBuilder 376b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 377dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> placeholder( 378d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd int resourceId) { 379b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.placeholderId = resourceId; 380b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 381b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 382b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 383b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 384b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 385a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * Sets a drawable to display while an image is loading. 386a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * 387a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @param drawable The drawable to display as a placeholder. 388a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @return This RequestBuilder. 389a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd */ 390dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> placeholder( 391d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd Drawable drawable) { 392a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd this.placeholderDrawable = drawable; 393a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 394a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd return this; 395a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd } 396a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 397a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd /** 398b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Sets a resource to display if a load fails 399b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 400b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param resourceId The id of the resource to use as a placeholder 401b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return This request 402b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 403dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> error( 404d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd int resourceId) { 405b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.errorId = resourceId; 406b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 407b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 408b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 409b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 410b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 411a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * Sets a {@link Drawable} to display if a load fails. 412a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * 413a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @param drawable The drawable to display. 414a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd * @return This RequestBuilder. 415a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd */ 416dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> error( 417d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd Drawable drawable) { 418a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd this.errorPlaceholder = drawable; 419a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 420a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd return this; 421a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd } 422a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 423a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd /** 424b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Sets a RequestBuilder listener to monitor the image load. It's best to create a single instance of an 425b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * exception handler per type of request (usually activity/fragment) rather than pass one in per request to 426b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * avoid some redundant object allocation. 427b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 42880b7691daac313059e4311214249fa6da53451edSam Judd * @param requestListener The request listener to use. 42980b7691daac313059e4311214249fa6da53451edSam Judd * @return This RequestBuilder. 430b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 431dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> listener( 432444371118bf079a412017948166cf4eb4db48103Sam Judd RequestListener<ModelType, TranscodeType> requestListener) { 433b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd this.requestListener = requestListener; 434b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 435b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return this; 436b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 437b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 438b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd /** 43980b7691daac313059e4311214249fa6da53451edSam Judd * Allows the loaded resource to skip the memory cache. 44080b7691daac313059e4311214249fa6da53451edSam Judd * 44180b7691daac313059e4311214249fa6da53451edSam Judd * <p> 44280b7691daac313059e4311214249fa6da53451edSam Judd * Note - this is not a guarantee. If a request is already pending for this resource and that request is not 44380b7691daac313059e4311214249fa6da53451edSam Judd * also skipping the memory cache, the resource will be cached in memory. 44480b7691daac313059e4311214249fa6da53451edSam Judd * </p> 44580b7691daac313059e4311214249fa6da53451edSam Judd * 44680b7691daac313059e4311214249fa6da53451edSam Judd * @param skip True to allow the resource to skip the memory cache. 44780b7691daac313059e4311214249fa6da53451edSam Judd * @return This RequestBuilder. 44880b7691daac313059e4311214249fa6da53451edSam Judd */ 44980b7691daac313059e4311214249fa6da53451edSam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipMemoryCache(boolean skip) { 45080b7691daac313059e4311214249fa6da53451edSam Judd this.isCacheable = !skip; 45180b7691daac313059e4311214249fa6da53451edSam Judd 45280b7691daac313059e4311214249fa6da53451edSam Judd return this; 45380b7691daac313059e4311214249fa6da53451edSam Judd } 45480b7691daac313059e4311214249fa6da53451edSam Judd 45580b7691daac313059e4311214249fa6da53451edSam Judd /** 45680b7691daac313059e4311214249fa6da53451edSam Judd * Allows the loaded resource to skip the disk cache. 45780b7691daac313059e4311214249fa6da53451edSam Judd * 45880b7691daac313059e4311214249fa6da53451edSam Judd * <p> 45980b7691daac313059e4311214249fa6da53451edSam Judd * Note - this is not a guarantee. If a request is already pending for this resource and that request is not 46080b7691daac313059e4311214249fa6da53451edSam Judd * also skipping the disk cache, the resource will be cached on disk. 46180b7691daac313059e4311214249fa6da53451edSam Judd * </p> 46280b7691daac313059e4311214249fa6da53451edSam Judd * 46380b7691daac313059e4311214249fa6da53451edSam Judd * @param skip True to allow the resource to skip the disk cache. 46480b7691daac313059e4311214249fa6da53451edSam Judd * @return This RequestBuilder. 46580b7691daac313059e4311214249fa6da53451edSam Judd */ 46680b7691daac313059e4311214249fa6da53451edSam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipDiskCache(boolean skip) { 46780b7691daac313059e4311214249fa6da53451edSam Judd if (skip) { 4687260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd if (loadProvider != null) { 4697260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd preSkipEncoder = loadProvider.getEncoder(); 4707260e7b8e840ae9e03cc20df73accfc4121cb190Sam Judd } 47180b7691daac313059e4311214249fa6da53451edSam Judd final SkipCache<ResourceType> skipCache = SkipCache.get(); 47280b7691daac313059e4311214249fa6da53451edSam Judd return encoder(skipCache); 47380b7691daac313059e4311214249fa6da53451edSam Judd } else { 47480b7691daac313059e4311214249fa6da53451edSam Judd return encoder(preSkipEncoder); 47580b7691daac313059e4311214249fa6da53451edSam Judd } 47680b7691daac313059e4311214249fa6da53451edSam Judd } 47780b7691daac313059e4311214249fa6da53451edSam Judd 47880b7691daac313059e4311214249fa6da53451edSam Judd /** 47980b7691daac313059e4311214249fa6da53451edSam Judd * Allows the resource to skip both the memory and the disk cache. 48080b7691daac313059e4311214249fa6da53451edSam Judd * 48180b7691daac313059e4311214249fa6da53451edSam Judd * @see #skipDiskCache(boolean) 48280b7691daac313059e4311214249fa6da53451edSam Judd * @see #skipMemoryCache(boolean) 48380b7691daac313059e4311214249fa6da53451edSam Judd * 48480b7691daac313059e4311214249fa6da53451edSam Judd * @param skip True to allow the resource to skip both the memory and the disk cache. 48580b7691daac313059e4311214249fa6da53451edSam Judd * @return This RequestBuilder. 48680b7691daac313059e4311214249fa6da53451edSam Judd */ 48780b7691daac313059e4311214249fa6da53451edSam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> skipCache(boolean skip) { 48880b7691daac313059e4311214249fa6da53451edSam Judd skipMemoryCache(skip); 48980b7691daac313059e4311214249fa6da53451edSam Judd skipDiskCache(skip); 490cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd cacheSource(false); 49180b7691daac313059e4311214249fa6da53451edSam Judd 49280b7691daac313059e4311214249fa6da53451edSam Judd return this; 49380b7691daac313059e4311214249fa6da53451edSam Judd } 49480b7691daac313059e4311214249fa6da53451edSam Judd 49580b7691daac313059e4311214249fa6da53451edSam Judd /** 496b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * Overrides the {@link Target}'s width and height with the given values. This is useful almost exclusively for 497b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * thumbnails, and should only be used when you both need a very specific sized image and when it is impossible or 498b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * impractical to return that size from {@link Target#getSize(Target.SizeReadyCallback)}. 499b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * 500b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * @param width The width to use to load the resource. 501b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * @param height The height to use to load the resource. 502b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd * @return This RequestBuilder. 503b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd */ 504b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> override(int width, int height) { 505b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd if (width <= 0) { 506b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd throw new IllegalArgumentException("Width must be >= 0"); 507b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd } 508b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd if (height <= 0) { 509b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd throw new IllegalArgumentException("Height must be >= 0"); 510b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd } 511b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd this.overrideWidth = width; 512b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd this.overrideHeight = height; 513b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd 514b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd return this; 515b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd } 516b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd 517b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd /** 518b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * Set the target the image will be loaded into. 519b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * 520b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @param target The target to load te image for 521b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd * @return The given target. 522b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd */ 52377e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd public <Y extends Target<TranscodeType>> Y into(Y target) { 524785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request previous = target.getRequest(); 5258a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd 526b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd if (previous != null) { 527b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd previous.clear(); 5288a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd requestManager.removeRequest(previous); 529d0546ba0366fc276a5ac1f4c2eea88901166f7beSam Judd previous.recycle(); 530b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 531b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 532785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request request = buildRequest(target); 533b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd target.setRequest(request); 5348a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd requestManager.addRequest(request); 535e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd if (request != null) { 536e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd request.run(); 537e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd } 538b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return target; 539b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 540b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 541785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd /** 542785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * Sets the {@link ImageView} the image will be loaded into, cancels any existing loads into the view, and frees 543785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * any resources Glide has loaded into the view so they may be reused. 544785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * 545785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * @see Glide#clear(View) 546785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * 547785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * @param view The view to cancel previous loads for and load the new image into. 548785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd * @return The {@link BitmapImageViewTarget} used to wrap the given {@link ImageView}. 549785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd */ 55077e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd public Target<TranscodeType> into(ImageView view) { 551d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd return into(glide.buildImageViewTarget(view, transcodeClass)); 552785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd } 553785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd 55477e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd private Request buildRequest(Target<TranscodeType> target) { 555785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd final Request result; 556f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd 55708b61677e60069ba681b56cf6312fc0b92020962Sam Judd if (priority == null) { 5589bebdf4ee5dcaa1569bea3985dfe08f93ed8bd38Sam Judd priority = Priority.NORMAL; 55908b61677e60069ba681b56cf6312fc0b92020962Sam Judd } 560e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd 561b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd if (thumbnailRequestBuilder != null) { 562b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator(); 563785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator); 564b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 565531667420f0cb59e01e0ae5928392469006148ddSam Judd if (thumbnailRequestBuilder.animationFactory.equals(NoAnimation.getFactory())) { 566531667420f0cb59e01e0ae5928392469006148ddSam Judd thumbnailRequestBuilder.animationFactory = animationFactory; 567a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd } 568a76c1d39daf35a8375fea219cdd69c1dd56a276fSam Judd 569b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd if (thumbnailRequestBuilder.requestListener == null && requestListener != null) { 570b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd thumbnailRequestBuilder.requestListener = requestListener; 571b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 57208b61677e60069ba681b56cf6312fc0b92020962Sam Judd 57308b61677e60069ba681b56cf6312fc0b92020962Sam Judd if (thumbnailRequestBuilder.priority == null) { 57408b61677e60069ba681b56cf6312fc0b92020962Sam Judd thumbnailRequestBuilder.priority = getThumbnailPriority(); 57508b61677e60069ba681b56cf6312fc0b92020962Sam Judd } 57608b61677e60069ba681b56cf6312fc0b92020962Sam Judd 577785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request thumbnailRequest = thumbnailRequestBuilder.buildRequest(target, 57827eb05702fd4531d6974640c62df1d569629edb6Sam Judd thumbnailRequestBuilder.sizeMultiplier, thumbnailRequestBuilder.priority, requestCoordinator); 579b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 580b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd requestCoordinator.setRequests(fullRequest, thumbnailRequest); 581b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd result = requestCoordinator; 582b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } else if (thumbSizeMultiplier != null) { 583b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator(); 584785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator); 585785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd Request thumbnailRequest = buildRequest(target, thumbSizeMultiplier, getThumbnailPriority(), 58627eb05702fd4531d6974640c62df1d569629edb6Sam Judd requestCoordinator); 587b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd requestCoordinator.setRequests(fullRequest, thumbnailRequest); 588b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd result = requestCoordinator; 589b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } else { 59044e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd result = buildRequest(target, sizeMultiplier, priority, null); 591b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 592b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd return result; 593b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 594b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd 59508b61677e60069ba681b56cf6312fc0b92020962Sam Judd private Priority getThumbnailPriority() { 59608b61677e60069ba681b56cf6312fc0b92020962Sam Judd final Priority result; 59708b61677e60069ba681b56cf6312fc0b92020962Sam Judd if (priority == Priority.LOW) { 59808b61677e60069ba681b56cf6312fc0b92020962Sam Judd result = Priority.NORMAL; 59908b61677e60069ba681b56cf6312fc0b92020962Sam Judd } else if (priority == Priority.NORMAL) { 60008b61677e60069ba681b56cf6312fc0b92020962Sam Judd result = Priority.HIGH; 60108b61677e60069ba681b56cf6312fc0b92020962Sam Judd } else { 60208b61677e60069ba681b56cf6312fc0b92020962Sam Judd result = Priority.IMMEDIATE; 60308b61677e60069ba681b56cf6312fc0b92020962Sam Judd } 60408b61677e60069ba681b56cf6312fc0b92020962Sam Judd return result; 60508b61677e60069ba681b56cf6312fc0b92020962Sam Judd } 60608b61677e60069ba681b56cf6312fc0b92020962Sam Judd 60777e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd private Request buildRequest(Target<TranscodeType> target, float sizeMultiplier, Priority priority, 60827eb05702fd4531d6974640c62df1d569629edb6Sam Judd RequestCoordinator requestCoordinator) { 609f9ccb9c6c3f50832993459b83746567dfeb6acbaSam Judd if (model == null) { 610dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, null); 61127eb05702fd4531d6974640c62df1d569629edb6Sam Judd } else { 612dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, requestCoordinator); 61327eb05702fd4531d6974640c62df1d569629edb6Sam Judd } 61427eb05702fd4531d6974640c62df1d569629edb6Sam Judd } 61527eb05702fd4531d6974640c62df1d569629edb6Sam Judd 61677e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd private <Z> Request buildRequestForDataType(Target<TranscodeType> target, 617ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd LoadProvider<ModelType, Z, ResourceType, TranscodeType> loadProvider, float sizeMultiplier, 618ad7119b91370d7418b24f5646b35190aa76e5e66Sam Judd Priority priority, RequestCoordinator requestCoordinator) { 619d0546ba0366fc276a5ac1f4c2eea88901166f7beSam Judd return GenericRequest.obtain( 620531667420f0cb59e01e0ae5928392469006148ddSam Judd loadProvider, 621531667420f0cb59e01e0ae5928392469006148ddSam Judd model, 622531667420f0cb59e01e0ae5928392469006148ddSam Judd context, 623531667420f0cb59e01e0ae5928392469006148ddSam Judd priority, 624531667420f0cb59e01e0ae5928392469006148ddSam Judd target, 625531667420f0cb59e01e0ae5928392469006148ddSam Judd sizeMultiplier, 626531667420f0cb59e01e0ae5928392469006148ddSam Judd placeholderDrawable, 627531667420f0cb59e01e0ae5928392469006148ddSam Judd placeholderId, 628531667420f0cb59e01e0ae5928392469006148ddSam Judd errorPlaceholder, 629531667420f0cb59e01e0ae5928392469006148ddSam Judd errorId, 630531667420f0cb59e01e0ae5928392469006148ddSam Judd requestListener, 631531667420f0cb59e01e0ae5928392469006148ddSam Judd requestCoordinator, 632531667420f0cb59e01e0ae5928392469006148ddSam Judd glide.getEngine(), 633531667420f0cb59e01e0ae5928392469006148ddSam Judd getFinalTransformation(), 634531667420f0cb59e01e0ae5928392469006148ddSam Judd transcodeClass, 635531667420f0cb59e01e0ae5928392469006148ddSam Judd isCacheable, 636b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd animationFactory, 637b46fae747f6bf04b849442f851a1c9da51434ec1Sam Judd overrideWidth, 638cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd overrideHeight, 639cf1e05bf226ce4e7a510a5f7cac0661b9b2e90e9Sam Judd cacheSource); 640e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd } 641e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd 64231b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd @SuppressWarnings("unchecked") 64344e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd private Transformation<ResourceType> getFinalTransformation() { 6441f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd if (transformations == null) { 6451f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd return singleTransformation; 6461f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd } else { 6471f028c8ef85fdd1608c7d716d41e7e086fc77359Sam Judd return new MultiTransformation<ResourceType>(transformations); 648b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 649b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd } 650b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd} 651