[Tether13] Move TetheringManager into framework

Move tethering out of ConnectivityService. All client would
use TetheringManager to talk with TetheringService directly.

Bug: 144320246
Test: -build, flash, boot
      -atest TetheringTests

Change-Id: Ib051bea724a256f9c4572b566e46ae7b9c4abe6e
Merged-In: Ib051bea724a256f9c4572b566e46ae7b9c4abe6e
This commit is contained in:
markchien
2019-12-16 20:15:20 +08:00
parent 5966c91e94
commit 5776f96096
5 changed files with 85 additions and 362 deletions

View File

@@ -50,6 +50,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.ServiceSpecificException; import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -57,7 +58,6 @@ import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.android.internal.util.Protocol; import com.android.internal.util.Protocol;
@@ -802,6 +802,7 @@ public class ConnectivityManager {
private INetworkManagementService mNMService; private INetworkManagementService mNMService;
private INetworkPolicyManager mNPManager; private INetworkPolicyManager mNPManager;
private TetheringManager mTetheringManager;
/** /**
* Tests if a given integer represents a valid network type. * Tests if a given integer represents a valid network type.
@@ -2340,6 +2341,28 @@ public class ConnectivityManager {
return getInstanceOrNull(); return getInstanceOrNull();
} }
private static final int TETHERING_TIMEOUT_MS = 60_000;
private final Object mTetheringLock = new Object();
private TetheringManager getTetheringManager() {
synchronized (mTetheringLock) {
if (mTetheringManager != null) {
return mTetheringManager;
}
final long before = System.currentTimeMillis();
while ((mTetheringManager = (TetheringManager) mContext.getSystemService(
Context.TETHERING_SERVICE)) == null) {
if (System.currentTimeMillis() - before > TETHERING_TIMEOUT_MS) {
Log.e(TAG, "Timeout waiting tethering service not ready yet");
throw new IllegalStateException("No tethering service yet");
}
SystemClock.sleep(100);
}
return mTetheringManager;
}
}
/** /**
* Get the set of tetherable, available interfaces. This list is limited by * Get the set of tetherable, available interfaces. This list is limited by
* device configuration and current interface existence. * device configuration and current interface existence.
@@ -2351,11 +2374,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetherableIfaces() { public String[] getTetherableIfaces() {
try { return getTetheringManager().getTetherableIfaces();
return mService.getTetherableIfaces();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2368,11 +2387,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetheredIfaces() { public String[] getTetheredIfaces() {
try { return getTetheringManager().getTetheredIfaces();
return mService.getTetheredIfaces();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2391,11 +2406,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetheringErroredIfaces() { public String[] getTetheringErroredIfaces() {
try { return getTetheringManager().getTetheringErroredIfaces();
return mService.getTetheringErroredIfaces();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2406,11 +2417,7 @@ public class ConnectivityManager {
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public String[] getTetheredDhcpRanges() { public String[] getTetheredDhcpRanges() {
try { return getTetheringManager().getTetheredDhcpRanges();
return mService.getTetheredDhcpRanges();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2439,13 +2446,7 @@ public class ConnectivityManager {
*/ */
@UnsupportedAppUsage @UnsupportedAppUsage
public int tether(String iface) { public int tether(String iface) {
try { return getTetheringManager().tether(iface);
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "tether caller:" + pkgName);
return mService.tether(iface, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2468,13 +2469,7 @@ public class ConnectivityManager {
*/ */
@UnsupportedAppUsage @UnsupportedAppUsage
public int untether(String iface) { public int untether(String iface) {
try { return getTetheringManager().untether(iface);
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "untether caller:" + pkgName);
return mService.untether(iface, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2499,16 +2494,7 @@ public class ConnectivityManager {
@RequiresPermission(anyOf = {android.Manifest.permission.TETHER_PRIVILEGED, @RequiresPermission(anyOf = {android.Manifest.permission.TETHER_PRIVILEGED,
android.Manifest.permission.WRITE_SETTINGS}) android.Manifest.permission.WRITE_SETTINGS})
public boolean isTetheringSupported() { public boolean isTetheringSupported() {
String pkgName = mContext.getOpPackageName(); return getTetheringManager().isTetheringSupported();
try {
return mService.isTetheringSupported(pkgName);
} catch (SecurityException e) {
// This API is not available to this caller, but for backward-compatibility
// this will just return false instead of throwing.
return false;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2577,14 +2563,7 @@ public class ConnectivityManager {
} }
}; };
try { getTetheringManager().startTethering(type, wrappedCallback, showProvisioningUi);
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "startTethering caller:" + pkgName);
mService.startTethering(type, wrappedCallback, showProvisioningUi, pkgName);
} catch (RemoteException e) {
Log.e(TAG, "Exception trying to start tethering.", e);
wrappedCallback.send(TETHER_ERROR_SERVICE_UNAVAIL, null);
}
} }
/** /**
@@ -2600,13 +2579,7 @@ public class ConnectivityManager {
@SystemApi @SystemApi
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public void stopTethering(int type) { public void stopTethering(int type) {
try { getTetheringManager().stopTethering(type);
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "stopTethering caller:" + pkgName);
mService.stopTethering(type, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2628,10 +2601,6 @@ public class ConnectivityManager {
public void onUpstreamChanged(@Nullable Network network) {} public void onUpstreamChanged(@Nullable Network network) {}
} }
@GuardedBy("mTetheringEventCallbacks")
private final ArrayMap<OnTetheringEventCallback, ITetheringEventCallback>
mTetheringEventCallbacks = new ArrayMap<>();
/** /**
* Start listening to tethering change events. Any new added callback will receive the last * Start listening to tethering change events. Any new added callback will receive the last
* tethering status right away. If callback is registered when tethering has no upstream or * tethering status right away. If callback is registered when tethering has no upstream or
@@ -2649,27 +2618,7 @@ public class ConnectivityManager {
@NonNull final OnTetheringEventCallback callback) { @NonNull final OnTetheringEventCallback callback) {
Preconditions.checkNotNull(callback, "OnTetheringEventCallback cannot be null."); Preconditions.checkNotNull(callback, "OnTetheringEventCallback cannot be null.");
synchronized (mTetheringEventCallbacks) { getTetheringManager().registerTetheringEventCallback(executor, callback);
Preconditions.checkArgument(!mTetheringEventCallbacks.containsKey(callback),
"callback was already registered.");
ITetheringEventCallback remoteCallback = new ITetheringEventCallback.Stub() {
@Override
public void onUpstreamChanged(Network network) throws RemoteException {
Binder.withCleanCallingIdentity(() ->
executor.execute(() -> {
callback.onUpstreamChanged(network);
}));
}
};
try {
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "registerTetheringUpstreamCallback:" + pkgName);
mService.registerTetheringEventCallback(remoteCallback, pkgName);
mTetheringEventCallbacks.put(callback, remoteCallback);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
} }
/** /**
@@ -2683,17 +2632,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public void unregisterTetheringEventCallback( public void unregisterTetheringEventCallback(
@NonNull final OnTetheringEventCallback callback) { @NonNull final OnTetheringEventCallback callback) {
synchronized (mTetheringEventCallbacks) { getTetheringManager().unregisterTetheringEventCallback(callback);
ITetheringEventCallback remoteCallback = mTetheringEventCallbacks.remove(callback);
Preconditions.checkNotNull(remoteCallback, "callback was not registered.");
try {
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "unregisterTetheringEventCallback:" + pkgName);
mService.unregisterTetheringEventCallback(remoteCallback, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
} }
@@ -2710,11 +2649,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetherableUsbRegexs() { public String[] getTetherableUsbRegexs() {
try { return getTetheringManager().getTetherableUsbRegexs();
return mService.getTetherableUsbRegexs();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2730,11 +2665,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetherableWifiRegexs() { public String[] getTetherableWifiRegexs() {
try { return getTetheringManager().getTetherableWifiRegexs();
return mService.getTetherableWifiRegexs();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2750,11 +2681,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public String[] getTetherableBluetoothRegexs() { public String[] getTetherableBluetoothRegexs() {
try { return getTetheringManager().getTetherableBluetoothRegexs();
return mService.getTetherableBluetoothRegexs();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -2776,13 +2703,7 @@ public class ConnectivityManager {
*/ */
@UnsupportedAppUsage @UnsupportedAppUsage
public int setUsbTethering(boolean enable) { public int setUsbTethering(boolean enable) {
try { return getTetheringManager().setUsbTethering(enable);
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "setUsbTethering caller:" + pkgName);
return mService.setUsbTethering(enable, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** {@hide} */ /** {@hide} */
@@ -2830,11 +2751,7 @@ public class ConnectivityManager {
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
@UnsupportedAppUsage @UnsupportedAppUsage
public int getLastTetherError(String iface) { public int getLastTetherError(String iface) {
try { return getTetheringManager().getLastTetherError(iface);
return mService.getLastTetherError(iface);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** @hide */ /** @hide */
@@ -2900,14 +2817,8 @@ public class ConnectivityManager {
} }
}; };
try { getTetheringManager().requestLatestTetheringEntitlementResult(type, wrappedListener,
String pkgName = mContext.getOpPackageName(); showEntitlementUi);
Log.i(TAG, "getLatestTetheringEntitlementResult:" + pkgName);
mService.getLatestTetheringEntitlementResult(type, wrappedListener,
showEntitlementUi, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} }
/** /**
@@ -4332,6 +4243,7 @@ public class ConnectivityManager {
public void factoryReset() { public void factoryReset() {
try { try {
mService.factoryReset(); mService.factoryReset();
getTetheringManager().stopAllTethering();
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }

View File

@@ -19,7 +19,6 @@ package android.net;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.net.ConnectionInfo; import android.net.ConnectionInfo;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.ITetheringEventCallback;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkInfo; import android.net.NetworkInfo;
@@ -78,41 +77,31 @@ interface IConnectivityManager
boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress); boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress);
int tether(String iface, String callerPkg); @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getLastTetherError} as alternative")
int untether(String iface, String callerPkg);
@UnsupportedAppUsage
int getLastTetherError(String iface); int getLastTetherError(String iface);
boolean isTetheringSupported(String callerPkg); @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getTetherableIfaces} as alternative")
void startTethering(int type, in ResultReceiver receiver, boolean showProvisioningUi,
String callerPkg);
void stopTethering(int type, String callerPkg);
@UnsupportedAppUsage
String[] getTetherableIfaces(); String[] getTetherableIfaces();
@UnsupportedAppUsage @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getTetheredIfaces} as alternative")
String[] getTetheredIfaces(); String[] getTetheredIfaces();
@UnsupportedAppUsage @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getTetheringErroredIfaces} "
+ "as Alternative")
String[] getTetheringErroredIfaces(); String[] getTetheringErroredIfaces();
String[] getTetheredDhcpRanges(); @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getTetherableUsbRegexs} as alternative")
@UnsupportedAppUsage
String[] getTetherableUsbRegexs(); String[] getTetherableUsbRegexs();
@UnsupportedAppUsage @UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getTetherableWifiRegexs} as alternative")
String[] getTetherableWifiRegexs(); String[] getTetherableWifiRegexs();
String[] getTetherableBluetoothRegexs();
int setUsbTethering(boolean enable, String callerPkg);
@UnsupportedAppUsage(maxTargetSdk = 28) @UnsupportedAppUsage(maxTargetSdk = 28)
void reportInetCondition(int networkType, int percentage); void reportInetCondition(int networkType, int percentage);
@@ -217,11 +206,5 @@ interface IConnectivityManager
boolean isCallerCurrentAlwaysOnVpnApp(); boolean isCallerCurrentAlwaysOnVpnApp();
boolean isCallerCurrentAlwaysOnVpnLockdownApp(); boolean isCallerCurrentAlwaysOnVpnLockdownApp();
void getLatestTetheringEntitlementResult(int type, in ResultReceiver receiver,
boolean showEntitlementUi, String callerPkg);
void registerTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);
void unregisterTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);
IBinder startOrGetTestNetworkService(); IBinder startOrGetTestNetworkService();
} }

View File

@@ -77,7 +77,6 @@ import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager; import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService; import android.net.INetworkStatsService;
import android.net.ISocketKeepaliveCallback; import android.net.ISocketKeepaliveCallback;
import android.net.ITetheringEventCallback;
import android.net.InetAddresses; import android.net.InetAddresses;
import android.net.IpMemoryStore; import android.net.IpMemoryStore;
import android.net.IpPrefix; import android.net.IpPrefix;
@@ -278,8 +277,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
private MockableSystemProperties mSystemProperties; private MockableSystemProperties mSystemProperties;
private TetheringManager mTetheringManager;
@VisibleForTesting @VisibleForTesting
protected final PermissionMonitor mPermissionMonitor; protected final PermissionMonitor mPermissionMonitor;
@@ -866,13 +863,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
return NetworkStackClient.getInstance(); return NetworkStackClient.getInstance();
} }
/**
* Get a reference to the TetheringManager.
*/
public TetheringManager getTetheringManager() {
return TetheringManager.getInstance();
}
/** /**
* @see ProxyTracker * @see ProxyTracker
*/ */
@@ -1072,8 +1062,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mTetheringManager = mDeps.getTetheringManager();
mPermissionMonitor = new PermissionMonitor(mContext, mNetd); mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
// Set up the listener for user state for creating user VPNs. // Set up the listener for user state for creating user VPNs.
@@ -1887,14 +1875,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
mHandler.sendMessage(mHandler.obtainMessage( mHandler.sendMessage(mHandler.obtainMessage(
EVENT_DATA_SAVER_CHANGED, restrictBackground ? 1 : 0, 0)); EVENT_DATA_SAVER_CHANGED, restrictBackground ? 1 : 0, 0));
// TODO: relocate this specific callback in Tethering.
if (restrictBackground) {
log("onRestrictBackgroundChanged(true): disabling tethering");
mTetheringManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
mTetheringManager.stopTethering(ConnectivityManager.TETHERING_USB);
mTetheringManager.stopTethering(ConnectivityManager.TETHERING_BLUETOOTH);
}
} }
}; };
@@ -2024,12 +2004,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, pid, uid); NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, pid, uid);
} }
private void enforceTetherAccessPermission() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_NETWORK_STATE,
"ConnectivityService");
}
private void enforceControlAlwaysOnVpnPermission() { private void enforceControlAlwaysOnVpnPermission() {
mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CONTROL_ALWAYS_ON_VPN, android.Manifest.permission.CONTROL_ALWAYS_ON_VPN,
@@ -2462,12 +2436,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
pw.println(); pw.println();
mKeepaliveTracker.dump(pw); mKeepaliveTracker.dump(pw);
pw.println();
pw.println("TetheringManager logs:");
pw.increaseIndent();
TetheringManager.getInstance().dump(pw);
pw.decreaseIndent();
pw.println(); pw.println();
dumpAvoidBadWifiSettings(pw); dumpAvoidBadWifiSettings(pw);
@@ -3993,183 +3961,55 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
// javadoc from interface
@Override
public int tether(String iface, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (isTetheringSupported()) {
return mTetheringManager.tether(iface);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
// javadoc from interface
@Override
public int untether(String iface, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (isTetheringSupported()) {
return mTetheringManager.untether(iface);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
// javadoc from interface
@Override @Override
@Deprecated
public int getLastTetherError(String iface) { public int getLastTetherError(String iface) {
enforceTetherAccessPermission(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
Context.TETHERING_SERVICE);
if (isTetheringSupported()) { return tm.getLastTetherError(iface);
return mTetheringManager.getLastTetherError(iface);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
// TODO - proper iface API for selection by property, inspection, etc
@Override
public String[] getTetherableUsbRegexs() {
enforceTetherAccessPermission();
if (isTetheringSupported()) {
return mTetheringManager.getTetherableUsbRegexs();
} else {
return new String[0];
}
} }
@Override @Override
public String[] getTetherableWifiRegexs() { @Deprecated
enforceTetherAccessPermission();
if (isTetheringSupported()) {
return mTetheringManager.getTetherableWifiRegexs();
} else {
return new String[0];
}
}
@Override
public String[] getTetherableBluetoothRegexs() {
enforceTetherAccessPermission();
if (isTetheringSupported()) {
return mTetheringManager.getTetherableBluetoothRegexs();
} else {
return new String[0];
}
}
@Override
public int setUsbTethering(boolean enable, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (isTetheringSupported()) {
return mTetheringManager.setUsbTethering(enable);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
// TODO - move iface listing, queries, etc to new module
// javadoc from interface
@Override
public String[] getTetherableIfaces() { public String[] getTetherableIfaces() {
enforceTetherAccessPermission(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
return mTetheringManager.getTetherableIfaces(); Context.TETHERING_SERVICE);
return tm.getTetherableIfaces();
} }
@Override @Override
@Deprecated
public String[] getTetheredIfaces() { public String[] getTetheredIfaces() {
enforceTetherAccessPermission(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
return mTetheringManager.getTetheredIfaces(); Context.TETHERING_SERVICE);
return tm.getTetheredIfaces();
} }
@Override @Override
@Deprecated
public String[] getTetheringErroredIfaces() { public String[] getTetheringErroredIfaces() {
enforceTetherAccessPermission(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
return mTetheringManager.getTetheringErroredIfaces(); Context.TETHERING_SERVICE);
return tm.getTetheringErroredIfaces();
} }
@Override @Override
public String[] getTetheredDhcpRanges() { @Deprecated
enforceSettingsPermission(); public String[] getTetherableUsbRegexs() {
return mTetheringManager.getTetheredDhcpRanges(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
Context.TETHERING_SERVICE);
return tm.getTetherableUsbRegexs();
} }
@Override @Override
public boolean isTetheringSupported(String callerPkg) { @Deprecated
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); public String[] getTetherableWifiRegexs() {
return isTetheringSupported(); final TetheringManager tm = (TetheringManager) mContext.getSystemService(
} Context.TETHERING_SERVICE);
return tm.getTetherableWifiRegexs();
// if ro.tether.denied = true we default to no tethering
// gservices could set the secure setting to 1 though to enable it on a build where it
// had previously been turned off.
private boolean isTetheringSupported() {
int defaultVal = encodeBool(!mSystemProperties.get("ro.tether.denied").equals("true"));
boolean tetherSupported = toBool(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.TETHER_SUPPORTED, defaultVal));
boolean tetherEnabledInSettings = tetherSupported
&& !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING);
// Elevate to system UID to avoid caller requiring MANAGE_USERS permission.
boolean adminUser = false;
final long token = Binder.clearCallingIdentity();
try {
adminUser = mUserManager.isAdminUser();
} finally {
Binder.restoreCallingIdentity(token);
}
return tetherEnabledInSettings && adminUser
&& mTetheringManager.hasTetherableConfiguration();
}
@Override
public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi,
String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (!isTetheringSupported()) {
receiver.send(ConnectivityManager.TETHER_ERROR_UNSUPPORTED, null);
return;
}
mTetheringManager.startTethering(type, receiver, showProvisioningUi);
}
@Override
public void stopTethering(int type, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
mTetheringManager.stopTethering(type);
}
/**
* Get the latest value of the tethering entitlement check.
*
* Note: Allow privileged apps who have TETHER_PRIVILEGED permission to access. If it turns
* out some such apps are observed to abuse this API, change to per-UID limits on this API
* if it's really needed.
*/
@Override
public void getLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
boolean showEntitlementUi, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
mTetheringManager.requestLatestTetheringEntitlementResult(
type, receiver, showEntitlementUi);
}
/** Register tethering event callback. */
@Override
public void registerTetheringEventCallback(ITetheringEventCallback callback,
String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
mTetheringManager.registerTetheringEventCallback(callback);
}
/** Unregister tethering event callback. */
@Override
public void unregisterTetheringEventCallback(ITetheringEventCallback callback,
String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
mTetheringManager.unregisterTetheringEventCallback(callback);
} }
// Called when we lose the default network and have no replacement yet. // Called when we lose the default network and have no replacement yet.
@@ -7050,14 +6890,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Turn airplane mode off // Turn airplane mode off
setAirplaneMode(false); setAirplaneMode(false);
if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) {
// Untether
String pkgName = mContext.getOpPackageName();
for (String tether : getTetheredIfaces()) {
untether(tether, pkgName);
}
}
if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) { if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) {
// Remove always-on package // Remove always-on package
synchronized (mVpns) { synchronized (mVpns) {

View File

@@ -32,7 +32,6 @@ import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkRequest import android.net.NetworkRequest
import android.net.TestNetworkStackClient import android.net.TestNetworkStackClient
import android.net.TetheringManager
import android.net.metrics.IpConnectivityLog import android.net.metrics.IpConnectivityLog
import android.os.ConditionVariable import android.os.ConditionVariable
import android.os.IBinder import android.os.IBinder
@@ -169,7 +168,6 @@ class ConnectivityServiceIntegrationTest {
val deps = spy(ConnectivityService.Dependencies()) val deps = spy(ConnectivityService.Dependencies())
doReturn(networkStackClient).`when`(deps).networkStack doReturn(networkStackClient).`when`(deps).networkStack
doReturn(metricsLogger).`when`(deps).metricsLogger doReturn(metricsLogger).`when`(deps).metricsLogger
doReturn(mock(TetheringManager::class.java)).`when`(deps).getTetheringManager()
doReturn(mock(ProxyTracker::class.java)).`when`(deps).makeProxyTracker(any(), any()) doReturn(mock(ProxyTracker::class.java)).`when`(deps).makeProxyTracker(any(), any())
doReturn(mock(MockableSystemProperties::class.java)).`when`(deps).systemProperties doReturn(mock(MockableSystemProperties::class.java)).`when`(deps).systemProperties
doReturn(TestNetIdManager()).`when`(deps).makeNetIdManager() doReturn(TestNetIdManager()).`when`(deps).makeNetIdManager()

View File

@@ -164,7 +164,6 @@ import android.net.ProxyInfo;
import android.net.ResolverParamsParcel; import android.net.ResolverParamsParcel;
import android.net.RouteInfo; import android.net.RouteInfo;
import android.net.SocketKeepalive; import android.net.SocketKeepalive;
import android.net.TetheringManager;
import android.net.UidRange; import android.net.UidRange;
import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpConnectivityLog;
import android.net.shared.NetworkMonitorUtils; import android.net.shared.NetworkMonitorUtils;
@@ -1133,7 +1132,6 @@ public class ConnectivityServiceTest {
doReturn(new TestNetIdManager()).when(deps).makeNetIdManager(); doReturn(new TestNetIdManager()).when(deps).makeNetIdManager();
doReturn(mNetworkStack).when(deps).getNetworkStack(); doReturn(mNetworkStack).when(deps).getNetworkStack();
doReturn(systemProperties).when(deps).getSystemProperties(); doReturn(systemProperties).when(deps).getSystemProperties();
doReturn(mock(TetheringManager.class)).when(deps).getTetheringManager();
doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any()); doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any());
doReturn(mMetricsService).when(deps).getMetricsLogger(); doReturn(mMetricsService).when(deps).getMetricsLogger();
doReturn(true).when(deps).queryUserAccess(anyInt(), anyInt()); doReturn(true).when(deps).queryUserAccess(anyInt(), anyInt());