From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tad Date: Mon, 24 Jun 2019 21:27:26 +0530 Subject: [PATCH] Add more 'Private DNS' options This adds fifteen DNS providers as available presets. Credit: CalyxOS - Chirayu Desai https://review.calyxos.org/c/CalyxOS/platform_packages_apps_Settings/+/17176 Change-Id: I7e8a320d47e7c5ddbcb9acfaf23032ae92d5d70d --- res/layout/private_dns_mode_dialog.xml | 60 ++++++ res/values/cm_strings.xml | 46 +++++ .../PrivateDnsModeDialogPreference.java | 192 +++++++++++++++++- .../PrivateDnsPreferenceController.java | 40 +++- 4 files changed, 333 insertions(+), 5 deletions(-) diff --git a/res/layout/private_dns_mode_dialog.xml b/res/layout/private_dns_mode_dialog.xml index 12e29e693b..b264bef20a 100644 --- a/res/layout/private_dns_mode_dialog.xml +++ b/res/layout/private_dns_mode_dialog.xml @@ -35,6 +35,66 @@ android:id="@+id/private_dns_mode_off" layout="@layout/preference_widget_dialog_radiobutton"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index d9ca157167..73c78cc87e 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -15,6 +15,52 @@ limitations under the License. --> + + AdGuard (CT) + dns.adguard.com + + AppliedPrivacy (AT) + dot1.applied-privacy.net + + CIRA (CA) + protected.canadianshield.cira.ca + + CleanBrowsing (US) + security-filter-dns.cleanbrowsing.org + + Cloudflare (US) + security.cloudflare-dns.com + + Control D (CA) + p2.freedns.controld.com + + CZ.NIC (CZ) + odvr.nic.cz + + DNS0 (FR) + zero.dns0.eu + + DNS.SB (DE) + dot.sb + + Google (US) + dns.google + + Mullvad (SE) + adblock.dns.mullvad.net + + Quad9 (CH) + dns.quad9.net + + Restena (LU) + kaitain.restena.lu + + SWITCH (CH) + dns.switch.ch + + UncensoredDNS (DK) + anycast.censurfridns.dk + Extras Advanced settings diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java index 5c7c54eda3..4656b73df5 100644 --- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java +++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java @@ -72,9 +72,41 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat // DNS_MODE -> RadioButton id private static final Map PRIVATE_DNS_MAP; + // Only used in Settings + private static final int PRIVATE_DNS_MODE_ADGUARD = 4; + private static final int PRIVATE_DNS_MODE_APPLIEDPRIVACY = 5; + private static final int PRIVATE_DNS_MODE_CIRA = 6; + private static final int PRIVATE_DNS_MODE_CLEANBROWSING = 7; + private static final int PRIVATE_DNS_MODE_CLOUDFLARE = 8; + private static final int PRIVATE_DNS_MODE_CONTROLD = 9; + private static final int PRIVATE_DNS_MODE_CZNIC = 10; + private static final int PRIVATE_DNS_MODE_DNSZERO = 11; + private static final int PRIVATE_DNS_MODE_GOOGLE = 12; + private static final int PRIVATE_DNS_MODE_MULLVAD = 13; + private static final int PRIVATE_DNS_MODE_QUADNINE = 14; + private static final int PRIVATE_DNS_MODE_RESTENA = 15; + private static final int PRIVATE_DNS_MODE_SWITCH = 16; + private static final int PRIVATE_DNS_MODE_UNCENSOREDDNS = 17; + private static final int PRIVATE_DNS_MODE_DNSSB = 18; + static { PRIVATE_DNS_MAP = new HashMap<>(); PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_OFF, R.id.private_dns_mode_off); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_ADGUARD, R.id.private_dns_mode_adguard); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_APPLIEDPRIVACY, R.id.private_dns_mode_appliedprivacy); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CIRA, R.id.private_dns_mode_cira); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CLEANBROWSING, R.id.private_dns_mode_cleanbrowsing); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CLOUDFLARE, R.id.private_dns_mode_cloudflare); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CONTROLD, R.id.private_dns_mode_controld); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CZNIC, R.id.private_dns_mode_cznic); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_DNSZERO, R.id.private_dns_mode_dnszero); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_DNSSB, R.id.private_dns_mode_dnssb); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_GOOGLE, R.id.private_dns_mode_google); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_MULLVAD, R.id.private_dns_mode_mullvad); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_QUADNINE, R.id.private_dns_mode_quadnine); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_RESTENA, R.id.private_dns_mode_restena); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_SWITCH, R.id.private_dns_mode_switch); + PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_UNCENSOREDDNS, R.id.private_dns_mode_uncensoreddns); PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_OPPORTUNISTIC, R.id.private_dns_mode_opportunistic); PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, R.id.private_dns_mode_provider); } @@ -144,6 +176,41 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat final ContentResolver contentResolver = context.getContentResolver(); mMode = ConnectivitySettingsManager.getPrivateDnsMode(context); + if (mMode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME) { + final String privateDnsHostname = + ConnectivitySettingsManager.getPrivateDnsHostname(context); + if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_adguard))) { + mMode = PRIVATE_DNS_MODE_ADGUARD; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_appliedprivacy))) { + mMode = PRIVATE_DNS_MODE_APPLIEDPRIVACY; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_cira))) { + mMode = PRIVATE_DNS_MODE_CIRA; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_cleanbrowsing))) { + mMode = PRIVATE_DNS_MODE_CLEANBROWSING; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_cloudflare))) { + mMode = PRIVATE_DNS_MODE_CLOUDFLARE; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_controld))) { + mMode = PRIVATE_DNS_MODE_CONTROLD; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_cznic))) { + mMode = PRIVATE_DNS_MODE_CZNIC; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_dnszero))) { + mMode = PRIVATE_DNS_MODE_DNSZERO; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_dnssb))) { + mMode = PRIVATE_DNS_MODE_DNSSB; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_google))) { + mMode = PRIVATE_DNS_MODE_GOOGLE; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_mullvad))) { + mMode = PRIVATE_DNS_MODE_MULLVAD; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_quadnine))) { + mMode = PRIVATE_DNS_MODE_QUADNINE; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_restena))) { + mMode = PRIVATE_DNS_MODE_RESTENA; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_switch))) { + mMode = PRIVATE_DNS_MODE_SWITCH; + } else if (privateDnsHostname.equals(context.getString(R.string.private_dns_hostname_uncensoreddns))) { + mMode = PRIVATE_DNS_MODE_UNCENSOREDDNS; + } + } mEditText = view.findViewById(R.id.private_dns_mode_provider_hostname); mEditText.addTextChangedListener(this); @@ -156,6 +223,51 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat // Initial radio button text final RadioButton offRadioButton = view.findViewById(R.id.private_dns_mode_off); offRadioButton.setText(R.string.private_dns_mode_off); + final RadioButton adguardRadioButton = + view.findViewById(R.id.private_dns_mode_adguard); + adguardRadioButton.setText(R.string.private_dns_mode_adguard); + final RadioButton appliedprivacyRadioButton = + view.findViewById(R.id.private_dns_mode_appliedprivacy); + appliedprivacyRadioButton.setText(R.string.private_dns_mode_appliedprivacy); + final RadioButton ciraRadioButton = + view.findViewById(R.id.private_dns_mode_cira); + ciraRadioButton.setText(R.string.private_dns_mode_cira); + final RadioButton cleanbrowsingRadioButton = + view.findViewById(R.id.private_dns_mode_cleanbrowsing); + cleanbrowsingRadioButton.setText(R.string.private_dns_mode_cleanbrowsing); + final RadioButton cloudflareRadioButton = + view.findViewById(R.id.private_dns_mode_cloudflare); + cloudflareRadioButton.setText(R.string.private_dns_mode_cloudflare); + final RadioButton controldRadioButton = + view.findViewById(R.id.private_dns_mode_controld); + controldRadioButton.setText(R.string.private_dns_mode_controld); + final RadioButton cznicRadioButton = + view.findViewById(R.id.private_dns_mode_cznic); + cznicRadioButton.setText(R.string.private_dns_mode_cznic); + final RadioButton dnszeroRadioButton = + view.findViewById(R.id.private_dns_mode_dnszero); + dnszeroRadioButton.setText(R.string.private_dns_mode_dnszero); + final RadioButton dnssbRadioButton = + view.findViewById(R.id.private_dns_mode_dnssb); + dnssbRadioButton.setText(R.string.private_dns_mode_dnssb); + final RadioButton googleRadioButton = + view.findViewById(R.id.private_dns_mode_google); + googleRadioButton.setText(R.string.private_dns_mode_google); + final RadioButton mullvadRadioButton = + view.findViewById(R.id.private_dns_mode_mullvad); + mullvadRadioButton.setText(R.string.private_dns_mode_mullvad); + final RadioButton quadnineRadioButton = + view.findViewById(R.id.private_dns_mode_quadnine); + quadnineRadioButton.setText(R.string.private_dns_mode_quadnine); + final RadioButton restenaRadioButton = + view.findViewById(R.id.private_dns_mode_restena); + restenaRadioButton.setText(R.string.private_dns_mode_restena); + final RadioButton switchRadioButton = + view.findViewById(R.id.private_dns_mode_switch); + switchRadioButton.setText(R.string.private_dns_mode_switch); + final RadioButton uncensoreddnsRadioButton = + view.findViewById(R.id.private_dns_mode_uncensoreddns); + uncensoreddnsRadioButton.setText(R.string.private_dns_mode_uncensoreddns); final RadioButton opportunisticRadioButton = view.findViewById(R.id.private_dns_mode_opportunistic); opportunisticRadioButton.setText(R.string.private_dns_mode_opportunistic); @@ -181,15 +293,61 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { final Context context = getContext(); + int modeToSet = mMode; if (mMode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME) { // Only clickable if hostname is valid, so we could save it safely ConnectivitySettingsManager.setPrivateDnsHostname(context, mEditText.getText().toString()); + } else if (mMode == PRIVATE_DNS_MODE_ADGUARD) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_adguard)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_APPLIEDPRIVACY) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_appliedprivacy)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_CIRA) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_cira)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_CLEANBROWSING) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_cleanbrowsing)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_CLOUDFLARE) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_cloudflare)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_CONTROLD) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_controld)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_CZNIC) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_cznic)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_DNSZERO) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_dnszero)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_DNSSB) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_dnssb)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_GOOGLE) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_google)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_MULLVAD) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_mullvad)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_QUADNINE) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_quadnine)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_RESTENA) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_restena)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_SWITCH) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_switch)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; + } else if (mMode == PRIVATE_DNS_MODE_UNCENSOREDDNS) { + ConnectivitySettingsManager.setPrivateDnsHostname(context, context.getString(R.string.private_dns_hostname_uncensoreddns)); + modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; } FeatureFactory.getFactory(context).getMetricsFeatureProvider().action(context, - SettingsEnums.ACTION_PRIVATE_DNS_MODE, mMode); - ConnectivitySettingsManager.setPrivateDnsMode(context, mMode); + SettingsEnums.ACTION_PRIVATE_DNS_MODE, modeToSet); + ConnectivitySettingsManager.setPrivateDnsMode(context, modeToSet); } } @@ -197,6 +355,36 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.private_dns_mode_off) { mMode = PRIVATE_DNS_MODE_OFF; + } else if (checkedId == R.id.private_dns_mode_adguard) { + mMode = PRIVATE_DNS_MODE_ADGUARD; + } else if (checkedId == R.id.private_dns_mode_appliedprivacy) { + mMode = PRIVATE_DNS_MODE_APPLIEDPRIVACY; + } else if (checkedId == R.id.private_dns_mode_cira) { + mMode = PRIVATE_DNS_MODE_CIRA; + } else if (checkedId == R.id.private_dns_mode_cleanbrowsing) { + mMode = PRIVATE_DNS_MODE_CLEANBROWSING; + } else if (checkedId == R.id.private_dns_mode_cloudflare) { + mMode = PRIVATE_DNS_MODE_CLOUDFLARE; + } else if (checkedId == R.id.private_dns_mode_controld) { + mMode = PRIVATE_DNS_MODE_CONTROLD; + } else if (checkedId == R.id.private_dns_mode_cznic) { + mMode = PRIVATE_DNS_MODE_CZNIC; + } else if (checkedId == R.id.private_dns_mode_dnszero) { + mMode = PRIVATE_DNS_MODE_DNSZERO; + } else if (checkedId == R.id.private_dns_mode_dnssb) { + mMode = PRIVATE_DNS_MODE_DNSSB; + } else if (checkedId == R.id.private_dns_mode_google) { + mMode = PRIVATE_DNS_MODE_GOOGLE; + } else if (checkedId == R.id.private_dns_mode_mullvad) { + mMode = PRIVATE_DNS_MODE_MULLVAD; + } else if (checkedId == R.id.private_dns_mode_quadnine) { + mMode = PRIVATE_DNS_MODE_QUADNINE; + } else if (checkedId == R.id.private_dns_mode_restena) { + mMode = PRIVATE_DNS_MODE_RESTENA; + } else if (checkedId == R.id.private_dns_mode_switch) { + mMode = PRIVATE_DNS_MODE_SWITCH; + } else if (checkedId == R.id.private_dns_mode_uncensoreddns) { + mMode = PRIVATE_DNS_MODE_UNCENSOREDDNS; } else if (checkedId == R.id.private_dns_mode_opportunistic) { mMode = PRIVATE_DNS_MODE_OPPORTUNISTIC; } else if (checkedId == R.id.private_dns_mode_provider) { diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java index 42974be8e0..7b9dd3d36f 100644 --- a/src/com/android/settings/network/PrivateDnsPreferenceController.java +++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java @@ -133,9 +133,43 @@ public class PrivateDnsPreferenceController extends BasePreferenceController return dnsesResolved ? res.getString(R.string.private_dns_mode_on) : res.getString(R.string.private_dns_mode_opportunistic); case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME: - return dnsesResolved - ? PrivateDnsModeDialogPreference.getHostnameFromSettings(cr) - : res.getString(R.string.private_dns_mode_provider_failure); + if (!dnsesResolved) { + return res.getString(R.string.private_dns_mode_provider_failure); + } + final String privateDnsHostname = + ConnectivitySettingsManager.getPrivateDnsHostname(mContext); + if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_adguard))) { + return res.getString(R.string.private_dns_mode_adguard); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_appliedprivacy))) { + return res.getString(R.string.private_dns_mode_appliedprivacy); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_cira))) { + return res.getString(R.string.private_dns_mode_cira); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_cleanbrowsing))) { + return res.getString(R.string.private_dns_mode_cleanbrowsing); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_cloudflare))) { + return res.getString(R.string.private_dns_mode_cloudflare); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_controld))) { + return res.getString(R.string.private_dns_mode_controld); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_cznic))) { + return res.getString(R.string.private_dns_mode_cznic); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_dnszero))) { + return res.getString(R.string.private_dns_mode_dnszero); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_dnssb))) { + return res.getString(R.string.private_dns_mode_dnssb); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_google))) { + return res.getString(R.string.private_dns_mode_google); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_mullvad))) { + return res.getString(R.string.private_dns_mode_mullvad); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_quadnine))) { + return res.getString(R.string.private_dns_mode_quadnine); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_restena))) { + return res.getString(R.string.private_dns_mode_restena); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_switch))) { + return res.getString(R.string.private_dns_mode_switch); + } else if (privateDnsHostname.equals(res.getString(R.string.private_dns_hostname_uncensoreddns))) { + return res.getString(R.string.private_dns_mode_uncensoreddns); + } + return PrivateDnsModeDialogPreference.getHostnameFromSettings(cr); } return ""; }