package com.bumptech.glide; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.ParcelFileDescriptor; import android.view.animation.Animation; import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.model.ImageVideoWrapper; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.Downsampler; import com.bumptech.glide.load.resource.bitmap.FileDescriptorBitmapDecoder; import com.bumptech.glide.load.resource.bitmap.FitCenter; import com.bumptech.glide.load.resource.bitmap.ImageVideoBitmapDecoder; import com.bumptech.glide.load.resource.bitmap.StreamBitmapDecoder; import com.bumptech.glide.load.resource.bitmap.VideoBitmapDecoder; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.manager.RequestTracker; import com.bumptech.glide.provider.LoadProvider; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.ViewPropertyAnimation; import java.io.InputStream; /** * A class for creating a request to load a bitmap for an image or from a video. Sets a variety of type independent * options including resizing, animations, and placeholders. * * @param The type of model that will be loaded into the target. * @param The type of the transcoded resource that the target will receive */ @SuppressWarnings("unused") //public api public class BitmapRequestBuilder extends GenericRequestBuilder { private final BitmapPool bitmapPool; private Downsampler downsampler = Downsampler.AT_LEAST; private DecodeFormat decodeFormat = DecodeFormat.ALWAYS_ARGB_8888; private ResourceDecoder imageDecoder; private ResourceDecoder videoDecoder; private Glide glide; BitmapRequestBuilder(Context context, ModelType model, LoadProvider streamLoadProvider, Class transcodeClass, Glide glide, RequestTracker requestTracker) { super(context, model, streamLoadProvider, transcodeClass, glide, requestTracker); this.glide = glide; this.bitmapPool = glide.getBitmapPool(); imageDecoder = new StreamBitmapDecoder(bitmapPool); videoDecoder = new FileDescriptorBitmapDecoder(bitmapPool); } /** * Load images at a size near the size of the target using {@link Downsampler#AT_LEAST}. * * @see #downsample(Downsampler) * * @return This RequestBuilder */ public BitmapRequestBuilder approximate() { return downsample(Downsampler.AT_LEAST); } /** * Load images at their original size using {@link Downsampler#NONE}. * * @see #downsample(Downsampler) * * @return This RequestBuilder */ public BitmapRequestBuilder asIs() { return downsample(Downsampler.NONE); } /** * Load images using the given {@link Downsampler}. Replaces any existing image decoder. Defaults to * {@link Downsampler#AT_LEAST}. Will be ignored if the data represented by the model is a video. This replaces any * previous calls to {@link #imageDecoder(ResourceDecoder)} and {@link #decoder(ResourceDecoder)} with default * decoders with the appropriate options set. * * @see #imageDecoder * * @param downsampler The downsampler * @return This RequestBuilder */ private BitmapRequestBuilder downsample(Downsampler downsampler) { this.downsampler = downsampler; imageDecoder = new StreamBitmapDecoder(downsampler, bitmapPool, decodeFormat); super.decoder(new ImageVideoBitmapDecoder(imageDecoder, videoDecoder)); return this; } @Override public BitmapRequestBuilder thumbnail(float sizeMultiplier) { super.thumbnail(sizeMultiplier); return this; } public BitmapRequestBuilder thumbnail(BitmapRequestBuilder thumbnailRequest) { super.thumbnail(thumbnailRequest); return this; } @Override public BitmapRequestBuilder sizeMultiplier(float sizeMultiplier) { super.sizeMultiplier(sizeMultiplier); return this; } @Override public BitmapRequestBuilder decoder(ResourceDecoder decoder) { super.decoder(decoder); return this; } @Override public BitmapRequestBuilder cacheDecoder( ResourceDecoder cacheDecoder) { super.cacheDecoder(cacheDecoder); return this; } @Override public BitmapRequestBuilder encoder(ResourceEncoder encoder) { super.encoder(encoder); return this; } public BitmapRequestBuilder imageDecoder(ResourceDecoder decoder) { imageDecoder = decoder; super.decoder(new ImageVideoBitmapDecoder(decoder, videoDecoder)); return this; } public BitmapRequestBuilder videoDecoder( ResourceDecoder decoder) { videoDecoder = decoder; super.decoder(new ImageVideoBitmapDecoder(imageDecoder, decoder)); return this; } /** * Sets the preferred format for {@link Bitmap}s decoded in this request. Defaults to * {@link DecodeFormat#ALWAYS_ARGB_8888}. This replaces any previous calls to {@link #imageDecoder(ResourceDecoder)}, * {@link #videoDecoder(ResourceDecoder)} and {@link #decoder(ResourceDecoder)} with default decoders with the * appropriate options set. * *

* Note - If using a {@link Transformation} that expect bitmaps to support transparency, this should always be * set to ALWAYS_ARGB_8888. RGB_565 requires fewer bytes per pixel and is generally preferable, but it does not * support transparency. *

* * @see DecodeFormat * * @param format The format to use. * @return This request builder. */ public BitmapRequestBuilder format(DecodeFormat format) { this.decodeFormat = format; imageDecoder = new StreamBitmapDecoder(downsampler, bitmapPool, format); videoDecoder = new FileDescriptorBitmapDecoder(new VideoBitmapDecoder(), bitmapPool, format); super.decoder(new ImageVideoBitmapDecoder(imageDecoder, videoDecoder)); return this; } @Override public BitmapRequestBuilder priority(Priority priority) { super.priority(priority); return this; } /** * Transform images using {@link CenterCrop}. * * @return This RequestBuilder */ public BitmapRequestBuilder centerCrop() { return transform(glide.getBitmapCenterCrop()); } /** * Transform images using {@link FitCenter}. * * @return This RequestBuilder */ public BitmapRequestBuilder fitCenter() { return transform(glide.getBitmapFitCenter()); } @Override public BitmapRequestBuilder transform(Transformation transformation) { super.transform(transformation); return this; } @Override public BitmapRequestBuilder transcoder( ResourceTranscoder transcoder) { super.transcoder(transcoder); return this; } @Override public BitmapRequestBuilder animate(int animationId) { super.animate(animationId); return this; } @Override public BitmapRequestBuilder animate(Animation animation) { super.animate(animation); return this; } @Override public BitmapRequestBuilder animate(ViewPropertyAnimation.Animator animator) { super.animate(animator); return this; } @Override public BitmapRequestBuilder placeholder(int resourceId) { super.placeholder(resourceId); return this; } @Override public BitmapRequestBuilder placeholder(Drawable drawable) { super.placeholder(drawable); return this; } @Override public BitmapRequestBuilder error(int resourceId) { super.error(resourceId); return this; } @Override public BitmapRequestBuilder error(Drawable drawable) { super.error(drawable); return this; } @Override public BitmapRequestBuilder listener( RequestListener requestListener) { super.listener(requestListener); return this; } @Override public BitmapRequestBuilder skipMemoryCache(boolean skip) { super.skipMemoryCache(skip); return this; } @Override public BitmapRequestBuilder skipDiskCache(boolean skip) { super.skipDiskCache(skip); return this; } @Override public BitmapRequestBuilder skipCache(boolean skip) { super.skipCache(skip); return this; } @Override public BitmapRequestBuilder override(int width, int height) { super.override(width, height); return this; } @Override public BitmapRequestBuilder thumbnail( GenericRequestBuilder thumbnailRequest) { super.thumbnail(thumbnailRequest); return this; } @Override public BitmapRequestBuilder sourceEncoder(Encoder sourceEncoder) { super.sourceEncoder(sourceEncoder); return this; } @Override public BitmapRequestBuilder cacheSource(boolean cacheSource) { super.cacheSource(cacheSource); return this; } }