[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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user