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
This commit is contained in:
@@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.vpn2;
|
package com.android.settings.vpn2;
|
||||||
|
|
||||||
|
import static android.app.AppOpsManager.OP_ACTIVATE_VPN;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
@@ -27,7 +29,6 @@ import android.content.pm.PackageManager;
|
|||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.IConnectivityManager;
|
import android.net.IConnectivityManager;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
@@ -45,13 +46,11 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
import com.android.settingslib.RestrictedSwitchPreference;
|
|
||||||
import com.android.settingslib.RestrictedPreference;
|
import com.android.settingslib.RestrictedPreference;
|
||||||
|
import com.android.settingslib.RestrictedSwitchPreference;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static android.app.AppOpsManager.OP_ACTIVATE_VPN;
|
|
||||||
|
|
||||||
public class AppManagementFragment extends SettingsPreferenceFragment
|
public class AppManagementFragment extends SettingsPreferenceFragment
|
||||||
implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
|
implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
|
||||||
ConfirmLockdownFragment.ConfirmLockdownListener {
|
ConfirmLockdownFragment.ConfirmLockdownListener {
|
||||||
@@ -223,19 +222,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment
|
|||||||
isEnabled ? mPackageName : null, isLockdown);
|
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() {
|
private void updateUI() {
|
||||||
if (isAdded()) {
|
if (isAdded()) {
|
||||||
final boolean alwaysOn = isVpnAlwaysOn();
|
final boolean alwaysOn = isVpnAlwaysOn();
|
||||||
@@ -257,7 +243,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment
|
|||||||
mPreferenceForget.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_VPN,
|
mPreferenceForget.checkRestrictionAndSetDisabled(UserManager.DISALLOW_CONFIG_VPN,
|
||||||
mUserId);
|
mUserId);
|
||||||
|
|
||||||
if (isAlwaysOnSupportedByApp(mPackageInfo.applicationInfo)) {
|
if (mConnectivityManager.isAlwaysOnVpnPackageSupportedForUser(mUserId, mPackageName)) {
|
||||||
// setSummary doesn't override the admin message when user restriction is applied
|
// setSummary doesn't override the admin message when user restriction is applied
|
||||||
mPreferenceAlwaysOn.setSummary(R.string.vpn_always_on_summary);
|
mPreferenceAlwaysOn.setSummary(R.string.vpn_always_on_summary);
|
||||||
// setEnabled is not required here, as checkRestrictionAndSetDisabled
|
// setEnabled is not required here, as checkRestrictionAndSetDisabled
|
||||||
|
@@ -16,26 +16,26 @@
|
|||||||
|
|
||||||
package com.android.settings.vpn2;
|
package com.android.settings.vpn2;
|
||||||
|
|
||||||
import static com.android.settings.vpn2.AppManagementFragment.isAlwaysOnSupportedByApp;
|
|
||||||
import static com.android.settings.vpn2.AppManagementFragment.appHasVpnPermission;
|
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.app.AppOpsManager;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
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.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
public class AppSettingsTest extends AndroidTestCase {
|
public class AppSettingsTest extends AndroidTestCase {
|
||||||
private static final String TAG = AppSettingsTest.class.getSimpleName();
|
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);
|
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
|
@SmallTest
|
||||||
public void testAppOpsRequiredToOpenFragment() {
|
public void testAppOpsRequiredToOpenFragment() {
|
||||||
ApplicationInfo mockApp = createMockApp();
|
ApplicationInfo mockApp = createMockApp();
|
||||||
|
Reference in New Issue
Block a user