Let advanced VPN profile visible immediately before the user consent to use VPN feature
- This CL will check whether advanced VPN apk is exist or not, and if so then show the preference of advanced VPN in the "Settings > Network & internet > VPN". Bug: 239984274 Test: atest -c VpnSettingsTest Change-Id: I8c11c7f2079d6ebec6c691b8bf2fb26dfc450663
This commit is contained in:
@@ -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,12 +617,26 @@ 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) {
|
||||||
for (AppOpsManager.PackageOps pkg : apps) {
|
for (AppOpsManager.PackageOps pkg : apps) {
|
||||||
int userId = UserHandle.getUserId(pkg.getUid());
|
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.
|
// Skip packages for users outside of our profile group.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -610,7 +648,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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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(),
|
||||||
|
Reference in New Issue
Block a user