From fc1ce57b13a9489f9eca0dbe36fcedb2939157ac Mon Sep 17 00:00:00 2001 From: Charles He Date: Thu, 8 Jun 2017 17:15:32 +0100 Subject: [PATCH] Disable always-on VPN options if an app has opted out. The user can turn on / off always-on for individual VPN apps in Settings > Network > VPN. Now that we're providing an opt-out of the always-on feature for VPN apps, we should disabled the toggles if the VPN app has an explicit opt-out. Related unit tests are also removed as the check is now performed in the frameworks, not in Settings. Bug: 36650087 Test: CTS Verifier Change-Id: I486fec14a1f8b86e7120dbdbfed3885801ab4dd7 --- .../settings/vpn2/AppManagementFragment.java | 22 +++--------- .../settings/vpn2/AppSettingsTest.java | 35 +++++-------------- 2 files changed, 13 insertions(+), 44 deletions(-) diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java index 9981b2fae84..9e215d1b7aa 100644 --- a/src/com/android/settings/vpn2/AppManagementFragment.java +++ b/src/com/android/settings/vpn2/AppManagementFragment.java @@ -15,6 +15,8 @@ */ package com.android.settings.vpn2; +import static android.app.AppOpsManager.OP_ACTIVATE_VPN; + import android.annotation.NonNull; import android.app.AlertDialog; import android.app.AppOpsManager; @@ -27,7 +29,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.IConnectivityManager; -import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; @@ -45,13 +46,11 @@ import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; -import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.RestrictedSwitchPreference; import java.util.List; -import static android.app.AppOpsManager.OP_ACTIVATE_VPN; - public class AppManagementFragment extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener, ConfirmLockdownFragment.ConfirmLockdownListener { @@ -223,19 +222,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment isEnabled ? mPackageName : null, isLockdown); } - @VisibleForTesting - static boolean isAlwaysOnSupportedByApp(@NonNull ApplicationInfo appInfo) { - final int targetSdk = appInfo.targetSdkVersion; - if (targetSdk < Build.VERSION_CODES.N) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Package " + appInfo.packageName + " targets SDK version: " + targetSdk - + "; must target at least " + Build.VERSION_CODES.N + " to use always-on."); - } - return false; - } - return true; - } - private void updateUI() { if (isAdded()) { final boolean alwaysOn = isVpnAlwaysOn(); @@ -257,7 +243,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment mPreferenceForget.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_VPN, mUserId); - if (isAlwaysOnSupportedByApp(mPackageInfo.applicationInfo)) { + if (mConnectivityManager.isAlwaysOnVpnPackageSupportedForUser(mUserId, mPackageName)) { // setSummary doesn't override the admin message when user restriction is applied mPreferenceAlwaysOn.setSummary(R.string.vpn_always_on_summary); // setEnabled is not required here, as checkRestrictionAndSetDisabled diff --git a/tests/unit/src/com/android/settings/vpn2/AppSettingsTest.java b/tests/unit/src/com/android/settings/vpn2/AppSettingsTest.java index fe437a6a122..fe074cc3e1e 100644 --- a/tests/unit/src/com/android/settings/vpn2/AppSettingsTest.java +++ b/tests/unit/src/com/android/settings/vpn2/AppSettingsTest.java @@ -16,26 +16,26 @@ package com.android.settings.vpn2; -import static com.android.settings.vpn2.AppManagementFragment.isAlwaysOnSupportedByApp; import static com.android.settings.vpn2.AppManagementFragment.appHasVpnPermission; -import static org.mockito.Mockito.*; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.content.Context; import android.content.pm.ApplicationInfo; -import android.os.Build; import android.os.Process; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; -import android.content.Context; - -import java.util.Arrays; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + public class AppSettingsTest extends AndroidTestCase { private static final String TAG = AppSettingsTest.class.getSimpleName(); @@ -48,23 +48,6 @@ public class AppSettingsTest extends AndroidTestCase { when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOps); } - @SmallTest - public void testAlwaysOnVersionRestriction() { - ApplicationInfo mockApp = createMockApp(); - - // API 23 (MNC) = not supported - mockApp.targetSdkVersion = Build.VERSION_CODES.M; - assertFalse(isAlwaysOnSupportedByApp(mockApp)); - - // API 24 (NYC) = supported - mockApp.targetSdkVersion = Build.VERSION_CODES.N; - assertTrue(isAlwaysOnSupportedByApp(mockApp)); - - // API 25 (NYC MR1) = supported - mockApp.targetSdkVersion = Build.VERSION_CODES.N_MR1; - assertTrue(isAlwaysOnSupportedByApp(mockApp)); - } - @SmallTest public void testAppOpsRequiredToOpenFragment() { ApplicationInfo mockApp = createMockApp();