diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt index b95943cf5..ea77fbaee 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt @@ -44,7 +44,6 @@ import com.ehviewer.core.ui.util.initSETConnection import com.ehviewer.core.util.isAtLeastO import com.ehviewer.core.util.isAtLeastP import com.ehviewer.core.util.isAtLeastS -import com.ehviewer.core.util.isAtLeastSExtension7 import com.ehviewer.core.util.launchIO import com.ehviewer.core.util.logcat import com.ehviewer.core.util.withUIContext @@ -65,6 +64,7 @@ import com.hippo.ehviewer.ktbuilder.imageLoader import com.hippo.ehviewer.ktor.Cronet import com.hippo.ehviewer.ktor.configureClient import com.hippo.ehviewer.ktor.configureCommon +import com.hippo.ehviewer.ktor.isCronetAvailable import com.hippo.ehviewer.ui.keepNoMediaFileStatus import com.hippo.ehviewer.ui.lockObserver import com.hippo.ehviewer.ui.screen.detailCache @@ -218,7 +218,7 @@ class EhApplication : Application(), SingletonImageLoader.Factory { private set val ktorClient by lazy { - if (isAtLeastSExtension7 && Settings.enableCronet.value) { + if (isCronetAvailable && Settings.enableCronet.value) { HttpClient(Cronet) { engine { configureClient(Settings.enableQuic.value) } configureCommon() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetEngine.kt b/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetEngine.kt index 3f925d8e0..6feccaea2 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetEngine.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetEngine.kt @@ -10,9 +10,6 @@ import android.net.http.UrlRequest import android.net.http.UrlResponseInfo import android.os.Build import androidx.annotation.RequiresExtension -import com.ehviewer.core.preferences.edit -import com.hippo.ehviewer.Settings -import com.hippo.ehviewer.util.restartApplication import io.ktor.client.engine.HttpClientEngineBase import io.ktor.client.engine.callContext import io.ktor.client.plugins.HttpTimeoutCapability @@ -103,15 +100,6 @@ class CronetEngine(override val config: CronetConfig) : HttpClientEngineBase("Cr } override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: HttpException) { - // Cronet may crash on some devices, fuck xiaomi - // https://github.com/FooIbar/EhViewer/issues/1826 - val message = error.message.orEmpty() - if ("ERR_FILE_NOT_FOUND" in message || "ERR_PROXY_CONNECTION_FAILED" in message) { - Settings.edit(true) { - it[enableCronet] = false - } - with(config.context) { restartApplication() } - } if (continuation.isActive) { continuation.resumeWithException(error) } else { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetExtensions.kt b/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetExtensions.kt index c451b1bd3..0222b6c7c 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetExtensions.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ktor/CronetExtensions.kt @@ -1,12 +1,12 @@ -@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7) - package com.hippo.ehviewer.ktor import android.net.http.HttpEngine import android.os.Build import androidx.annotation.RequiresExtension +import com.ehviewer.core.util.isAtLeastSExtension7 import java.io.File +@RequiresExtension(extension = Build.VERSION_CODES.S, version = 7) fun CronetConfig.configureClient(enableQuic: Boolean) { config = { setEnableBrotli(true) @@ -24,3 +24,14 @@ fun CronetConfig.configureClient(enableQuic: Boolean) { } } } + +val isCronetAvailable: Boolean + get() = isAtLeastSExtension7 && !isDeviceBlocked + +// https://github.com/FooIbar/EhViewer/issues/1826 +private val isDeviceBlocked = when (Build.VERSION.INCREMENTAL.substringBefore('.')) { + "V816", // HyperOS 1 + "OS2", // HyperOS 2 + -> true + else -> false +} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index 185cf8e56..0ef636527 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -35,7 +35,6 @@ import com.ehviewer.core.files.sendTo import com.ehviewer.core.files.toOkioPath import com.ehviewer.core.i18n.R import com.ehviewer.core.util.isAtLeastO -import com.ehviewer.core.util.isAtLeastSExtension7 import com.ehviewer.core.util.launch import com.ehviewer.core.util.logcat import com.ehviewer.core.util.withIOContext @@ -46,6 +45,7 @@ import com.hippo.ehviewer.asMutableState import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.data.FavListUrlBuilder import com.hippo.ehviewer.collectAsState +import com.hippo.ehviewer.ktor.isCronetAvailable import com.hippo.ehviewer.ui.Screen import com.hippo.ehviewer.ui.main.NavigationIcon import com.hippo.ehviewer.ui.showRestartDialog @@ -185,7 +185,7 @@ fun AnimatedVisibilityScope.AdvancedScreen(navigator: DestinationsNavigator) = S title = { Text(stringResource(id = R.string.settings_advanced_app_language_title)) }, summary = { Text(languages[currentLanguage].orEmpty()) }, ) - if (isAtLeastSExtension7) { + if (isCronetAvailable) { val enableCronet = Settings.enableCronet.asMutableState() if (BuildConfig.DEBUG || !enableCronet.value) { SwitchPreference(