parent
							
								
									8773c40645
								
							
						
					
					
						commit
						943a6401b5
					
				@ -0,0 +1,21 @@ | 
				
			|||||||
 | 
					package io.legado.app.help.glide | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Context | 
				
			||||||
 | 
					import com.bumptech.glide.Glide | 
				
			||||||
 | 
					import com.bumptech.glide.Registry | 
				
			||||||
 | 
					import com.bumptech.glide.annotation.GlideModule | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.GlideUrl | 
				
			||||||
 | 
					import com.bumptech.glide.module.AppGlideModule | 
				
			||||||
 | 
					import java.io.InputStream | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Suppress("unused") | 
				
			||||||
 | 
					@GlideModule | 
				
			||||||
 | 
					class OkHttpGlideModule : AppGlideModule() { | 
				
			||||||
 | 
					    override fun registerComponents(context: Context, glide: Glide, registry: Registry) { | 
				
			||||||
 | 
					        registry.replace( | 
				
			||||||
 | 
					            GlideUrl::class.java, | 
				
			||||||
 | 
					            InputStream::class.java, | 
				
			||||||
 | 
					            OkHttpModeLoaderFactory() | 
				
			||||||
 | 
					        ) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,21 @@ | 
				
			|||||||
 | 
					package io.legado.app.help.glide | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.GlideUrl | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.ModelLoader | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.ModelLoaderFactory | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.MultiModelLoaderFactory | 
				
			||||||
 | 
					import io.legado.app.help.http.okHttpClient | 
				
			||||||
 | 
					import java.io.InputStream | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OkHttpModeLoaderFactory : ModelLoaderFactory<GlideUrl?, InputStream?> { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<GlideUrl?, InputStream?> { | 
				
			||||||
 | 
					        return OkHttpModelLoader(okHttpClient) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun teardown() { | 
				
			||||||
 | 
					        // Do nothing, this instance doesn't own the client. | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,24 @@ | 
				
			|||||||
 | 
					package io.legado.app.help.glide | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.bumptech.glide.load.Options | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.GlideUrl | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.ModelLoader | 
				
			||||||
 | 
					import okhttp3.Call | 
				
			||||||
 | 
					import java.io.InputStream | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OkHttpModelLoader(private val client: Call.Factory) : ModelLoader<GlideUrl?, InputStream?> { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun buildLoadData( | 
				
			||||||
 | 
					        model: GlideUrl, | 
				
			||||||
 | 
					        width: Int, | 
				
			||||||
 | 
					        height: Int, | 
				
			||||||
 | 
					        options: Options | 
				
			||||||
 | 
					    ): ModelLoader.LoadData<InputStream?> { | 
				
			||||||
 | 
					        return ModelLoader.LoadData(model, OkHttpStreamFetcher(client, model)) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun handles(model: GlideUrl): Boolean { | 
				
			||||||
 | 
					        return true | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,72 @@ | 
				
			|||||||
 | 
					package io.legado.app.help.glide | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.bumptech.glide.Priority | 
				
			||||||
 | 
					import com.bumptech.glide.load.DataSource | 
				
			||||||
 | 
					import com.bumptech.glide.load.HttpException | 
				
			||||||
 | 
					import com.bumptech.glide.load.data.DataFetcher | 
				
			||||||
 | 
					import com.bumptech.glide.load.model.GlideUrl | 
				
			||||||
 | 
					import com.bumptech.glide.util.ContentLengthInputStream | 
				
			||||||
 | 
					import com.bumptech.glide.util.Preconditions | 
				
			||||||
 | 
					import okhttp3.Call | 
				
			||||||
 | 
					import okhttp3.Request | 
				
			||||||
 | 
					import okhttp3.Response | 
				
			||||||
 | 
					import okhttp3.ResponseBody | 
				
			||||||
 | 
					import java.io.IOException | 
				
			||||||
 | 
					import java.io.InputStream | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OkHttpStreamFetcher(private val client: Call.Factory, private val url: GlideUrl) : | 
				
			||||||
 | 
					    DataFetcher<InputStream>, okhttp3.Callback { | 
				
			||||||
 | 
					    private var stream: InputStream? = null | 
				
			||||||
 | 
					    private var responseBody: ResponseBody? = null | 
				
			||||||
 | 
					    private var callback: DataFetcher.DataCallback<in InputStream>? = null | 
				
			||||||
 | 
					    private var call: Call? = null | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in InputStream>) { | 
				
			||||||
 | 
					        val requestBuilder: Request.Builder = Request.Builder().url(url.toStringUrl()) | 
				
			||||||
 | 
					        for ((key, value) in url.headers.entries) { | 
				
			||||||
 | 
					            requestBuilder.addHeader(key, value) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        val request: Request = requestBuilder.build() | 
				
			||||||
 | 
					        this.callback = callback | 
				
			||||||
 | 
					        call = client.newCall(request) | 
				
			||||||
 | 
					        call?.enqueue(this) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun cleanup() { | 
				
			||||||
 | 
					        try { | 
				
			||||||
 | 
					            stream?.close() | 
				
			||||||
 | 
					        } catch (e: IOException) { | 
				
			||||||
 | 
					            // Ignored | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        responseBody?.close() | 
				
			||||||
 | 
					        callback = null | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun cancel() { | 
				
			||||||
 | 
					        call?.cancel() | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun getDataClass(): Class<InputStream> { | 
				
			||||||
 | 
					        return InputStream::class.java | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun getDataSource(): DataSource { | 
				
			||||||
 | 
					        return DataSource.REMOTE | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onFailure(call: Call, e: IOException) { | 
				
			||||||
 | 
					        callback?.onLoadFailed(e) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onResponse(call: Call, response: Response) { | 
				
			||||||
 | 
					        responseBody = response.body | 
				
			||||||
 | 
					        if (response.isSuccessful) { | 
				
			||||||
 | 
					            val contentLength: Long = Preconditions.checkNotNull(responseBody).contentLength() | 
				
			||||||
 | 
					            stream = ContentLengthInputStream.obtain(responseBody!!.byteStream(), contentLength) | 
				
			||||||
 | 
					            callback!!.onDataReady(stream) | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            callback!!.onLoadFailed(HttpException(response.message, response.code)) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue