Merge "Factor in PRIVATE_DNS_MODE_DEFAULTSETTING value" into pi-dev
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index 969cb11..290ffd5 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.network;
 
+import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE_FALLBACK;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
@@ -79,8 +80,11 @@
     static final String HOSTNAME_KEY = Settings.Global.PRIVATE_DNS_SPECIFIER;
 
     public static String getModeFromSettings(ContentResolver cr) {
-        final String mode = Settings.Global.getString(cr, MODE_KEY);
-        return PRIVATE_DNS_MAP.containsKey(mode) ? mode : PRIVATE_DNS_MODE_OPPORTUNISTIC;
+        String mode = Settings.Global.getString(cr, MODE_KEY);
+        if (!PRIVATE_DNS_MAP.containsKey(mode)) {
+            mode = Settings.Global.getString(cr, Settings.Global.PRIVATE_DNS_DEFAULT_MODE);
+        }
+        return PRIVATE_DNS_MAP.containsKey(mode) ? mode : PRIVATE_DNS_DEFAULT_MODE_FALLBACK;
     }
 
     public static String getHostnameFromSettings(ContentResolver cr) {
diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java
index 47aa4dc..6f38569 100644
--- a/src/com/android/settings/network/PrivateDnsPreferenceController.java
+++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java
@@ -19,6 +19,9 @@
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
+import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
+import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
 
 import android.content.Context;
 import android.content.ContentResolver;
@@ -51,8 +54,9 @@
     private static final String KEY_PRIVATE_DNS_SETTINGS = "private_dns_settings";
 
     private static final Uri[] SETTINGS_URIS = new Uri[]{
-        Settings.Global.getUriFor(Settings.Global.PRIVATE_DNS_MODE),
-        Settings.Global.getUriFor(Settings.Global.PRIVATE_DNS_SPECIFIER),
+        Settings.Global.getUriFor(PRIVATE_DNS_MODE),
+        Settings.Global.getUriFor(PRIVATE_DNS_DEFAULT_MODE),
+        Settings.Global.getUriFor(PRIVATE_DNS_SPECIFIER),
     };
 
     private final Handler mHandler;
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
index dfea6fb..72f36c6 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsModeDialogPreferenceTest.java
@@ -19,6 +19,7 @@
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.doReturn;
@@ -158,24 +159,21 @@
     public void testOnClick_positiveButtonClicked_saveData() {
         // Set the default settings to OFF
         final ContentResolver contentResolver = mContext.getContentResolver();
-        Settings.Global.putString(contentResolver, Settings.Global.PRIVATE_DNS_MODE,
-                ConnectivityManager.PRIVATE_DNS_MODE_OFF);
+        Settings.Global.putString(contentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF);
 
         mPreference.mMode = ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
         mPreference.onClick(null, DialogInterface.BUTTON_POSITIVE);
 
         // Change to OPPORTUNISTIC
-        assertThat(Settings.Global.getString(contentResolver,
-                Settings.Global.PRIVATE_DNS_MODE)).isEqualTo(
-                ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC);
+        assertThat(Settings.Global.getString(contentResolver, PRIVATE_DNS_MODE)).isEqualTo(
+                PRIVATE_DNS_MODE_OPPORTUNISTIC);
     }
 
     @Test
     public void testOnClick_negativeButtonClicked_doNothing() {
         // Set the default settings to OFF
         final ContentResolver contentResolver = mContext.getContentResolver();
-        Settings.Global.putString(contentResolver, Settings.Global.PRIVATE_DNS_MODE,
-                ConnectivityManager.PRIVATE_DNS_MODE_OFF);
+        Settings.Global.putString(contentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF);
 
         mPreference.mMode = ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
         mPreference.onClick(null, DialogInterface.BUTTON_NEGATIVE);
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
index ce40ab6..a63645b 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
@@ -21,6 +21,7 @@
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
 import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
 import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
 import static com.google.common.truth.Truth.assertThat;
@@ -220,6 +221,34 @@
                 getResourceString(R.string.private_dns_mode_provider_failure));
     }
 
+    @Test
+    public void getSummary_PrivateDnsDefaultMode() {
+        // Default mode is opportunistic, unless overridden by a Settings push.
+        setPrivateDnsMode("");
+        setPrivateDnsProviderHostname("");
+        mController.updateState(mPreference);
+        verify(mController, atLeastOnce()).getSummary();
+        verify(mPreference).setSummary(getResourceString(R.string.private_dns_mode_opportunistic));
+
+        reset(mController);
+        reset(mPreference);
+        // Pretend an emergency gservices setting has disabled default-opportunistic.
+        Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, PRIVATE_DNS_MODE_OFF);
+        mController.updateState(mPreference);
+        verify(mController, atLeastOnce()).getSummary();
+        verify(mPreference).setSummary(getResourceString(R.string.private_dns_mode_off));
+
+        reset(mController);
+        reset(mPreference);
+        // The user interacting with the Private DNS menu, explicitly choosing
+        // opportunistic mode, will be able to use despite the change to the
+        // default setting above.
+        setPrivateDnsMode(PRIVATE_DNS_MODE_OPPORTUNISTIC);
+        mController.updateState(mPreference);
+        verify(mController, atLeastOnce()).getSummary();
+        verify(mPreference).setSummary(getResourceString(R.string.private_dns_mode_opportunistic));
+    }
+
     private void setPrivateDnsMode(String mode) {
         Settings.Global.putString(mContentResolver, PRIVATE_DNS_MODE, mode);
     }