diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index cf7268e4c1..2538ef660a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -22,15 +22,17 @@ class NetworkHelper(val context: Context) { private val cacheSize = 5L * 1024 * 1024 // 5 MiB - val cookieManager = AndroidCookieJar() + val cookieJar = AndroidCookieJar() - private val userAgentInterceptor by lazy { UserAgentInterceptor() } - private val cloudflareInterceptor by lazy { CloudflareInterceptor(context) } + private val userAgentInterceptor by lazy { UserAgentInterceptor(::defaultUserAgent) } + private val cloudflareInterceptor by lazy { + CloudflareInterceptor(context, cookieJar, ::defaultUserAgent) + } private val baseClientBuilder: OkHttpClient.Builder get() { val builder = OkHttpClient.Builder() - .cookieJar(cookieManager) + .cookieJar(cookieJar) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .callTimeout(2, TimeUnit.MINUTES) @@ -68,9 +70,8 @@ class NetworkHelper(val context: Context) { .build() } - val defaultUserAgent by lazy { - preferences.defaultUserAgent().get().replace("\n", " ").trim() - } + val defaultUserAgent + get() = preferences.defaultUserAgent().get().replace("\n", " ").trim() companion object { const val DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0" diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt index 440a3b71e9..875bbc2c73 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt @@ -6,7 +6,7 @@ import android.webkit.WebView import android.widget.Toast import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.network.NetworkHelper +import eu.kanade.tachiyomi.network.AndroidCookieJar import eu.kanade.tachiyomi.util.system.WebViewClientCompat import eu.kanade.tachiyomi.util.system.isOutdated import eu.kanade.tachiyomi.util.system.toast @@ -15,26 +15,31 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response -import uy.kohesive.injekt.injectLazy import java.io.IOException import java.util.concurrent.CountDownLatch -class CloudflareInterceptor(private val context: Context) : WebViewInterceptor(context) { +class CloudflareInterceptor( + private val context: Context, + private val cookieManager: AndroidCookieJar, + defaultUserAgentProvider: () -> String, +) : WebViewInterceptor(context, defaultUserAgentProvider) { private val executor = ContextCompat.getMainExecutor(context) - private val networkHelper: NetworkHelper by injectLazy() - override fun shouldIntercept(response: Response): Boolean { // Check if Cloudflare anti-bot is on return response.code in ERROR_CODES && response.header("Server") in SERVER_CHECK } - override fun intercept(chain: Interceptor.Chain, request: Request, response: Response): Response { + override fun intercept( + chain: Interceptor.Chain, + request: Request, + response: Response, + ): Response { try { response.close() - networkHelper.cookieManager.remove(request.url, COOKIE_NAMES, 0) - val oldCookie = networkHelper.cookieManager.get(request.url) + cookieManager.remove(request.url, COOKIE_NAMES, 0) + val oldCookie = cookieManager.get(request.url) .firstOrNull { it.name == "cf_clearance" } resolveWithWebView(request, oldCookie) @@ -70,7 +75,7 @@ class CloudflareInterceptor(private val context: Context) : WebViewInterceptor(c webView?.webViewClient = object : WebViewClientCompat() { override fun onPageFinished(view: WebView, url: String) { fun isCloudFlareBypassed(): Boolean { - return networkHelper.cookieManager.get(origRequestUrl.toHttpUrl()) + return cookieManager.get(origRequestUrl.toHttpUrl()) .firstOrNull { it.name == "cf_clearance" } .let { it != null && it != oldCookie } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt index 4320e2020f..b085ece3c1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt @@ -1,12 +1,11 @@ package eu.kanade.tachiyomi.network.interceptor -import eu.kanade.tachiyomi.network.NetworkHelper import okhttp3.Interceptor import okhttp3.Response -import uy.kohesive.injekt.injectLazy -class UserAgentInterceptor : Interceptor { - private val networkHelper: NetworkHelper by injectLazy() +class UserAgentInterceptor( + private val defaultUserAgentProvider: () -> String, +) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() @@ -15,7 +14,7 @@ class UserAgentInterceptor : Interceptor { val newRequest = originalRequest .newBuilder() .removeHeader("User-Agent") - .addHeader("User-Agent", networkHelper.defaultUserAgent) + .addHeader("User-Agent", defaultUserAgentProvider()) .build() chain.proceed(newRequest) } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt index 1e5f9dad45..261db612ef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt @@ -6,7 +6,6 @@ import android.webkit.WebSettings import android.webkit.WebView import android.widget.Toast import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.launchUI @@ -16,14 +15,15 @@ import okhttp3.Headers import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response -import uy.kohesive.injekt.injectLazy +import timber.log.Timber import java.util.Locale import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -abstract class WebViewInterceptor(private val context: Context) : Interceptor { - - private val networkHelper: NetworkHelper by injectLazy() +abstract class WebViewInterceptor( + private val context: Context, + private val defaultUserAgentProvider: () -> String, +) : Interceptor { /** * When this is called, it initializes the WebView if it wasn't already. We use this to avoid @@ -85,7 +85,8 @@ abstract class WebViewInterceptor(private val context: Context) : Interceptor { return WebView(context).apply { setDefaultSettings() // Avoid sending empty User-Agent, Chromium WebView will reset to default if empty - settings.userAgentString = request.header("User-Agent") ?: networkHelper.defaultUserAgent + Timber.d("User agent: ${defaultUserAgentProvider()}") + settings.userAgentString = request.header("User-Agent") ?: defaultUserAgentProvider() } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt index 1211734da9..c81ba60de6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt @@ -219,7 +219,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : ?.distinct() ?: emptyList() val cleared = urls.sumOf { - network.cookieManager.remove(it.toHttpUrl()) + network.cookieJar.remove(it.toHttpUrl()) } Timber.d("Cleared $cleared cookies for: ${urls.joinToString()}") diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt index 34581a5dee..8ccb0d1a19 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt @@ -272,7 +272,7 @@ class SettingsAdvancedController : SettingsController() { titleRes = R.string.clear_cookies onClick { - network.cookieManager.removeAll() + network.cookieJar.removeAll() activity?.toast(R.string.cookies_cleared) } } @@ -321,7 +321,6 @@ class SettingsAdvancedController : SettingsController() { context.toast(R.string.error_user_agent_string_invalid) return@onChange false } - activity?.toast(R.string.requires_app_restart) true } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/EditTextResetPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/EditTextResetPreference.kt index 878b9846b2..1892b69712 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/EditTextResetPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/EditTextResetPreference.kt @@ -24,6 +24,11 @@ class EditTextResetPreference @JvmOverloads constructor( defValue = defaultValue as? String ?: defValue } + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + defValue = defaultValue as? String ?: defValue + } + override var customSummaryProvider: SummaryProvider? = SummaryProvider { sharedPreferences?.getString(key, defValue) }