Merge "Switch Settings from IConnectivityManager to VpnManager."

This commit is contained in:
Treehugger Robot
2021-02-09 09:09:35 +00:00
committed by Gerrit Code Review
6 changed files with 56 additions and 108 deletions

View File

@@ -19,12 +19,10 @@ import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IConnectivityManager;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.os.RemoteException; import android.net.VpnManager;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
@@ -64,7 +62,7 @@ public class VpnPreferenceController extends AbstractPreferenceController
private final String mToggleable; private final String mToggleable;
private final UserManager mUserManager; private final UserManager mUserManager;
private final ConnectivityManager mConnectivityManager; private final ConnectivityManager mConnectivityManager;
private final IConnectivityManager mConnectivityManagerService; private final VpnManager mVpnManager;
private Preference mPreference; private Preference mPreference;
public VpnPreferenceController(Context context) { public VpnPreferenceController(Context context) {
@@ -74,8 +72,7 @@ public class VpnPreferenceController extends AbstractPreferenceController
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mConnectivityManager = mConnectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mConnectivityManagerService = IConnectivityManager.Stub.asInterface( mVpnManager = context.getSystemService(VpnManager.class);
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
} }
@Override @Override
@@ -122,27 +119,20 @@ public class VpnPreferenceController extends AbstractPreferenceController
} }
// Copied from SystemUI::SecurityControllerImpl // Copied from SystemUI::SecurityControllerImpl
SparseArray<VpnConfig> vpns = new SparseArray<>(); SparseArray<VpnConfig> vpns = new SparseArray<>();
try { final List<UserInfo> users = mUserManager.getUsers();
final List<UserInfo> users = mUserManager.getUsers(); for (UserInfo user : users) {
for (UserInfo user : users) { VpnConfig cfg = mVpnManager.getVpnConfig(user.id);
VpnConfig cfg = mConnectivityManagerService.getVpnConfig(user.id); if (cfg == null) {
if (cfg == null) { continue;
} else if (cfg.legacy) {
// Legacy VPNs should do nothing if the network is disconnected. Third-party
// VPN warnings need to continue as traffic can still go to the app.
final LegacyVpnInfo legacyVpn = mVpnManager.getLegacyVpnInfo(user.id);
if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
continue; continue;
} else if (cfg.legacy) {
// Legacy VPNs should do nothing if the network is disconnected. Third-party
// VPN warnings need to continue as traffic can still go to the app.
final LegacyVpnInfo legacyVpn =
mConnectivityManagerService.getLegacyVpnInfo(user.id);
if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
continue;
}
} }
vpns.put(user.id, cfg);
} }
} catch (RemoteException rme) { vpns.put(user.id, cfg);
// Roll back to previous state
Log.e(TAG, "Unable to list active VPNs", rme);
return;
} }
final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId()); final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId());
final int uid; final int uid;

View File

@@ -18,17 +18,13 @@ package com.android.settings.vpn2;
import android.app.Dialog; import android.app.Dialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.net.IConnectivityManager; import android.net.ConnectivityManager;
import android.net.VpnManager; import android.net.VpnManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.util.Log;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@@ -52,9 +48,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
private PackageInfo mPackageInfo; private PackageInfo mPackageInfo;
private Listener mListener; private Listener mListener;
private ConnectivityManager mConnectivityManager;
private UserManager mUserManager; private UserManager mUserManager;
private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface( private VpnManager mVpnManager;
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -97,7 +93,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
mUserManager = UserManager.get(getContext()); mUserManager = UserManager.get(getContext());
mVpnManager = getContext().getSystemService(VpnManager.class);
} }
@Override @Override
@@ -145,14 +143,9 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
return; return;
} }
final int userId = getUserId(); final int userId = getUserId();
try { mVpnManager.setVpnPackageAuthorization(
mService.setVpnPackageAuthorization( mPackageInfo.packageName, userId, VpnManager.TYPE_VPN_NONE);
mPackageInfo.packageName, userId, VpnManager.TYPE_VPN_NONE); onDisconnect(dialog);
onDisconnect(dialog);
} catch (RemoteException e) {
Log.e(TAG, "Failed to forget authorization of " + mPackageInfo.packageName +
" for user " + userId, e);
}
if (mListener != null) { if (mListener != null) {
mListener.onForget(); mListener.onForget();
@@ -164,15 +157,10 @@ public class AppDialogFragment extends InstrumentedDialogFragment implements App
return; return;
} }
final int userId = getUserId(); final int userId = getUserId();
try { if (mPackageInfo.packageName.equals(VpnUtils.getConnectedPackage(mVpnManager, userId))) {
if (mPackageInfo.packageName.equals(VpnUtils.getConnectedPackage(mService, userId))) { mConnectivityManager.setAlwaysOnVpnPackageForUser(userId, null,
mService.setAlwaysOnVpnPackage(userId, null, /* lockdownEnabled */ false, /* lockdownEnabled */ false, /* lockdownAllowlist */ null);
/* lockdownWhitelist */ null); mVpnManager.prepareVpn(mPackageInfo.packageName, VpnConfig.LEGACY_VPN, userId);
mService.prepareVpn(mPackageInfo.packageName, VpnConfig.LEGACY_VPN, userId);
}
} catch (RemoteException e) {
Log.e(TAG, "Failed to disconnect package " + mPackageInfo.packageName +
" for user " + userId, e);
} }
} }

View File

@@ -29,10 +29,8 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; 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.VpnManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.text.TextUtils; import android.text.TextUtils;
@@ -72,7 +70,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment
private PackageManager mPackageManager; private PackageManager mPackageManager;
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
private ConnectivityManager mConnectivityManager; private ConnectivityManager mConnectivityManager;
private IConnectivityManager mConnectivityService; private VpnManager mVpnManager;
// VPN app info // VPN app info
private final int mUserId = UserHandle.myUserId(); private final int mUserId = UserHandle.myUserId();
@@ -125,8 +123,7 @@ public class AppManagementFragment extends SettingsPreferenceFragment
mPackageManager = getContext().getPackageManager(); mPackageManager = getContext().getPackageManager();
mDevicePolicyManager = getContext().getSystemService(DevicePolicyManager.class); mDevicePolicyManager = getContext().getSystemService(DevicePolicyManager.class);
mConnectivityManager = getContext().getSystemService(ConnectivityManager.class); mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
mConnectivityService = IConnectivityManager.Stub mVpnManager = getContext().getSystemService(VpnManager.class);
.asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
mPreferenceVersion = findPreference(KEY_VERSION); mPreferenceVersion = findPreference(KEY_VERSION);
mPreferenceAlwaysOn = (RestrictedSwitchPreference) findPreference(KEY_ALWAYS_ON_VPN); mPreferenceAlwaysOn = (RestrictedSwitchPreference) findPreference(KEY_ALWAYS_ON_VPN);
@@ -335,13 +332,8 @@ public class AppManagementFragment extends SettingsPreferenceFragment
* @return {@code true} if another VPN (VpnService or legacy) is connected or set as always-on. * @return {@code true} if another VPN (VpnService or legacy) is connected or set as always-on.
*/ */
private boolean isAnotherVpnActive() { private boolean isAnotherVpnActive() {
try { final VpnConfig config = mVpnManager.getVpnConfig(mUserId);
final VpnConfig config = mConnectivityService.getVpnConfig(mUserId); return config != null && !TextUtils.equals(config.user, mPackageName);
return config != null && !TextUtils.equals(config.user, mPackageName);
} catch (RemoteException e) {
Log.w(TAG, "Failure to look up active VPN", e);
return false;
}
} }
public static class CannotConnectFragment extends InstrumentedDialogFragment { public static class CannotConnectFragment extends InstrumentedDialogFragment {

View File

@@ -21,10 +21,9 @@ import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IConnectivityManager; import android.net.VpnManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.security.Credentials; import android.security.Credentials;
import android.security.KeyStore; import android.security.KeyStore;
@@ -52,9 +51,8 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
private static final String ARG_EDITING = "editing"; private static final String ARG_EDITING = "editing";
private static final String ARG_EXISTS = "exists"; private static final String ARG_EXISTS = "exists";
private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
private Context mContext; private Context mContext;
private VpnManager mService;
@Override @Override
@@ -80,6 +78,7 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
public void onAttach(final Context context) { public void onAttach(final Context context) {
super.onAttach(context); super.onAttach(context);
mContext = context; mContext = context;
mService = context.getSystemService(VpnManager.class);
} }
@Override @Override
@@ -212,8 +211,6 @@ public class ConfigDialogFragment extends InstrumentedDialogFragment implements
mService.startLegacyVpn(profile); mService.startLegacyVpn(profile);
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
Toast.makeText(mContext, R.string.vpn_no_network, Toast.LENGTH_LONG).show(); Toast.makeText(mContext, R.string.vpn_no_network, Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
Log.e(TAG, "Failed to connect", e);
} }
} }
} }

View File

@@ -30,16 +30,14 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.VpnManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Message; import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.security.Credentials; import android.security.Credentials;
@@ -92,10 +90,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.build(); .build();
private final IConnectivityManager mConnectivityService = IConnectivityManager.Stub
.asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
private ConnectivityManager mConnectivityManager; private ConnectivityManager mConnectivityManager;
private UserManager mUserManager; private UserManager mUserManager;
private VpnManager mVpnManager;
private final KeyStore mKeyStore = KeyStore.getInstance(); private final KeyStore mKeyStore = KeyStore.getInstance();
@@ -124,6 +121,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements
mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
mVpnManager = (VpnManager) getSystemService(Context.VPN_MANAGEMENT_SERVICE);
mUnavailable = isUiRestricted(); mUnavailable = isUiRestricted();
setHasOptionsMenu(!mUnavailable); setHasOptionsMenu(!mUnavailable);
@@ -467,13 +465,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
@WorkerThread @WorkerThread
private Map<String, LegacyVpnInfo> getConnectedLegacyVpns() { private Map<String, LegacyVpnInfo> getConnectedLegacyVpns() {
try { mConnectedLegacyVpn = mVpnManager.getLegacyVpnInfo(UserHandle.myUserId());
mConnectedLegacyVpn = mConnectivityService.getLegacyVpnInfo(UserHandle.myUserId()); if (mConnectedLegacyVpn != null) {
if (mConnectedLegacyVpn != null) { return Collections.singletonMap(mConnectedLegacyVpn.key, mConnectedLegacyVpn);
return Collections.singletonMap(mConnectedLegacyVpn.key, mConnectedLegacyVpn);
}
} catch (RemoteException e) {
Log.e(LOG_TAG, "Failure updating VPN list with connected legacy VPNs", e);
} }
return Collections.emptyMap(); return Collections.emptyMap();
} }
@@ -482,15 +476,11 @@ public class VpnSettings extends RestrictedSettingsFragment implements
private Set<AppVpnInfo> getConnectedAppVpns() { private Set<AppVpnInfo> getConnectedAppVpns() {
// Mark connected third-party services // Mark connected third-party services
Set<AppVpnInfo> connections = new ArraySet<>(); Set<AppVpnInfo> connections = new ArraySet<>();
try { for (UserHandle profile : mUserManager.getUserProfiles()) {
for (UserHandle profile : mUserManager.getUserProfiles()) { VpnConfig config = mVpnManager.getVpnConfig(profile.getIdentifier());
VpnConfig config = mConnectivityService.getVpnConfig(profile.getIdentifier()); if (config != null && !config.legacy) {
if (config != null && !config.legacy) { connections.add(new AppVpnInfo(profile.getIdentifier(), config.user));
connections.add(new AppVpnInfo(profile.getIdentifier(), config.user));
}
} }
} catch (RemoteException e) {
Log.e(LOG_TAG, "Failure updating VPN list with connected app VPNs", e);
} }
return connections; return connections;
} }

View File

@@ -17,13 +17,11 @@ package com.android.settings.vpn2;
import android.content.Context; import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IConnectivityManager; import android.net.VpnManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings; import android.provider.Settings;
import android.security.Credentials; import android.security.Credentials;
import android.security.KeyStore; import android.security.KeyStore;
import android.util.Log;
import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnConfig;
@@ -71,12 +69,11 @@ public class VpnUtils {
} }
public static boolean isVpnActive(Context context) throws RemoteException { public static boolean isVpnActive(Context context) throws RemoteException {
return getIConnectivityManager().getVpnConfig(context.getUserId()) != null; return getVpnManager(context).getVpnConfig(context.getUserId()) != null;
} }
public static String getConnectedPackage(IConnectivityManager service, final int userId) public static String getConnectedPackage(VpnManager vpnManager, final int userId) {
throws RemoteException { final VpnConfig config = vpnManager.getVpnConfig(userId);
final VpnConfig config = service.getVpnConfig(userId);
return config != null ? config.user : null; return config != null ? config.user : null;
} }
@@ -84,9 +81,8 @@ public class VpnUtils {
return context.getSystemService(ConnectivityManager.class); return context.getSystemService(ConnectivityManager.class);
} }
private static IConnectivityManager getIConnectivityManager() { private static VpnManager getVpnManager(Context context) {
return IConnectivityManager.Stub.asInterface( return context.getSystemService(VpnManager.class);
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
} }
public static boolean isAlwaysOnVpnSet(ConnectivityManager cm, final int userId) { public static boolean isAlwaysOnVpnSet(ConnectivityManager cm, final int userId) {
@@ -94,17 +90,12 @@ public class VpnUtils {
} }
public static boolean disconnectLegacyVpn(Context context) { public static boolean disconnectLegacyVpn(Context context) {
try { int userId = context.getUserId();
int userId = context.getUserId(); LegacyVpnInfo currentLegacyVpn = getVpnManager(context).getLegacyVpnInfo(userId);
IConnectivityManager connectivityService = getIConnectivityManager(); if (currentLegacyVpn != null) {
LegacyVpnInfo currentLegacyVpn = connectivityService.getLegacyVpnInfo(userId); clearLockdownVpn(context);
if (currentLegacyVpn != null) { getVpnManager(context).prepareVpn(null, VpnConfig.LEGACY_VPN, userId);
clearLockdownVpn(context); return true;
connectivityService.prepareVpn(null, VpnConfig.LEGACY_VPN, userId);
return true;
}
} catch (RemoteException e) {
Log.e(TAG, "Legacy VPN could not be disconnected", e);
} }
return false; return false;
} }