parent
							
								
									097a194931
								
							
						
					
					
						commit
						23ecb48057
					
				@ -0,0 +1,259 @@ | 
				
			|||||||
 | 
					package io.legado.app.help | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Context | 
				
			||||||
 | 
					import android.graphics.Bitmap | 
				
			||||||
 | 
					import android.graphics.drawable.Drawable | 
				
			||||||
 | 
					import android.net.Uri | 
				
			||||||
 | 
					import android.widget.ImageView | 
				
			||||||
 | 
					import androidx.annotation.DrawableRes | 
				
			||||||
 | 
					import com.bumptech.glide.Glide | 
				
			||||||
 | 
					import com.bumptech.glide.RequestBuilder | 
				
			||||||
 | 
					import com.bumptech.glide.RequestManager | 
				
			||||||
 | 
					import com.bumptech.glide.load.engine.DiskCacheStrategy | 
				
			||||||
 | 
					import com.bumptech.glide.load.resource.bitmap.* | 
				
			||||||
 | 
					import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions | 
				
			||||||
 | 
					import com.bumptech.glide.load.resource.gif.GifDrawable | 
				
			||||||
 | 
					import com.bumptech.glide.request.RequestOptions | 
				
			||||||
 | 
					import com.bumptech.glide.request.transition.Transition | 
				
			||||||
 | 
					import java.io.File | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					object ImageLoader { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, url: String?): ImageLoadBuilder<String> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, url) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, @DrawableRes resId: Int?): ImageLoadBuilder<Int> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, resId) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, file: File?): ImageLoadBuilder<File> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, file) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, uri: Uri?): ImageLoadBuilder<Uri> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, uri) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, drawable: Drawable?): ImageLoadBuilder<Drawable> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, drawable) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, bitmap: Bitmap?): ImageLoadBuilder<Bitmap> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, bitmap) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun load(context: Context, bytes: ByteArray?): ImageLoadBuilder<ByteArray> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context, bytes) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun with(context: Context): ImageLoadBuilder<Any> { | 
				
			||||||
 | 
					        return ImageLoadBuilder(context) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fun clear(imageView: ImageView) { | 
				
			||||||
 | 
					        with(imageView.context).clear(imageView) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class ImageLoadBuilder<S> constructor(context: Context, private var source: S? = null) { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private val manager: RequestManager = Glide.with(context) | 
				
			||||||
 | 
					        private var requestOptions: RequestOptions = RequestOptions() | 
				
			||||||
 | 
					        private var crossFade: Boolean = false | 
				
			||||||
 | 
					        private var noCache: Boolean = false | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun load(source: S): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            this.source = source | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun toRound(corner: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transform(RoundedCorners(corner)) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun toCropRound(corner: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transforms(CenterCrop(), RoundedCorners(corner)) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun toCircle(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transform(CircleCrop()) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun centerInside(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transform(CenterInside()) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun fitCenter(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transform(FitCenter()) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun centerCrop(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.transform(CenterCrop()) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun crossFade(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            crossFade = true | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun noCache(): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            noCache = true | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun placeholder(placeholder: Drawable): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.placeholder(placeholder) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun placeholder(@DrawableRes resId: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.placeholder(resId) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun error(drawable: Drawable): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.error(drawable) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun error(@DrawableRes resId: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.error(resId) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun override(width: Int, height: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.override(width, height) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun override(size: Int): ImageLoadBuilder<S> { | 
				
			||||||
 | 
					            requestOptions = requestOptions.override(size) | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun clear(imageView: ImageView) { | 
				
			||||||
 | 
					            manager.clear(imageView) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun downloadOnly(target: ImageViewTarget<File>) { | 
				
			||||||
 | 
					            manager.downloadOnly().load(source).into(Target(target)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsDrawable(imageView: ImageView) { | 
				
			||||||
 | 
					            asDrawable().into(imageView) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsDrawable(target: ImageViewTarget<Drawable>) { | 
				
			||||||
 | 
					            asDrawable().into(Target(target)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsBitmap(imageView: ImageView) { | 
				
			||||||
 | 
					            asBitmap().into(imageView) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsBitmap(target: ImageViewTarget<Bitmap>) { | 
				
			||||||
 | 
					            asBitmap().into(Target(target)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsGif(imageView: ImageView) { | 
				
			||||||
 | 
					            asGif().into(imageView) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsGif(target: ImageViewTarget<GifDrawable>) { | 
				
			||||||
 | 
					            asGif().into(Target(target)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsFile(imageView: ImageView) { | 
				
			||||||
 | 
					            asFile().into(imageView) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setAsFile(target: ImageViewTarget<File>) { | 
				
			||||||
 | 
					            asFile().into(Target(target)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fun asDrawable(): RequestBuilder<Drawable> { | 
				
			||||||
 | 
					            var builder: RequestBuilder<Drawable> = ensureOptions(manager.asDrawable().load(source)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (crossFade) { | 
				
			||||||
 | 
					                builder = builder.transition(DrawableTransitionOptions.withCrossFade()) | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return builder | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fun asBitmap(): RequestBuilder<Bitmap> { | 
				
			||||||
 | 
					            var builder: RequestBuilder<Bitmap> = ensureOptions(manager.asBitmap().load(source)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (crossFade) { | 
				
			||||||
 | 
					                builder = builder.transition(BitmapTransitionOptions.withCrossFade()) | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return builder | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fun asGif(): RequestBuilder<GifDrawable> { | 
				
			||||||
 | 
					            var builder: RequestBuilder<GifDrawable> = ensureOptions(manager.asGif().load(source)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (crossFade) { | 
				
			||||||
 | 
					                builder = builder.transition(DrawableTransitionOptions.withCrossFade()) | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return builder | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fun asFile(): RequestBuilder<File> { | 
				
			||||||
 | 
					            return manager.asFile().load(source) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private fun <ResourceType> ensureOptions(builder: RequestBuilder<ResourceType>): RequestBuilder<ResourceType> { | 
				
			||||||
 | 
					            return builder.apply(requestOptions.diskCacheStrategy(if (noCache) DiskCacheStrategy.NONE else DiskCacheStrategy.RESOURCE)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private inner class Target<R> constructor(private val target: ImageViewTarget<R>) : | 
				
			||||||
 | 
					            com.bumptech.glide.request.target.ImageViewTarget<R>(target.view) { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            init { | 
				
			||||||
 | 
					                if (this.target.waitForLayout) { | 
				
			||||||
 | 
					                    waitForLayout() | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            override fun onResourceReady(resource: R, transition: Transition<in R>?) { | 
				
			||||||
 | 
					                if (!target.onResourceReady(resource)) { | 
				
			||||||
 | 
					                    super.onResourceReady(resource, transition) | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            override fun setResource(resource: R?) { | 
				
			||||||
 | 
					                target.setResource(resource) | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    abstract class ImageViewTarget<R>(val view: ImageView) { | 
				
			||||||
 | 
					        internal var waitForLayout: Boolean = false | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun waitForLayout(): ImageViewTarget<R> { | 
				
			||||||
 | 
					            waitForLayout = true | 
				
			||||||
 | 
					            return this | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun setResource(resource: R?) { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun onResourceReady(resource: R?): Boolean { | 
				
			||||||
 | 
					            return false | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue