RESTRICT AUTOMERGE Let advanced VPN profile visible immediately before the user consent to use VPN feature am: 1311019b9a

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/19447622

Change-Id: I3dd165a645a1bb63613d541453e32d7c943df776
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Hugh Chen
2022-08-16 04:37:06 +00:00
committed by Automerger Merge Worker
2 changed files with 52 additions and 9 deletions

View File

@@ -26,6 +26,7 @@ import android.app.AppOpsManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@@ -534,9 +535,32 @@ public class VpnSettings extends RestrictedSettingsFragment implements
pref.setOnPreferenceClickListener(this); pref.setOnPreferenceClickListener(this);
mAppPreferences.put(app, pref); mAppPreferences.put(app, pref);
} }
enableAdvancedVpnGearIconIfNecessary(pref);
return 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 @WorkerThread
private Map<String, LegacyVpnInfo> getConnectedLegacyVpns() { private Map<String, LegacyVpnInfo> getConnectedLegacyVpns() {
mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId()); mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId());
@@ -593,6 +617,19 @@ public class VpnSettings extends RestrictedSettingsFragment implements
profileIds = Collections.singleton(UserHandle.myUserId()); 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 = List<AppOpsManager.PackageOps> apps =
aom.getPackagesForOps(new int[] {OP_ACTIVATE_VPN, OP_ACTIVATE_PLATFORM_VPN}); aom.getPackagesForOps(new int[] {OP_ACTIVATE_VPN, OP_ACTIVATE_PLATFORM_VPN});
if (apps != null) { if (apps != null) {
@@ -602,6 +639,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
// Skip packages for users outside of our profile group. // Skip packages for users outside of our profile group.
continue; continue;
} }
if (isAdvancedVpn(featureProvider, pkg.getPackageName(), context)) {
continue;
}
// Look for a MODE_ALLOWED permission to activate VPN. // Look for a MODE_ALLOWED permission to activate VPN.
boolean allowed = false; boolean allowed = false;
for (AppOpsManager.OpEntry op : pkg.getOps()) { for (AppOpsManager.OpEntry op : pkg.getOps()) {
@@ -610,7 +650,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements
allowed = true; allowed = true;
} }
} }
if (allowed || isAdvancedVpn(featureProvider, pkg.getPackageName(), context)) { if (allowed) {
result.add(new AppVpnInfo(userId, pkg.getPackageName())); result.add(new AppVpnInfo(userId, pkg.getPackageName()));
} }
} }

View File

@@ -20,12 +20,14 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Looper; import android.os.Looper;
import android.os.UserHandle; import android.os.UserHandle;
@@ -69,6 +71,8 @@ public class VpnSettingsTest {
@Mock @Mock
private AppOpsManager mAppOpsManager; private AppOpsManager mAppOpsManager;
@Mock
private PackageManager mPackageManager;
private VpnSettings mVpnSettings; private VpnSettings mVpnSettings;
private Context mContext; private Context mContext;
@@ -107,6 +111,7 @@ public class VpnSettingsTest {
.thenReturn(ADVANCED_VPN_GROUP_PACKAGE_NAME); .thenReturn(ADVANCED_VPN_GROUP_PACKAGE_NAME);
when(mFakeFeatureFactory.mAdvancedVpnFeatureProvider.isAdvancedVpnSupported(any())) when(mFakeFeatureFactory.mAdvancedVpnFeatureProvider.isAdvancedVpnSupported(any()))
.thenReturn(true); .thenReturn(true);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt()); doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
doReturn(mContext).when(mContext).createPackageContextAsUser(any(), anyInt(), any()); doReturn(mContext).when(mContext).createPackageContextAsUser(any(), anyInt(), any());
doReturn(mPreferenceManager).when(mVpnGroup).getPreferenceManager(); doReturn(mPreferenceManager).when(mVpnGroup).getPreferenceManager();
@@ -154,14 +159,10 @@ public class VpnSettingsTest {
} }
@Test @Test
public void getVpnApps_isAdvancedVpn_returnsOne() { public void getVpnApps_isAdvancedVpn_returnsOne() throws Exception {
int uid = 1111; ApplicationInfo info = new ApplicationInfo();
List<AppOpsManager.OpEntry> opEntries = new ArrayList<>(); info.uid = 1111;
List<AppOpsManager.PackageOps> apps = new ArrayList<>(); when(mPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(info);
AppOpsManager.PackageOps packageOps =
new AppOpsManager.PackageOps(ADVANCED_VPN_GROUP_PACKAGE_NAME, uid, opEntries);
apps.add(packageOps);
when(mAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(apps);
assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false, assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false,
mFakeFeatureFactory.getAdvancedVpnFeatureProvider(), mFakeFeatureFactory.getAdvancedVpnFeatureProvider(),
@@ -177,6 +178,8 @@ public class VpnSettingsTest {
new AppOpsManager.PackageOps(FAKE_PACKAGE_NAME, uid, opEntries); new AppOpsManager.PackageOps(FAKE_PACKAGE_NAME, uid, opEntries);
apps.add(packageOps); apps.add(packageOps);
when(mAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(apps); when(mAppOpsManager.getPackagesForOps((int[]) any())).thenReturn(apps);
when(mFakeFeatureFactory.mAdvancedVpnFeatureProvider.isAdvancedVpnSupported(any()))
.thenReturn(false);
assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false, assertThat(VpnSettings.getVpnApps(mContext, /* includeProfiles= */ false,
mFakeFeatureFactory.getAdvancedVpnFeatureProvider(), mFakeFeatureFactory.getAdvancedVpnFeatureProvider(),