diff --git a/app/build.gradle b/app/build.gradle
index abb03160b..36de1a7ce 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -187,6 +187,7 @@ dependencies {
final okhttp_version = '4.7.2'
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
+ implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttp_version"
implementation 'com.squareup.okio:okio:2.6.0'
// TLS 1.3 support for Android < 10
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
index 77b171336..b8e472e2f 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
@@ -161,6 +161,8 @@ object PreferenceKeys {
const val searchPinnedSourcesOnly = "search_pinned_sources_only"
+ const val enableDoh = "enable_doh"
+
fun trackUsername(syncId: Int) = "pref_mangasync_username_$syncId"
fun trackPassword(syncId: Int) = "pref_mangasync_password_$syncId"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
index 5471e2cc9..b5ff20ac2 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
@@ -240,6 +240,8 @@ class PreferencesHelper(val context: Context) {
fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet())
+ fun enableDoh() = prefs.getBoolean(Keys.enableDoh, false)
+
// --> AZ J2K CHERRYPICKING
fun defaultMangaOrder() = flowPrefs.getString("default_manga_order", "")
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 771a38de0..6e5f88ed7 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt
@@ -2,14 +2,21 @@ package eu.kanade.tachiyomi.network
import android.content.Context
import eu.kanade.tachiyomi.BuildConfig
+import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import java.io.File
+import java.net.InetAddress
import java.util.concurrent.TimeUnit
import okhttp3.Cache
+import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
+import okhttp3.dnsoverhttps.DnsOverHttps
import okhttp3.logging.HttpLoggingInterceptor
+import uy.kohesive.injekt.injectLazy
/* SY --> */ open /* SY <-- */ class NetworkHelper(context: Context) {
+ private val preferences: PreferencesHelper by injectLazy()
+
private val cacheDir = File(context.cacheDir, "network_cache")
private val cacheSize = 5L * 1024 * 1024 // 5 MiB
@@ -30,6 +37,27 @@ import okhttp3.logging.HttpLoggingInterceptor
builder.addInterceptor(httpLoggingInterceptor)
}
+ if (preferences.enableDoh()) {
+ builder.dns(
+ DnsOverHttps.Builder().client(builder.build())
+ .url("https://cloudflare-dns.com/dns-query".toHttpUrl())
+ .bootstrapDnsHosts(
+ listOf(
+ InetAddress.getByName("162.159.36.1"),
+ InetAddress.getByName("162.159.46.1"),
+ InetAddress.getByName("1.1.1.1"),
+ InetAddress.getByName("1.0.0.1"),
+ InetAddress.getByName("162.159.132.53"),
+ InetAddress.getByName("2606:4700:4700::1111"),
+ InetAddress.getByName("2606:4700:4700::1001"),
+ InetAddress.getByName("2606:4700:4700::0064"),
+ InetAddress.getByName("2606:4700:4700::6400")
+ )
+ )
+ .build()
+ )
+ }
+
builder.build()
}
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 d99c7b0bf..2f757dcb3 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
@@ -18,7 +18,7 @@ import eu.kanade.tachiyomi.data.cache.ChapterCache
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Target
-import eu.kanade.tachiyomi.data.preference.PreferenceKeys
+import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager.Companion.DELEGATED_SOURCES
import eu.kanade.tachiyomi.ui.base.controller.DialogController
@@ -97,14 +97,6 @@ class SettingsAdvancedController : SettingsController() {
onClick { clearChapterCache() }
}
- preference {
- titleRes = R.string.pref_clear_cookies
-
- onClick {
- network.cookieManager.removeAll()
- activity?.toast(R.string.cookies_cleared)
- }
- }
preference {
titleRes = R.string.pref_clear_database
summaryRes = R.string.pref_clear_database_summary
@@ -117,6 +109,25 @@ class SettingsAdvancedController : SettingsController() {
}
}
+ preferenceCategory {
+ titleRes = R.string.label_data
+
+ preference {
+ titleRes = R.string.pref_clear_cookies
+
+ onClick {
+ network.cookieManager.removeAll()
+ activity?.toast(R.string.cookies_cleared)
+ }
+ }
+ switchPreference {
+ key = Keys.enableDoh
+ titleRes = R.string.pref_dns_over_https
+ summaryRes = R.string.pref_dns_over_https_summary
+ defaultValue = false
+ }
+ }
+
preferenceCategory {
titleRes = R.string.label_library
@@ -141,7 +152,7 @@ class SettingsAdvancedController : SettingsController() {
switchPreference {
title = "Enable integrated hentai features"
summary = "This is a experimental feature that will disable all hentai features if toggled off"
- key = PreferenceKeys.eh_is_hentai_enabled
+ key = Keys.eh_is_hentai_enabled
defaultValue = true
onChange {
@@ -202,13 +213,13 @@ class SettingsAdvancedController : SettingsController() {
switchPreference {
title = "Enable delegated sources"
- key = PreferenceKeys.eh_delegateSources
+ key = Keys.eh_delegateSources
defaultValue = true
summary = "Apply ${context.getString(R.string.app_name)} enhancements to the following sources if they are installed: ${DELEGATED_SOURCES.values.map { it.sourceName }.distinct().joinToString()}"
}
intListPreference {
- key = PreferenceKeys.eh_logLevel
+ key = Keys.eh_logLevel
title = "Log level"
entries = EHLogLevel.values().map {
@@ -222,7 +233,7 @@ class SettingsAdvancedController : SettingsController() {
switchPreference {
title = "Enable source blacklist"
- key = PreferenceKeys.eh_enableSourceBlacklist
+ key = Keys.eh_enableSourceBlacklist
defaultValue = true
summary = "Hide extensions/sources that are incompatible with ${context.getString(R.string.app_name)}. Force-restart app after changing."
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bf3613f23..21b432a05 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -359,13 +359,16 @@
Canceled restore
+ Network
+ Clear cookies
+ DNS over HTTPS (Cloudflare)
+ Requires app restart to take effect
+ Cookies cleared
Data
Clear chapter cache
Used: %1$s
Cache cleared. %1$d files have been deleted
An error occurred while clearing cache
- Clear cookies
- Cookies cleared
Dialog choices reset
Clear database
Delete history for manga that are not saved in your library