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