diff --git a/res/layout/private_dns_mode_dialog.xml b/res/layout/private_dns_mode_dialog.xml
index 0b4f4db6c4b1585ce65cd3da19b8008a1d87ed9a..3661174ffc82b2290eb01cf3de14687b05f5f109 100644
--- a/res/layout/private_dns_mode_dialog.xml
+++ b/res/layout/private_dns_mode_dialog.xml
@@ -35,6 +35,10 @@
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 f96ca277f9525db2d025ed23da3f7123a391113c..57d1cee0cfa8cbfc0cbba89b3141ce1188b556d1 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -214,4 +214,8 @@
This will erase all data from your tablet\u2019s internal storage, including:\n\nAll your account\nSystem and app data and settings\nDownloaded apps
This will erase all data from your phone\u2019s internal storage, including:\n\nAll your account\nSystem and app data and settings\nDownloaded apps
+
+
+ Quad9
+ dns.quad9.net
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index 3fc5086cd6873d148a1af815ff849c1fc55fc03b..fe2a9edc25de920ab9a36e1e971a291d50811521 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -71,9 +71,13 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
// DNS_MODE -> RadioButton id
private static final Map PRIVATE_DNS_MAP;
+ // Only used in Settings, update on additions to ConnectivitySettingsUtils
+ private static final String PRIVATE_DNS_MODE_QUADNINE = "quadnine";
+
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_QUADNINE, R.id.private_dns_mode_quadnine);
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);
}
@@ -168,6 +172,14 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
final ContentResolver contentResolver = context.getContentResolver();
mMode = getModeFromSettings(context.getContentResolver());
+ if (mMode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME) {
+ final String privateDnsHostname = getHostnameFromSettings(contentResolver);
+ final String quadNineHostname =
+ context.getString(R.string.private_dns_hostname_quadnine);
+ if (privateDnsHostname.equals(quadNineHostname)) {
+ mMode = PRIVATE_DNS_MODE_QUADNINE;
+ }
+ }
mEditText = view.findViewById(R.id.private_dns_mode_provider_hostname);
mEditText.addTextChangedListener(this);
@@ -180,6 +192,9 @@ 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 quadNineRadioButton =
+ view.findViewById(R.id.private_dns_mode_quadnine);
+ quadNineRadioButton.setText(R.string.private_dns_mode_quadnine);
final RadioButton opportunisticRadioButton =
view.findViewById(R.id.private_dns_mode_opportunistic);
opportunisticRadioButton.setText(R.string.private_dns_mode_opportunistic);
@@ -205,15 +220,22 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
final Context context = getContext();
+ String modeToSet = mMode;
if (mMode.equals(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
// Only clickable if hostname is valid, so we could save it safely
Settings.Global.putString(context.getContentResolver(), HOSTNAME_KEY,
mEditText.getText().toString());
+ } else if (mMode == PRIVATE_DNS_MODE_QUADNINE) {
+ final String quadNineHostname =
+ context.getString(R.string.private_dns_hostname_quadnine);
+ Settings.Global.putString(context.getContentResolver(), HOSTNAME_KEY,
+ quadNineHostname);
+ modeToSet = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
}
FeatureFactory.getFactory(context).getMetricsFeatureProvider().action(context,
- SettingsEnums.ACTION_PRIVATE_DNS_MODE, mMode);
- Settings.Global.putString(context.getContentResolver(), MODE_KEY, mMode);
+ SettingsEnums.ACTION_PRIVATE_DNS_MODE, modeToSet);
+ Settings.Global.putString(context.getContentResolver(), MODE_KEY, modeToSet);
}
}
@@ -221,6 +243,8 @@ 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_quadnine) {
+ mMode = PRIVATE_DNS_MODE_QUADNINE;
} 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 22633e0081aa3d6724b687f49b2d0215a58e2e3b..e0222ba38916f8f16970538f4e13dd84c113e974 100644
--- a/src/com/android/settings/network/PrivateDnsPreferenceController.java
+++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java
@@ -64,6 +64,9 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
Settings.Global.getUriFor(PRIVATE_DNS_SPECIFIER),
};
+ // Only used in Settings, update on additions to ConnectivitySettingsUtils
+ private static final String PRIVATE_DNS_MODE_QUADNINE = "quadnine";
+
private final Handler mHandler;
private final ContentObserver mSettingsObserver;
private final ConnectivityManager mConnectivityManager;
@@ -128,13 +131,22 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
switch (mode) {
case PRIVATE_DNS_MODE_OFF:
return res.getString(R.string.private_dns_mode_off);
+ case PRIVATE_DNS_MODE_QUADNINE:
case PRIVATE_DNS_MODE_OPPORTUNISTIC:
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 =
+ PrivateDnsModeDialogPreference.getHostnameFromSettings(cr);
+ final String quadNineHostname =
+ res.getString(R.string.private_dns_hostname_quadnine);
+ if (privateDnsHostname.equals(quadNineHostname)) {
+ return res.getString(R.string.private_dns_mode_quadnine);
+ }
+ return privateDnsHostname;
}
return "";
}