Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea3f9f33 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "RESTRICT AUTOMERGE Let advanced VPN profile visible immediately before...

Merge "RESTRICT AUTOMERGE Let advanced VPN profile visible immediately before the user consent to use VPN feature" into tm-qpr-dev
parents ec740c30 1311019b
Loading
Loading
Loading
Loading
+41 −1
Original line number Diff line number Diff line
@@ -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<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());
@@ -593,6 +617,19 @@ 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) {
@@ -602,6 +639,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
                    // Skip packages for users outside of our profile group.
                    continue;
                }
                if (isAdvancedVpn(featureProvider, pkg.getPackageName(), context)) {
                    continue;
                }
                // Look for a MODE_ALLOWED permission to activate VPN.
                boolean allowed = false;
                for (AppOpsManager.OpEntry op : pkg.getOps()) {
@@ -610,7 +650,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()));
                }
            }
+11 −8
Original line number Diff line number Diff line
@@ -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<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(),
@@ -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(),