diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bf7a96103..bd5a5ec63 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -250,8 +250,6 @@ dependencies { implementation("io.ktor:ktor-io-jvm:$ktor") implementation("io.ktor:ktor-utils-jvm:$ktor") - implementation("org.chromium.net:cronet-embedded:113.5672.61") - val serialization = "1.5.1" implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:$serialization") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization") 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 6339b9857..4fe24db14 100644 --- a/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt +++ b/app/src/main/java/com/hippo/ehviewer/coil/CronetHttpUriFetcher.kt @@ -1,9 +1,12 @@ @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 @@ -27,7 +30,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) { - disableCache() + setCacheDisabled(true) }.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 cbe0d677a..8c4d3925b 100644 --- a/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt +++ b/app/src/main/java/com/hippo/ehviewer/cronet/CronetKt.kt @@ -1,5 +1,13 @@ +@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 @@ -12,10 +20,6 @@ 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 @@ -28,24 +32,23 @@ import kotlin.coroutines.resumeWithException private const val TAG = "CronetRequest" val pool = DirectByteBufferPool(32) -val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply { - enableBrotli(true) +val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply { + setEnableBrotli(true) val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() } setStoragePath(cache.absolutePath) - enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024) + setEnableHttpCache(HttpEngine.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() @@ -64,14 +67,18 @@ class CronetRequest { readerCont.resume(Unit) } - override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: CronetException) { + override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: HttpException) { 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, callback, cronetHttpClientExecutor).apply { + request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).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 368581798..eff6c5cb8 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) { - disableCache() + setCacheDisabled(true) }.execute { info -> - val headers = info.allHeaders + val headers = info.headers.asMap 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/CronetUtils.kt b/app/src/main/java/com/hippo/ehviewer/util/CronetUtils.kt index fa3a73c18..c45915fa0 100644 --- a/app/src/main/java/com/hippo/ehviewer/util/CronetUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/util/CronetUtils.kt @@ -1,4 +1,8 @@ package com.hippo.ehviewer.util +import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast + +@get:ChecksSdkIntAtLeast(Build.VERSION_CODES.S, extension = 7) val isCronetSupported: Boolean - get() = isAtLeastQ + get() = isAtLeastSExtension7 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 41e4f35ea..676312bb0 100644 --- a/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/util/SDKUtils.kt @@ -1,5 +1,8 @@ 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