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