From 5c9a04237068a76a48ac3854272428d88437a086 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 18 Feb 2021 01:11:49 +0900 Subject: [PATCH] Stop using ConnectivityManager for VPNs. These methods have all moved to VpnManager. Bug: 173331190 Test: atest SettingsRoboTests Change-Id: I1dd57fa2213b1785a94ec9d6ab4cce3a5d2684ff --- .../EnterprisePrivacyFeatureProviderImpl.java | 9 ++++++--- .../settings/overlay/FeatureFactoryImpl.java | 4 +++- .../settings/vpn2/AppDialogFragment.java | 7 ++----- .../settings/vpn2/AppManagementFragment.java | 9 +++------ .../settings/vpn2/ConfigDialogFragment.java | 4 +--- .../android/settings/vpn2/VpnSettings.java | 2 +- src/com/android/settings/vpn2/VpnUtils.java | 19 +++++++------------ ...erprisePrivacyFeatureProviderImplTest.java | 15 ++++++++------- .../android/settings/vpn2/VpnUtilsTest.java | 12 ++++++------ 9 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index 7a5b4897623..a746df699a8 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -25,6 +25,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Resources; import android.net.ConnectivityManager; +import android.net.VpnManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -48,18 +49,20 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe private final PackageManager mPm; private final UserManager mUm; private final ConnectivityManager mCm; + private final VpnManager mVm; private final Resources mResources; private static final int MY_USER_ID = UserHandle.myUserId(); public EnterprisePrivacyFeatureProviderImpl(Context context, DevicePolicyManager dpm, - PackageManager pm, UserManager um, ConnectivityManager cm, + PackageManager pm, UserManager um, ConnectivityManager cm, VpnManager vm, Resources resources) { mContext = context.getApplicationContext(); mDpm = dpm; mPm = pm; mUm = um; mCm = cm; + mVm = vm; mResources = resources; } @@ -133,14 +136,14 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe @Override public boolean isAlwaysOnVpnSetInCurrentUser() { - return VpnUtils.isAlwaysOnVpnSet(mCm, MY_USER_ID); + return VpnUtils.isAlwaysOnVpnSet(mVm, MY_USER_ID); } @Override public boolean isAlwaysOnVpnSetInManagedProfile() { final int managedProfileUserId = getManagedProfileUserId(); return managedProfileUserId != UserHandle.USER_NULL && - VpnUtils.isAlwaysOnVpnSet(mCm, managedProfileUserId); + VpnUtils.isAlwaysOnVpnSet(mVm, managedProfileUserId); } @Override diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index ebbe87cfdac..a1b70d99ff5 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -20,6 +20,7 @@ import android.app.AppGlobals; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.net.ConnectivityManager; +import android.net.VpnManager; import android.os.UserManager; import androidx.annotation.Keep; @@ -172,7 +173,8 @@ public class FeatureFactoryImpl extends FeatureFactory { Context.DEVICE_POLICY_SERVICE), appContext.getPackageManager(), UserManager.get(appContext), - (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE), + appContext.getSystemService(ConnectivityManager.class), + appContext.getSystemService(VpnManager.class), appContext.getResources()); } return mEnterprisePrivacyFeatureProvider; diff --git a/src/com/android/settings/vpn2/AppDialogFragment.java b/src/com/android/settings/vpn2/AppDialogFragment.java index 45fb9bdb820..626a271e7fc 100644 --- a/src/com/android/settings/vpn2/AppDialogFragment.java +++ b/src/com/android/settings/vpn2/AppDialogFragment.java @@ -20,7 +20,6 @@ import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.DialogInterface; import android.content.pm.PackageInfo; -import android.net.ConnectivityManager; import android.net.VpnManager; import android.os.Bundle; import android.os.UserHandle; @@ -48,7 +47,6 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App private PackageInfo mPackageInfo; private Listener mListener; - private ConnectivityManager mConnectivityManager; private UserManager mUserManager; private VpnManager mVpnManager; @@ -93,7 +91,6 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mConnectivityManager = getContext().getSystemService(ConnectivityManager.class); mUserManager = UserManager.get(getContext()); mVpnManager = getContext().getSystemService(VpnManager.class); } @@ -158,8 +155,8 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App } final int userId = getUserId(); if (mPackageInfo.packageName.equals(VpnUtils.getConnectedPackage(mVpnManager, userId))) { - mConnectivityManager.setAlwaysOnVpnPackageForUser(userId, null, - /* lockdownEnabled */ false, /* lockdownAllowlist */ null); + mVpnManager.setAlwaysOnVpnPackageForUser(userId, null, /* lockdownEnabled */ false, + /* lockdownAllowlist */ null); mVpnManager.prepareVpn(mPackageInfo.packageName, VpnConfig.LEGACY_VPN, userId); } } diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java index 9422010aed0..0543fee7dbe 100644 --- a/src/com/android/settings/vpn2/AppManagementFragment.java +++ b/src/com/android/settings/vpn2/AppManagementFragment.java @@ -28,7 +28,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.net.ConnectivityManager; import android.net.VpnManager; import android.os.Bundle; import android.os.UserHandle; @@ -69,7 +68,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment private PackageManager mPackageManager; private DevicePolicyManager mDevicePolicyManager; - private ConnectivityManager mConnectivityManager; private VpnManager mVpnManager; // VPN app info @@ -122,7 +120,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment mPackageManager = getContext().getPackageManager(); mDevicePolicyManager = getContext().getSystemService(DevicePolicyManager.class); - mConnectivityManager = getContext().getSystemService(ConnectivityManager.class); mVpnManager = getContext().getSystemService(VpnManager.class); mPreferenceVersion = findPreference(KEY_VERSION); @@ -227,7 +224,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment } private boolean setAlwaysOnVpn(boolean isEnabled, boolean isLockdown) { - return mConnectivityManager.setAlwaysOnVpnPackageForUser(mUserId, + return mVpnManager.setAlwaysOnVpnPackageForUser(mUserId, isEnabled ? mPackageName : null, isLockdown, /* lockdownAllowlist */ null); } @@ -261,7 +258,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment mPreferenceLockdown.setDisabledByAdmin(admin); } } - if (mConnectivityManager.isAlwaysOnVpnPackageSupportedForUser(mUserId, mPackageName)) { + if (mVpnManager.isAlwaysOnVpnPackageSupportedForUser(mUserId, mPackageName)) { // setSummary doesn't override the admin message when user restriction is applied mPreferenceAlwaysOn.setSummary(R.string.vpn_always_on_summary); // setEnabled is not required here, as checkRestrictionAndSetDisabled @@ -275,7 +272,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment } private String getAlwaysOnVpnPackage() { - return mConnectivityManager.getAlwaysOnVpnPackageForUser(mUserId); + return mVpnManager.getAlwaysOnVpnPackageForUser(mUserId); } private boolean isVpnAlwaysOn() { diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java index e88e4efd588..f339a694c03 100644 --- a/src/com/android/settings/vpn2/ConfigDialogFragment.java +++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java @@ -20,7 +20,6 @@ import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; -import android.net.ConnectivityManager; import android.net.VpnManager; import android.os.Bundle; import android.os.RemoteException; @@ -177,8 +176,7 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements return; } - final ConnectivityManager conn = ConnectivityManager.from(mContext); - conn.setAlwaysOnVpnPackageForUser(UserHandle.myUserId(), null, + mService.setAlwaysOnVpnPackageForUser(UserHandle.myUserId(), null, /* lockdownEnabled */ false, /* lockdownAllowlist */ null); VpnUtils.setLockdownVpn(mContext, profile.key); } else { diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java index 79f6be3c75b..0a3b2b01cd7 100644 --- a/src/com/android/settings/vpn2/VpnSettings.java +++ b/src/com/android/settings/vpn2/VpnSettings.java @@ -490,7 +490,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements Set result = new ArraySet<>(); for (UserHandle profile : mUserManager.getUserProfiles()) { final int profileId = profile.getIdentifier(); - final String packageName = mConnectivityManager.getAlwaysOnVpnPackageForUser(profileId); + final String packageName = mVpnManager.getAlwaysOnVpnPackageForUser(profileId); if (packageName != null) { result.add(new AppVpnInfo(profileId, packageName)); } diff --git a/src/com/android/settings/vpn2/VpnUtils.java b/src/com/android/settings/vpn2/VpnUtils.java index c6b79b4432b..4c9338ccd68 100644 --- a/src/com/android/settings/vpn2/VpnUtils.java +++ b/src/com/android/settings/vpn2/VpnUtils.java @@ -16,7 +16,6 @@ package com.android.settings.vpn2; import android.content.Context; -import android.net.ConnectivityManager; import android.net.VpnManager; import android.os.RemoteException; import android.provider.Settings; @@ -43,15 +42,15 @@ public class VpnUtils { public static void clearLockdownVpn(Context context) { KeyStore.getInstance().delete(Credentials.LOCKDOWN_VPN); - // Always notify ConnectivityManager after keystore update - getConnectivityManager(context).updateLockdownVpn(); + // Always notify VpnManager after keystore update + getVpnManager(context).updateLockdownVpn(); } public static void setLockdownVpn(Context context, String lockdownKey) { KeyStore.getInstance().put(Credentials.LOCKDOWN_VPN, lockdownKey.getBytes(), KeyStore.UID_SELF, /* flags */ 0); - // Always notify ConnectivityManager after keystore update - getConnectivityManager(context).updateLockdownVpn(); + // Always notify VpnManager after keystore update + getVpnManager(context).updateLockdownVpn(); } public static boolean isVpnLockdown(String key) { @@ -63,7 +62,7 @@ public class VpnUtils { if (getLockdownVpn() != null) { return true; } - return getConnectivityManager(context).getAlwaysOnVpnPackageForUser(userId) != null + return getVpnManager(context).getAlwaysOnVpnPackageForUser(userId) != null && Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN, /* default */ 0, userId) != 0; } @@ -77,16 +76,12 @@ public class VpnUtils { return config != null ? config.user : null; } - private static ConnectivityManager getConnectivityManager(Context context) { - return context.getSystemService(ConnectivityManager.class); - } - private static VpnManager getVpnManager(Context context) { return context.getSystemService(VpnManager.class); } - public static boolean isAlwaysOnVpnSet(ConnectivityManager cm, final int userId) { - return cm.getAlwaysOnVpnPackageForUser(userId) != null; + public static boolean isAlwaysOnVpnSet(VpnManager vm, final int userId) { + return vm.getAlwaysOnVpnPackageForUser(userId) != null; } public static boolean disconnectLegacyVpn(Context context) { diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java index c28267b9609..ee6c528a421 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java @@ -40,6 +40,7 @@ import android.content.pm.UserInfo; import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.ProxyInfo; +import android.net.VpnManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -91,6 +92,8 @@ public class EnterprisePrivacyFeatureProviderImplTest { private UserManager mUserManager; @Mock private ConnectivityManager mConnectivityManger; + @Mock + private VpnManager mVpnManager; private Resources mResources; private EnterprisePrivacyFeatureProvider mProvider; @@ -106,7 +109,7 @@ public class EnterprisePrivacyFeatureProviderImplTest { mResources = RuntimeEnvironment.application.getResources(); mProvider = new EnterprisePrivacyFeatureProviderImpl(mContext, mDevicePolicyManager, - mPackageManager, mUserManager, mConnectivityManger, mResources); + mPackageManager, mUserManager, mConnectivityManger, mVpnManager, mResources); } @Test @@ -208,11 +211,10 @@ public class EnterprisePrivacyFeatureProviderImplTest { @Test public void testIsAlwaysOnVpnSetInCurrentUser() { - when(mConnectivityManger.getAlwaysOnVpnPackageForUser(mUserId)).thenReturn(null); + when(mVpnManager.getAlwaysOnVpnPackageForUser(mUserId)).thenReturn(null); assertThat(mProvider.isAlwaysOnVpnSetInCurrentUser()).isFalse(); - when(mConnectivityManger.getAlwaysOnVpnPackageForUser(mUserId)) - .thenReturn(VPN_PACKAGE_ID); + when(mVpnManager.getAlwaysOnVpnPackageForUser(mUserId)).thenReturn(VPN_PACKAGE_ID); assertThat(mProvider.isAlwaysOnVpnSetInCurrentUser()).isTrue(); } @@ -222,11 +224,10 @@ public class EnterprisePrivacyFeatureProviderImplTest { mProfiles.add(new UserInfo(mManagedProfileUserId, "", "", UserInfo.FLAG_MANAGED_PROFILE)); - when(mConnectivityManger.getAlwaysOnVpnPackageForUser(mManagedProfileUserId)) - .thenReturn(null); + when(mVpnManager.getAlwaysOnVpnPackageForUser(mManagedProfileUserId)).thenReturn(null); assertThat(mProvider.isAlwaysOnVpnSetInManagedProfile()).isFalse(); - when(mConnectivityManger.getAlwaysOnVpnPackageForUser(mManagedProfileUserId)) + when(mVpnManager.getAlwaysOnVpnPackageForUser(mManagedProfileUserId)) .thenReturn(VPN_PACKAGE_ID); assertThat(mProvider.isAlwaysOnVpnSetInManagedProfile()).isTrue(); } diff --git a/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java b/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java index f214764ca75..ff5bb81df64 100644 --- a/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java +++ b/tests/unit/src/com/android/settings/vpn2/VpnUtilsTest.java @@ -21,7 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.net.ConnectivityManager; +import android.net.VpnManager; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -32,11 +32,11 @@ import org.junit.runner.RunWith; public final class VpnUtilsTest { @Test public void testIsAlwaysOnVpnSet() { - final ConnectivityManager cm = mock(ConnectivityManager.class); - when(cm.getAlwaysOnVpnPackageForUser(0)).thenReturn("com.example.vpn"); - assertThat(VpnUtils.isAlwaysOnVpnSet(cm, 0)).isTrue(); + final VpnManager vm = mock(VpnManager.class); + when(vm.getAlwaysOnVpnPackageForUser(0)).thenReturn("com.example.vpn"); + assertThat(VpnUtils.isAlwaysOnVpnSet(vm, 0)).isTrue(); - when(cm.getAlwaysOnVpnPackageForUser(0)).thenReturn(null); - assertThat(VpnUtils.isAlwaysOnVpnSet(cm, 0)).isFalse(); + when(vm.getAlwaysOnVpnPackageForUser(0)).thenReturn(null); + assertThat(VpnUtils.isAlwaysOnVpnSet(vm, 0)).isFalse(); } }