diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 53f8f55b3..f6e2c0f03 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -248,6 +248,8 @@ dependencies { implementation("io.ktor:ktor-io-jvm:$ktor") implementation("io.ktor:ktor-utils-jvm:$ktor") + implementation("org.chromium.net:cronet-embedded:113.5672.61") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.5.1") implementation("org.jsoup:jsoup:1.16.1") diff --git a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt index 6be90c308..aa8a8ed96 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt @@ -1,18 +1,14 @@ -@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7) - package com.hippo.ehviewer.spider -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 io.ktor.utils.io.pool.DirectByteBufferPool import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine +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 kotlin.coroutines.Continuation @@ -21,11 +17,11 @@ import kotlin.coroutines.resumeWithException private val pool = DirectByteBufferPool(32) -val cronetHttpClient = HttpEngine.Builder(appCtx).apply { - setEnableHttp2(true) - setEnableBrotli(true) - setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISABLED, 0) - setEnableQuic(true) +val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply { + enableHttp2(true) + enableBrotli(true) + enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISABLED, 0) + enableQuic(true) }.build() val cronetHttpClientExecutor = EhApplication.nonCacheOkHttpClient.dispatcher.executorService @@ -36,7 +32,7 @@ class CronetRequest { lateinit var request: UrlRequest lateinit var daemonCont: Continuation lateinit var readerCont: Continuation - val callback = object : UrlRequest.Callback { + val callback = object : UrlRequest.Callback() { override fun onRedirectReceived(p0: UrlRequest, p1: UrlResponseInfo, p2: String) { // No-op } @@ -58,7 +54,7 @@ class CronetRequest { daemonCont.resume(true) } - override fun onFailed(p0: UrlRequest, p1: UrlResponseInfo?, p2: HttpException) { + override fun onFailed(p0: UrlRequest, p1: UrlResponseInfo?, p2: CronetException) { daemonCont.resumeWithException(p2) } @@ -72,7 +68,7 @@ class CronetRequest { } inline fun cronetRequest(url: String, conf: UrlRequest.Builder.() -> Unit) = CronetRequest().apply { - request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply(conf).build() + request = cronetHttpClient.newUrlRequestBuilder(url, callback, cronetHttpClientExecutor).apply(conf).build() } suspend infix fun CronetRequest.consumeBodyFully(callback: (UrlResponseInfo, ByteBuffer) -> Unit) = run { 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 0adf570be..26de9c6b8 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -19,7 +19,6 @@ import android.graphics.ImageDecoder import android.os.Build import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor.MODE_READ_WRITE -import android.os.ext.SdkExtensions import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.client.EhUtils.getSuitableTitle import com.hippo.ehviewer.client.data.GalleryInfo @@ -132,13 +131,13 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { referer: String?, notifyProgress: (Long, Long, Int) -> Unit, ): Boolean { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7) { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val req = cronetRequest(url) { referer?.let { addHeader("Referer", it) } } try { req 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 ->