From 6b5f34599bef10d556550ad12c209ea571e9be44 Mon Sep 17 00:00:00 2001 From: Ido Ben-Hur Date: Thu, 21 Dec 2023 16:04:34 +0200 Subject: [PATCH] Settings: Allow disabling private DNS for VPN [2/2] Allows using the VPN's DNS instead of the set private DNS Automatically restores the previous set mode Change-Id: Ib7d91bf151ed593648357c1d7e4013d309e2d927 --- res/values/evolution_strings.xml | 4 + res/xml/network_provider_internet.xml | 9 +-- res/xml/private_dns_settings.xml | 38 +++++++++ .../PrivateDnsPreferenceController.java | 9 ++- .../settings/network/PrivateDnsSettings.java | 78 +++++++++++++++++++ 5 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 res/xml/private_dns_settings.xml create mode 100644 src/com/android/settings/network/PrivateDnsSettings.java diff --git a/res/values/evolution_strings.xml b/res/values/evolution_strings.xml index 6b4f04241c4..e3901f1e384 100644 --- a/res/values/evolution_strings.xml +++ b/res/values/evolution_strings.xml @@ -258,4 +258,8 @@ Back gesture animation Show an animated arrow for back gesture + + + Disable for VPN + Disable the private DNS when connected to a VPN\nWill restore upon disconnecting diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index 290b71cdf51..cfdde279977 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -94,15 +94,12 @@ settings:userRestriction="no_config_vpn" settings:useAdminDisabledSummary="true" /> - + android:order="20" /> + + + + + + + + + diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java index 5ab0266a62e..3bbf0a3d19e 100644 --- a/src/com/android/settings/network/PrivateDnsPreferenceController.java +++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java @@ -58,6 +58,7 @@ import java.util.List; public class PrivateDnsPreferenceController extends BasePreferenceController implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop { private static final String KEY_PRIVATE_DNS_SETTINGS = "private_dns_settings"; + private static final String KEY_ENFORCE_VPN_SETTINGS = "vpn_enforce_dns"; private static final Uri[] SETTINGS_URIS = new Uri[]{ Settings.Global.getUriFor(PRIVATE_DNS_MODE), @@ -82,6 +83,7 @@ public class PrivateDnsPreferenceController extends BasePreferenceController private final ConnectivityManager mConnectivityManager; private LinkProperties mLatestLinkProperties; private Preference mPreference; + private Preference mEnforcePreference; public PrivateDnsPreferenceController(Context context) { super(context, KEY_PRIVATE_DNS_SETTINGS); @@ -110,6 +112,7 @@ public class PrivateDnsPreferenceController extends BasePreferenceController super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); + mEnforcePreference = screen.findPreference(KEY_ENFORCE_VPN_SETTINGS); } @Override @@ -201,7 +204,11 @@ public class PrivateDnsPreferenceController extends BasePreferenceController @Override public void updateState(Preference preference) { super.updateState(preference); - preference.setEnabled(!isManagedByAdmin()); + final boolean isManaged = isManagedByAdmin(); + preference.setEnabled(!isManaged); + if (mEnforcePreference == null) return; + final int mode = ConnectivitySettingsManager.getPrivateDnsMode(mContext); + mEnforcePreference.setEnabled(!isManaged && mode != PRIVATE_DNS_MODE_OFF); } private boolean isManagedByAdmin() { diff --git a/src/com/android/settings/network/PrivateDnsSettings.java b/src/com/android/settings/network/PrivateDnsSettings.java new file mode 100644 index 00000000000..086592c971d --- /dev/null +++ b/src/com/android/settings/network/PrivateDnsSettings.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2023 Yet Another AOSP Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network; + +import android.app.settings.SettingsEnums; +import android.content.Context; + +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Adaptive connectivity is a feature which automatically manages network connections. + */ +@SearchIndexable +public class PrivateDnsSettings extends DashboardFragment { + + private static final String TAG = "PrivateDnsSettings"; + + @Override + public int getMetricsCategory() { + return SettingsEnums.SETTINGS_NETWORK_CATEGORY; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.private_dns_settings; + } + + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getSettingsLifecycle()); + } + + private static List buildPreferenceControllers( + Context context, Lifecycle lifecycle) { + final PrivateDnsPreferenceController privateDnsPreferenceController = + new PrivateDnsPreferenceController(context); + if (lifecycle != null) { + lifecycle.addObserver(privateDnsPreferenceController); + } + final List controllers = new ArrayList<>(); + controllers.add(privateDnsPreferenceController); + return controllers; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.private_dns_settings) { + @Override + public List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context, null); + } + }; +}