diff --git a/res/layout/private_dns_mode_dialog.xml b/res/layout/private_dns_mode_dialog.xml
index 1774ec376ea..6bee5947447 100644
--- a/res/layout/private_dns_mode_dialog.xml
+++ b/res/layout/private_dns_mode_dialog.xml
@@ -41,6 +41,14 @@
android:id="@+id/private_dns_mode_cloudflare"
layout="@layout/preference_widget_dialog_radiobutton"/>
+
+
+
+
@@ -57,6 +65,18 @@
android:id="@+id/private_dns_mode_quad9"
layout="@layout/preference_widget_dialog_radiobutton"/>
+
+
+
+
+
+
@@ -91,4 +111,3 @@
-
diff --git a/res/values/evolution_strings.xml b/res/values/evolution_strings.xml
index e6d61246b0a..60374ba1bbb 100644
--- a/res/values/evolution_strings.xml
+++ b/res/values/evolution_strings.xml
@@ -28,6 +28,16 @@
Force LTE CA
Force LTE carrier aggregation to work
+
+ Cloudflare Block Malware DNS
+
+ security.cloudflare-dns.com
+
+
+ Cloudflare Block Malware and Adult Content DNS
+
+ family.cloudflare-dns.com
+
AdGuard DNS
@@ -47,4 +57,19 @@
Quad9 DNS
dns.quad9.net
+
+
+ Quad9 Unsecured DNS
+
+ dns10.quad9.net
+
+
+ Quad9 with ECS DNS
+
+ dns11.quad9.net
+
+
+ Quad9 Unsecured with ECS DNS
+
+ dns12.quad9.net
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index 153fea2ebc8..594e1d0c553 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -73,19 +73,29 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
// Only used in Settings, update on additions to ConnectivitySettingsUtils
private static final int PRIVATE_DNS_MODE_CLOUDFLARE = 4;
- private static final int PRIVATE_DNS_MODE_ADGUARD = 5;
- private static final int PRIVATE_DNS_MODE_OPEN_DNS = 6;
- private static final int PRIVATE_DNS_MODE_CLEANBROWSING = 7;
- private static final int PRIVATE_DNS_MODE_QUAD9 = 8;
+ private static final int PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE = 5;
+ private static final int PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT = 6;
+ private static final int PRIVATE_DNS_MODE_ADGUARD = 7;
+ private static final int PRIVATE_DNS_MODE_OPEN_DNS = 8;
+ private static final int PRIVATE_DNS_MODE_CLEANBROWSING = 9;
+ private static final int PRIVATE_DNS_MODE_QUAD9 = 10;
+ private static final int PRIVATE_DNS_MODE_QUAD9_UNSECURED = 11;
+ private static final int PRIVATE_DNS_MODE_QUAD9_ECS = 12;
+ private static final int PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS = 13;
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_CLOUDFLARE, R.id.private_dns_mode_cloudflare);
+ PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE, R.id.private_dns_mode_cloudflare_block_malware);
+ PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT, R.id.private_dns_mode_cloudflare_block_malware_and_adult_content);
PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_ADGUARD, R.id.private_dns_mode_adguard);
PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_OPEN_DNS, R.id.private_dns_mode_open_dns);
PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_CLEANBROWSING, R.id.private_dns_mode_cleanbrowsing);
PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_QUAD9, R.id.private_dns_mode_quad9);
+ PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_QUAD9_UNSECURED, R.id.private_dns_mode_quad9_unsecured);
+ PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_QUAD9_ECS, R.id.private_dns_mode_quad9_ecs);
+ PRIVATE_DNS_MAP.put(PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS, R.id.private_dns_mode_quad9_unsecured_ecs);
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);
}
@@ -153,6 +163,10 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
ConnectivitySettingsManager.getPrivateDnsHostname(context);
final String cloudflareHostname =
context.getString(R.string.private_dns_hostname_cloudflare);
+ final String cloudflareblockmalwareHostname =
+ context.getString(R.string.private_dns_hostname_cloudflare_block_malware);
+ final String cloudflareblockmalwareandadultcontentHostname =
+ context.getString(R.string.private_dns_hostname_cloudflare_block_malware_and_adult_content);
final String adguardHostname =
context.getString(R.string.private_dns_hostname_adguard);
final String opendnsHostname =
@@ -161,8 +175,18 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
context.getString(R.string.private_dns_hostname_cleanbrowsing);
final String quad9Hostname =
context.getString(R.string.private_dns_hostname_quad9);
+ final String quad9unsecuredHostname =
+ context.getString(R.string.private_dns_hostname_quad9_unsecured);
+ final String quad9ecsHostname =
+ context.getString(R.string.private_dns_hostname_quad9_ecs);
+ final String quad9unsecuredecsHostname =
+ context.getString(R.string.private_dns_hostname_quad9_unsecured_ecs);
if (privateDnsHostname.equals(cloudflareHostname)) {
mMode = PRIVATE_DNS_MODE_CLOUDFLARE;
+ } else if (privateDnsHostname.equals(cloudflareblockmalwareHostname)) {
+ mMode = PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE;
+ } else if (privateDnsHostname.equals(cloudflareblockmalwareandadultcontentHostname)) {
+ mMode = PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT;
} else if (privateDnsHostname.equals(adguardHostname)) {
mMode = PRIVATE_DNS_MODE_ADGUARD;
} else if (privateDnsHostname.equals(opendnsHostname)) {
@@ -171,6 +195,12 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
mMode = PRIVATE_DNS_MODE_CLEANBROWSING;
} else if (privateDnsHostname.equals(quad9Hostname)) {
mMode = PRIVATE_DNS_MODE_QUAD9;
+ } else if (privateDnsHostname.equals(quad9unsecuredHostname)) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_UNSECURED;
+ } else if (privateDnsHostname.equals(quad9ecsHostname)) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_ECS;
+ } else if (privateDnsHostname.equals(quad9unsecuredecsHostname)) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS;
}
}
mRadioGroup = view.findViewById(R.id.private_dns_radio_group);
@@ -183,6 +213,12 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
final RadioButton cloudflareRadioButton =
view.findViewById(R.id.private_dns_mode_cloudflare);
cloudflareRadioButton.setText(R.string.private_dns_mode_cloudflare);
+ final RadioButton cloudflareblockmalwareRadioButton =
+ view.findViewById(R.id.private_dns_mode_cloudflare_block_malware);
+ cloudflareblockmalwareRadioButton.setText(R.string.private_dns_mode_cloudflare_block_malware);
+ final RadioButton cloudflareblockmalwareandadultcontentRadioButton =
+ view.findViewById(R.id.private_dns_mode_cloudflare_block_malware_and_adult_content);
+ cloudflareblockmalwareandadultcontentRadioButton.setText(R.string.private_dns_mode_cloudflare_block_malware_and_adult_content);
final RadioButton adguardRadioButton =
view.findViewById(R.id.private_dns_mode_adguard);
adguardRadioButton.setText(R.string.private_dns_mode_adguard);
@@ -195,6 +231,15 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
final RadioButton quad9RadioButton =
view.findViewById(R.id.private_dns_mode_quad9);
quad9RadioButton.setText(R.string.private_dns_mode_quad9);
+ final RadioButton quad9unsecuredRadioButton =
+ view.findViewById(R.id.private_dns_mode_quad9_unsecured);
+ quad9unsecuredRadioButton.setText(R.string.private_dns_mode_quad9_unsecured);
+ final RadioButton quad9ecsRadioButton =
+ view.findViewById(R.id.private_dns_mode_quad9_ecs);
+ quad9ecsRadioButton.setText(R.string.private_dns_mode_quad9_ecs);
+ final RadioButton quad9unsecuredecsRadioButton =
+ view.findViewById(R.id.private_dns_mode_quad9_unsecured_ecs);
+ quad9unsecuredecsRadioButton.setText(R.string.private_dns_mode_quad9_unsecured_ecs);
final RadioButton opportunisticRadioButton =
view.findViewById(R.id.private_dns_mode_opportunistic);
opportunisticRadioButton.setText(
@@ -232,6 +277,10 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
mMode = PRIVATE_DNS_MODE_OFF;
} else if (checkedId == R.id.private_dns_mode_cloudflare) {
mMode = PRIVATE_DNS_MODE_CLOUDFLARE;
+ } else if (checkedId == R.id.private_dns_mode_cloudflare_block_malware) {
+ mMode = PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE;
+ } else if (checkedId == R.id.private_dns_mode_cloudflare_block_malware_and_adult_content) {
+ mMode = PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT;
} else if (checkedId == R.id.private_dns_mode_adguard) {
mMode = PRIVATE_DNS_MODE_ADGUARD;
} else if (checkedId == R.id.private_dns_mode_open_dns) {
@@ -240,6 +289,12 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
mMode = PRIVATE_DNS_MODE_CLEANBROWSING;
} else if (checkedId == R.id.private_dns_mode_quad9) {
mMode = PRIVATE_DNS_MODE_QUAD9;
+ } else if (checkedId == R.id.private_dns_mode_quad9_unsecured) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_UNSECURED;
+ } else if (checkedId == R.id.private_dns_mode_quad9_ecs) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_ECS;
+ } else if (checkedId == R.id.private_dns_mode_quad9_unsecured_ecs) {
+ mMode = PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS;
} else if (checkedId == R.id.private_dns_mode_opportunistic) {
mMode = PRIVATE_DNS_MODE_OPPORTUNISTIC;
} else if (checkedId == R.id.private_dns_mode_provider) {
@@ -335,6 +390,16 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
context.getString(R.string.private_dns_hostname_cloudflare);
ConnectivitySettingsManager.setPrivateDnsHostname(context, cloudflareHostname);
modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ } else if (mMode == PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE) {
+ final String cloudflareblockmalwareHostname =
+ context.getString(R.string.private_dns_hostname_cloudflare_block_malware);
+ ConnectivitySettingsManager.setPrivateDnsHostname(context, cloudflareblockmalwareHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ } else if (mMode == PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT) {
+ final String cloudflareblockmalwareandadultcontentHostname =
+ context.getString(R.string.private_dns_hostname_cloudflare_block_malware_and_adult_content);
+ ConnectivitySettingsManager.setPrivateDnsHostname(context, cloudflareblockmalwareandadultcontentHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
} else if (mMode == PRIVATE_DNS_MODE_ADGUARD) {
final String adguardHostname =
context.getString(R.string.private_dns_hostname_adguard);
@@ -355,6 +420,21 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
context.getString(R.string.private_dns_hostname_quad9);
ConnectivitySettingsManager.setPrivateDnsHostname(context, quad9Hostname);
modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ } else if (mMode == PRIVATE_DNS_MODE_QUAD9_UNSECURED) {
+ final String quad9unsecuredHostname =
+ context.getString(R.string.private_dns_hostname_quad9_unsecured);
+ ConnectivitySettingsManager.setPrivateDnsHostname(context, quad9unsecuredHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ } else if (mMode == PRIVATE_DNS_MODE_QUAD9_ECS) {
+ final String quad9ecsHostname =
+ context.getString(R.string.private_dns_hostname_quad9_ecs);
+ ConnectivitySettingsManager.setPrivateDnsHostname(context, quad9ecsHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ } else if (mMode == PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS) {
+ final String quad9unsecuredecsHostname =
+ context.getString(R.string.private_dns_hostname_quad9_unsecured_ecs);
+ ConnectivitySettingsManager.setPrivateDnsHostname(context, quad9unsecuredecsHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
}
ConnectivitySettingsManager.setPrivateDnsMode(context, modeToSet);
diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java
index 179079dcc38..5ab0266a62e 100644
--- a/src/com/android/settings/network/PrivateDnsPreferenceController.java
+++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java
@@ -67,10 +67,15 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
// Only used in Settings, update on additions to ConnectivitySettingsUtils
private static final int PRIVATE_DNS_MODE_CLOUDFLARE = 4;
- private static final int PRIVATE_DNS_MODE_ADGUARD = 5;
- private static final int PRIVATE_DNS_MODE_OPEN_DNS = 6;
- private static final int PRIVATE_DNS_MODE_CLEANBROWSING = 7;
- private static final int PRIVATE_DNS_MODE_QUAD9 = 8;
+ private static final int PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE = 5;
+ private static final int PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT = 6;
+ private static final int PRIVATE_DNS_MODE_ADGUARD = 7;
+ private static final int PRIVATE_DNS_MODE_OPEN_DNS = 8;
+ private static final int PRIVATE_DNS_MODE_CLEANBROWSING = 9;
+ private static final int PRIVATE_DNS_MODE_QUAD9 = 10;
+ private static final int PRIVATE_DNS_MODE_QUAD9_UNSECURED = 11;
+ private static final int PRIVATE_DNS_MODE_QUAD9_ECS = 12;
+ private static final int PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS = 13;
private final Handler mHandler;
private final ContentObserver mSettingsObserver;
@@ -137,10 +142,15 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
case PRIVATE_DNS_MODE_OFF:
return res.getString(com.android.settingslib.R.string.private_dns_mode_off);
case PRIVATE_DNS_MODE_CLOUDFLARE:
+ case PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE:
+ case PRIVATE_DNS_MODE_CLOUDFLARE_BLOCK_MALWARE_AND_ADULT_CONTENT:
case PRIVATE_DNS_MODE_ADGUARD:
case PRIVATE_DNS_MODE_OPEN_DNS:
case PRIVATE_DNS_MODE_CLEANBROWSING:
case PRIVATE_DNS_MODE_QUAD9:
+ case PRIVATE_DNS_MODE_QUAD9_UNSECURED:
+ case PRIVATE_DNS_MODE_QUAD9_ECS:
+ case PRIVATE_DNS_MODE_QUAD9_UNSECURED_ECS:
case PRIVATE_DNS_MODE_OPPORTUNISTIC:
return dnsesResolved ? res.getString(R.string.private_dns_mode_on)
: res.getString(
@@ -154,6 +164,10 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
ConnectivitySettingsManager.getPrivateDnsHostname(mContext);
final String cloudflareHostname =
res.getString(R.string.private_dns_hostname_cloudflare);
+ final String cloudflareblockmalwareHostname =
+ res.getString(R.string.private_dns_hostname_cloudflare_block_malware);
+ final String cloudflareblockmalwaresndsdultcontentHostname =
+ res.getString(R.string.private_dns_hostname_cloudflare_block_malware_and_adult_content);
final String adguardHostname =
res.getString(R.string.private_dns_hostname_adguard);
final String opendnsHostname =
@@ -162,6 +176,12 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
res.getString(R.string.private_dns_hostname_cleanbrowsing);
final String quad9Hostname =
res.getString(R.string.private_dns_hostname_quad9);
+ final String quad9unsecuredHostname =
+ res.getString(R.string.private_dns_hostname_quad9_unsecured);
+ final String quad9ecsHostname =
+ res.getString(R.string.private_dns_hostname_quad9_ecs);
+ final String quad9unsecuredecsHostname =
+ res.getString(R.string.private_dns_hostname_quad9_unsecured_ecs);
if (privateDnsHostname.equals(cloudflareHostname)) {
return res.getString(R.string.private_dns_mode_cloudflare);
} else if (privateDnsHostname.equals(adguardHostname)) {