diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d255055af2..c3acefae15 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -29,7 +29,7 @@ android { minSdkVersion(AndroidConfig.minSdk) targetSdkVersion(AndroidConfig.targetSdk) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - versionCode = 56 + versionCode = 57 versionName = "0.10.9" buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index f413f34a6c..d3d929b43d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.updater.UpdaterJob import eu.kanade.tachiyomi.extension.ExtensionUpdateJob +import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE import eu.kanade.tachiyomi.ui.library.LibrarySort import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.widget.ExtendedNavigationView @@ -127,6 +128,17 @@ object Migrations { context.toast(R.string.myanimelist_relogin) } } + if (oldVersion < 57) { + // Migrate DNS over HTTPS setting + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val wasDohEnabled = prefs.getBoolean("enable_doh", false) + if (wasDohEnabled) { + prefs.edit { + putInt(PreferenceKeys.dohProvider, PREF_DOH_CLOUDFLARE) + remove("enable_doh") + } + } + } return true } 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 9069ab6acc..9ef69e07ba 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -191,7 +191,7 @@ object PreferenceKeys { const val searchPinnedSourcesOnly = "search_pinned_sources_only" - const val enableDoh = "enable_doh" + const val dohProvider = "doh_provider" const val defaultChapterFilterByRead = "default_chapter_filter_by_read" 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 7415f019c9..0768487ba1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -279,7 +279,7 @@ class PreferencesHelper(val context: Context) { fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet()) - fun enableDoh() = prefs.getBoolean(Keys.enableDoh, false) + fun dohProvider() = prefs.getInt(Keys.dohProvider, -1) fun lastSearchQuerySearchSettings() = flowPrefs.getString("last_search_query", "") diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/DohProviders.kt b/app/src/main/java/eu/kanade/tachiyomi/network/DohProviders.kt new file mode 100644 index 0000000000..982910f529 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/network/DohProviders.kt @@ -0,0 +1,40 @@ +package eu.kanade.tachiyomi.network + +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.dnsoverhttps.DnsOverHttps +import java.net.InetAddress + +/** + * Based on https://github.com/square/okhttp/blob/ef5d0c83f7bbd3a0c0534e7ca23cbc4ee7550f3b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DohProviders.java + */ + +const val PREF_DOH_CLOUDFLARE = 1 +const val PREF_DOH_GOOGLE = 2 + +fun OkHttpClient.Builder.dohCloudflare() = dns( + DnsOverHttps.Builder().client(build()) + .url("https://cloudflare-dns.com/dns-query".toHttpUrl()) + .bootstrapDnsHosts( + 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() +) + +fun OkHttpClient.Builder.dohGoogle() = dns( + DnsOverHttps.Builder().client(build()) + .url("https://dns.google/dns-query".toHttpUrl()) + .bootstrapDnsHosts( + InetAddress.getByName("8.8.4.4"), + InetAddress.getByName("8.8.8.8") + ) + .build() +) 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 0f31ee10b6..4b729fdeaf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -4,13 +4,10 @@ import android.content.Context import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.preference.PreferencesHelper import okhttp3.Cache -import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient -import okhttp3.dnsoverhttps.DnsOverHttps import okhttp3.logging.HttpLoggingInterceptor import uy.kohesive.injekt.injectLazy import java.io.File -import java.net.InetAddress import java.util.concurrent.TimeUnit class NetworkHelper(context: Context) { @@ -38,25 +35,9 @@ class NetworkHelper(context: Context) { 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() - ) + when (preferences.dohProvider()) { + PREF_DOH_CLOUDFLARE -> builder.dohCloudflare() + PREF_DOH_GOOGLE -> builder.dohGoogle() } 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 636e3faa60..3012b447bc 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 @@ -17,9 +17,13 @@ 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.network.NetworkHelper +import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE +import eu.kanade.tachiyomi.network.PREF_DOH_GOOGLE import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.preference.defaultValue +import eu.kanade.tachiyomi.util.preference.intListPreference +import eu.kanade.tachiyomi.util.preference.onChange import eu.kanade.tachiyomi.util.preference.onClick import eu.kanade.tachiyomi.util.preference.preference import eu.kanade.tachiyomi.util.preference.preferenceCategory @@ -124,11 +128,26 @@ class SettingsAdvancedController : SettingsController() { activity?.toast(R.string.cookies_cleared) } } - switchPreference { - key = Keys.enableDoh + intListPreference { + key = Keys.dohProvider titleRes = R.string.pref_dns_over_https - summaryRes = R.string.requires_app_restart - defaultValue = false + entries = arrayOf( + context.getString(R.string.disabled), + "Cloudflare", + "Google", + ) + entryValues = arrayOf( + "-1", + PREF_DOH_CLOUDFLARE.toString(), + PREF_DOH_GOOGLE.toString(), + ) + defaultValue = "-1" + summary = "%s" + + onChange { + activity?.toast(R.string.requires_app_restart) + true + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 121d455da1..b3d3f8d6aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -417,7 +417,7 @@ Network Clear cookies - DNS over HTTPS (Cloudflare) + DNS over HTTPS Requires app restart to take effect Cookies cleared Data