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