Loading src/com/android/settings/vpn2/VpnSettings.java +40 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<AppOpsManager.PackageOps> 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<String, LegacyVpnInfo> getConnectedLegacyVpns() { mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId()); Loading Loading @@ -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<AppOpsManager.PackageOps> 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; } Loading @@ -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())); } } Loading tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java +11 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -69,6 +71,8 @@ public class VpnSettingsTest { @Mock private AppOpsManager mAppOpsManager; @Mock private PackageManager mPackageManager; private VpnSettings mVpnSettings; private Context mContext; Loading Loading @@ -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(); Loading Loading @@ -154,14 +159,10 @@ public class VpnSettingsTest { } @Test public void getVpnApps_isAdvancedVpn_returnsOne() { int uid = 1111; List<AppOpsManager.OpEntry> opEntries = new ArrayList<>(); List<AppOpsManager.PackageOps> 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(), Loading @@ -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(), Loading Loading
src/com/android/settings/vpn2/VpnSettings.java +40 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<AppOpsManager.PackageOps> 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<String, LegacyVpnInfo> getConnectedLegacyVpns() { mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId()); Loading Loading @@ -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<AppOpsManager.PackageOps> 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; } Loading @@ -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())); } } Loading
tests/unit/src/com/android/settings/vpn2/VpnSettingsTest.java +11 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -69,6 +71,8 @@ public class VpnSettingsTest { @Mock private AppOpsManager mAppOpsManager; @Mock private PackageManager mPackageManager; private VpnSettings mVpnSettings; private Context mContext; Loading Loading @@ -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(); Loading Loading @@ -154,14 +159,10 @@ public class VpnSettingsTest { } @Test public void getVpnApps_isAdvancedVpn_returnsOne() { int uid = 1111; List<AppOpsManager.OpEntry> opEntries = new ArrayList<>(); List<AppOpsManager.PackageOps> 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(), Loading @@ -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(), Loading