diff --git a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt index 4fe24db14..6339b9857 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt @@ -1,12 +1,9 @@ @file:Suppress("BlockingMethodInNonBlockingContext") -@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7) package com.hippo.ehviewer.coil import android.net.Uri -import android.os.Build import android.webkit.MimeTypeMap -import androidx.annotation.RequiresExtension import coil.ComponentRegistry import coil.ImageLoader import coil.decode.DataSource @@ -30,7 +27,7 @@ class CronetHttpUriFetcher(private val data: String, private val options: Option val diskCache = requireNotNull(imageLoader.diskCache) val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run { val success = cronetRequest(data) { - setCacheDisabled(true) + disableCache() }.execute { diskCache.suspendEdit(diskCacheKey) { RandomAccessFile(data.toFile(), "rw").use { diff --git a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt index 8c4d3925b..cbe0d677a 100644 --- a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt @@ -1,13 +1,5 @@ -@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7) - package com.hippo.ehviewer.cronet -import android.net.http.HttpEngine -import android.net.http.HttpException -import android.net.http.UrlRequest -import android.net.http.UrlResponseInfo -import android.os.Build -import androidx.annotation.RequiresExtension import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.client.CHROME_ACCEPT import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE @@ -20,6 +12,10 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import okhttp3.HttpUrl.Companion.toHttpUrl import okio.Path.Companion.toOkioPath +import org.chromium.net.CronetEngine +import org.chromium.net.CronetException +import org.chromium.net.UrlRequest +import org.chromium.net.UrlResponseInfo import splitties.init.appCtx import java.nio.ByteBuffer import java.nio.channels.FileChannel @@ -32,23 +28,24 @@ import kotlin.coroutines.resumeWithException private const val TAG = "CronetRequest" val pool = DirectByteBufferPool(32) -val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply { - setEnableBrotli(true) +val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply { + enableBrotli(true) val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() } setStoragePath(cache.absolutePath) - setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024) + enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024) setUserAgent(CHROME_USER_AGENT) }.build() val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService +// TODO: Rewrite this to use android.net.http.HttpEngine and make it Android 14 only when released class CronetRequest { lateinit var consumer: (ByteBuffer) -> Unit lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit lateinit var request: UrlRequest lateinit var onError: (Throwable) -> Unit lateinit var readerCont: Continuation - val callback = object : UrlRequest.Callback { + val callback = object : UrlRequest.Callback() { override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) { logcat(tag = TAG) { "Redirected to $url" } req.followRedirect() @@ -67,18 +64,14 @@ class CronetRequest { readerCont.resume(Unit) } - override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: HttpException) { + override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: CronetException) { onError(e) } - - override fun onCanceled(req: UrlRequest, info: UrlResponseInfo?) { - // No-op - } } } inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest.Builder.() -> Unit = {}) = CronetRequest().apply { - request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply { + request = cronetHttpClient.newUrlRequestBuilder(url, callback, cronetHttpClientExecutor).apply { addHeader("Cookie", EhCookieStore.getCookieHeader(url.toHttpUrl())) addHeader("Accept", CHROME_ACCEPT) addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index eff6c5cb8..368581798 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -135,9 +135,9 @@ class SpiderDen(mGalleryInfo: GalleryInfo) { ): Boolean { return if (isCronetSupported) { cronetRequest(url, referer) { - setCacheDisabled(true) + disableCache() }.execute { info -> - val headers = info.headers.asMap + val headers = info.allHeaders val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg" val length = headers["Content-Length"]!!.first().toLong() saveResponseMeta(index, type, length) { file -> diff --git a/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt b/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt index 676312bb0..41e4f35ea 100644 --- a/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt @@ -1,8 +1,5 @@ package com.hippo.ehviewer.util import android.os.Build -import android.os.ext.SdkExtensions val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -val isAtLeastR = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -val isAtLeastSExtension7 = isAtLeastR && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7