diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java index 43805956b6e..2cb07022372 100644 --- a/src/com/android/settings/vpn2/VpnSettings.java +++ b/src/com/android/settings/vpn2/VpnSettings.java @@ -26,6 +26,7 @@ import android.app.AppOpsManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.ConnectivityManager; @@ -534,9 +535,32 @@ public class VpnSettings extends RestrictedSettingsFragment implements pref.setOnPreferenceClickListener(this); mAppPreferences.put(app, pref); } + enableAdvancedVpnGearIconIfNecessary(pref); return pref; } + private void enableAdvancedVpnGearIconIfNecessary(AppPreference pref) { + Context context = getContext(); + if (!isAdvancedVpn(mFeatureProvider, pref.getPackageName(), context)) { + return; + } + + boolean isEnabled = false; + AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); + List apps = + appOpsManager.getPackagesForOps( + new int[] {OP_ACTIVATE_VPN, OP_ACTIVATE_PLATFORM_VPN}); + if (apps != null) { + for (AppOpsManager.PackageOps pkg : apps) { + if (isAdvancedVpn(mFeatureProvider, pkg.getPackageName(), context)) { + isEnabled = true; + break; + } + } + } + pref.setOnGearClickListener(isEnabled ? mGearListener : null); + } + @WorkerThread private Map getConnectedLegacyVpns() { mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId()); @@ -593,12 +617,26 @@ public class VpnSettings extends RestrictedSettingsFragment implements profileIds = Collections.singleton(UserHandle.myUserId()); } + if (featureProvider.isAdvancedVpnSupported(context)) { + PackageManager pm = context.getPackageManager(); + try { + ApplicationInfo appInfo = + pm.getApplicationInfo( + featureProvider.getAdvancedVpnPackageName(), /* flags= */ 0); + int userId = UserHandle.getUserId(appInfo.uid); + result.add(new AppVpnInfo(userId, featureProvider.getAdvancedVpnPackageName())); + } catch (PackageManager.NameNotFoundException e) { + Log.e(LOG_TAG, "Advanced VPN package name not found.", e); + } + } + List apps = aom.getPackagesForOps(new int[] {OP_ACTIVATE_VPN, OP_ACTIVATE_PLATFORM_VPN}); if (apps != null) { for (AppOpsManager.PackageOps pkg : apps) { int userId = UserHandle.getUserId(pkg.getUid()); - if (!profileIds.contains(userId)) { + if (!profileIds.contains(userId) + || isAdvancedVpn(featureProvider, pkg.getPackageName(), context)) { // Skip packages for users outside of our profile group. continue; } @@ -610,7 +648,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements allowed = true; } } - if (allowed || isAdvancedVpn(featureProvider, pkg.getPackageName(), context)) { + if (allowed) { result.add(new AppVpnInfo(userId, pkg.getPackageName())); } } diff --git a/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java b/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java index 86bd1e741a2..d6ba33a3bc2 100644 --- a/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java +++ b/tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java @@ -20,12 +20,14 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Looper; import android.os.UserHandle; @@ -69,6 +71,8 @@ public class VpnSettingsTest { @Mock private AppOpsManager mAppOpsManager; + @Mock + private PackageManager mPackageManager; private VpnSettings mVpnSettings; private Context mContext; @@ -107,6 +111,7 @@ public class VpnSettingsTest { .thenReturn(ADVANCED_VPN_GROUP_PACKAGE_NAME); when(mFakeFeatureFactory.mAdvancedVpnFeatureProvider.isAdvancedVpnSupported(any())) .thenReturn(true); + when(mContext.getPackageManager()).thenReturn(mPackageManager); doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt()); doReturn(mContext).when(mContext).createPackageContextAsUser(any(), anyInt(), any()); doReturn(mPreferenceManager).when(mVpnGroup).getPreferenceManager(); @@ -154,14 +159,10 @@ public class VpnSettingsTest { } @Test - public void getVpnApps_isAdvancedVpn_returnsOne() { - int uid = 1111; - List opEntries = new ArrayList<>(); - List apps = new ArrayList<>(); - AppOpsManager.PackageOps packageOps = - new AppOpsManager.PackageOps(ADVANCED_VPN_GROUP_PACKAGE_NAME, uid, opEntries); - apps.add(packageOps); - when(mAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(apps); + public void getVpnApps_isAdvancedVpn_returnsOne() throws Exception { + ApplicationInfo info = new ApplicationInfo(); + info.uid = 1111; + when(mPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(info); assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false, mFakeFeatureFactory.getAdvancedVpnFeatureProvider(), @@ -177,6 +178,8 @@ public class VpnSettingsTest { new AppOpsManager.PackageOps(FAKE_PACKAGE_NAME, uid, opEntries); apps.add(packageOps); when(mAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(apps); + when(mFakeFeatureFactory.mAdvancedVpnFeatureProvider.isAdvancedVpnSupported(any())) + .thenReturn(false); assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false, mFakeFeatureFactory.getAdvancedVpnFeatureProvider(),