Deprecate static ConnectivityManager.get/setProcessDefaultNetwork() functions.
These functions risk hitting an unchecked Exception due to ConnectivityManager not being instantiated yet. Also, change Network.openConnection() to throw a checked Exception rather than an unchecked Exception when ConnectivityManager is not yet instantiated. bug:19416463 Change-Id: Ie1e2b3238aec0343d267c76b64927073f2f05f85
This commit is contained in:
@@ -1201,7 +1201,7 @@ public class ConnectivityManager {
|
|||||||
* @return {@code true} on success, {@code false} on failure
|
* @return {@code true} on success, {@code false} on failure
|
||||||
*
|
*
|
||||||
* @deprecated Deprecated in favor of the {@link #requestNetwork},
|
* @deprecated Deprecated in favor of the {@link #requestNetwork},
|
||||||
* {@link #setProcessDefaultNetwork} and {@link Network#getSocketFactory} api.
|
* {@link #bindProcessToNetwork} and {@link Network#getSocketFactory} api.
|
||||||
*/
|
*/
|
||||||
public boolean requestRouteToHost(int networkType, int hostAddress) {
|
public boolean requestRouteToHost(int networkType, int hostAddress) {
|
||||||
return requestRouteToHostAddress(networkType, NetworkUtils.intToInetAddress(hostAddress));
|
return requestRouteToHostAddress(networkType, NetworkUtils.intToInetAddress(hostAddress));
|
||||||
@@ -1219,7 +1219,7 @@ public class ConnectivityManager {
|
|||||||
* @return {@code true} on success, {@code false} on failure
|
* @return {@code true} on success, {@code false} on failure
|
||||||
* @hide
|
* @hide
|
||||||
* @deprecated Deprecated in favor of the {@link #requestNetwork} and
|
* @deprecated Deprecated in favor of the {@link #requestNetwork} and
|
||||||
* {@link #setProcessDefaultNetwork} api.
|
* {@link #bindProcessToNetwork} api.
|
||||||
*/
|
*/
|
||||||
public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
|
public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
|
||||||
try {
|
try {
|
||||||
@@ -1344,7 +1344,7 @@ public class ConnectivityManager {
|
|||||||
* listener.
|
* listener.
|
||||||
* <p>
|
* <p>
|
||||||
* If the process default network has been set with
|
* If the process default network has been set with
|
||||||
* {@link ConnectivityManager#setProcessDefaultNetwork} this function will not
|
* {@link ConnectivityManager#bindProcessToNetwork} this function will not
|
||||||
* reflect the process's default, but the system default.
|
* reflect the process's default, but the system default.
|
||||||
*
|
*
|
||||||
* @param l The listener to be told when the network is active.
|
* @param l The listener to be told when the network is active.
|
||||||
@@ -1429,11 +1429,20 @@ public class ConnectivityManager {
|
|||||||
* situations where a Context pointer is unavailable.
|
* situations where a Context pointer is unavailable.
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static ConnectivityManager getInstance() {
|
static ConnectivityManager getInstanceOrNull() {
|
||||||
if (sInstance == null) {
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated - use getSystemService. This is a kludge to support static access in certain
|
||||||
|
* situations where a Context pointer is unavailable.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
private static ConnectivityManager getInstance() {
|
||||||
|
if (getInstanceOrNull() == null) {
|
||||||
throw new IllegalStateException("No ConnectivityManager yet constructed");
|
throw new IllegalStateException("No ConnectivityManager yet constructed");
|
||||||
}
|
}
|
||||||
return sInstance;
|
return getInstanceOrNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1769,7 +1778,7 @@ public class ConnectivityManager {
|
|||||||
/**
|
/**
|
||||||
* Get the current default HTTP proxy settings. If a global proxy is set it will be returned,
|
* Get the current default HTTP proxy settings. If a global proxy is set it will be returned,
|
||||||
* otherwise if this process is bound to a {@link Network} using
|
* otherwise if this process is bound to a {@link Network} using
|
||||||
* {@link #setProcessDefaultNetwork} then that {@code Network}'s proxy is returned, otherwise
|
* {@link #bindProcessToNetwork} then that {@code Network}'s proxy is returned, otherwise
|
||||||
* the default network's proxy is returned.
|
* the default network's proxy is returned.
|
||||||
*
|
*
|
||||||
* @return the {@link ProxyInfo} for the current HTTP proxy, or {@code null} if no
|
* @return the {@link ProxyInfo} for the current HTTP proxy, or {@code null} if no
|
||||||
@@ -1777,7 +1786,7 @@ public class ConnectivityManager {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public ProxyInfo getDefaultProxy() {
|
public ProxyInfo getDefaultProxy() {
|
||||||
final Network network = getProcessDefaultNetwork();
|
final Network network = getBoundNetworkForProcess();
|
||||||
if (network != null) {
|
if (network != null) {
|
||||||
final ProxyInfo globalProxy = getGlobalProxy();
|
final ProxyInfo globalProxy = getGlobalProxy();
|
||||||
if (globalProxy != null) return globalProxy;
|
if (globalProxy != null) return globalProxy;
|
||||||
@@ -2337,9 +2346,8 @@ public class ConnectivityManager {
|
|||||||
* successfully finding a network for the applications request. Retrieve it with
|
* successfully finding a network for the applications request. Retrieve it with
|
||||||
* {@link android.content.Intent#getParcelableExtra(String)}.
|
* {@link android.content.Intent#getParcelableExtra(String)}.
|
||||||
* <p>
|
* <p>
|
||||||
* Note that if you intend to invoke {@link #setProcessDefaultNetwork} or
|
* Note that if you intend to invoke {@link Network#openConnection(java.net.URL)}
|
||||||
* {@link Network#openConnection(java.net.URL)} then you must get a
|
* then you must get a ConnectivityManager instance before doing so.
|
||||||
* ConnectivityManager instance before doing so.
|
|
||||||
*/
|
*/
|
||||||
public static final String EXTRA_NETWORK = "android.net.extra.NETWORK";
|
public static final String EXTRA_NETWORK = "android.net.extra.NETWORK";
|
||||||
|
|
||||||
@@ -2458,15 +2466,42 @@ public class ConnectivityManager {
|
|||||||
* Sockets created by Network.getSocketFactory().createSocket() and
|
* Sockets created by Network.getSocketFactory().createSocket() and
|
||||||
* performing network-specific host name resolutions via
|
* performing network-specific host name resolutions via
|
||||||
* {@link Network#getAllByName Network.getAllByName} is preferred to calling
|
* {@link Network#getAllByName Network.getAllByName} is preferred to calling
|
||||||
* {@code setProcessDefaultNetwork}.
|
* {@code bindProcessToNetwork}.
|
||||||
*
|
*
|
||||||
* @param network The {@link Network} to bind the current process to, or {@code null} to clear
|
* @param network The {@link Network} to bind the current process to, or {@code null} to clear
|
||||||
* the current binding.
|
* the current binding.
|
||||||
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
|
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
|
||||||
*/
|
*/
|
||||||
|
public boolean bindProcessToNetwork(Network network) {
|
||||||
|
// Forcing callers to call thru non-static function ensures ConnectivityManager
|
||||||
|
// instantiated.
|
||||||
|
return setProcessDefaultNetwork(network);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds the current process to {@code network}. All Sockets created in the future
|
||||||
|
* (and not explicitly bound via a bound SocketFactory from
|
||||||
|
* {@link Network#getSocketFactory() Network.getSocketFactory()}) will be bound to
|
||||||
|
* {@code network}. All host name resolutions will be limited to {@code network} as well.
|
||||||
|
* Note that if {@code network} ever disconnects, all Sockets created in this way will cease to
|
||||||
|
* work and all host name resolutions will fail. This is by design so an application doesn't
|
||||||
|
* accidentally use Sockets it thinks are still bound to a particular {@link Network}.
|
||||||
|
* To clear binding pass {@code null} for {@code network}. Using individually bound
|
||||||
|
* Sockets created by Network.getSocketFactory().createSocket() and
|
||||||
|
* performing network-specific host name resolutions via
|
||||||
|
* {@link Network#getAllByName Network.getAllByName} is preferred to calling
|
||||||
|
* {@code setProcessDefaultNetwork}.
|
||||||
|
*
|
||||||
|
* @param network The {@link Network} to bind the current process to, or {@code null} to clear
|
||||||
|
* the current binding.
|
||||||
|
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
|
||||||
|
* @deprecated This function can throw {@link IllegalStateException}. Use
|
||||||
|
* {@link #bindProcessToNetwork} instead. {@code bindProcessToNetwork}
|
||||||
|
* is a direct replacement.
|
||||||
|
*/
|
||||||
public static boolean setProcessDefaultNetwork(Network network) {
|
public static boolean setProcessDefaultNetwork(Network network) {
|
||||||
int netId = (network == null) ? NETID_UNSET : network.netId;
|
int netId = (network == null) ? NETID_UNSET : network.netId;
|
||||||
if (netId == NetworkUtils.getNetworkBoundToProcess()) {
|
if (netId == NetworkUtils.getBoundNetworkForProcess()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (NetworkUtils.bindProcessToNetwork(netId)) {
|
if (NetworkUtils.bindProcessToNetwork(netId)) {
|
||||||
@@ -2486,19 +2521,34 @@ public class ConnectivityManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link Network} currently bound to this process via
|
* Returns the {@link Network} currently bound to this process via
|
||||||
* {@link #setProcessDefaultNetwork}, or {@code null} if no {@link Network} is explicitly bound.
|
* {@link #bindProcessToNetwork}, or {@code null} if no {@link Network} is explicitly bound.
|
||||||
*
|
*
|
||||||
* @return {@code Network} to which this process is bound, or {@code null}.
|
* @return {@code Network} to which this process is bound, or {@code null}.
|
||||||
*/
|
*/
|
||||||
|
public Network getBoundNetworkForProcess() {
|
||||||
|
// Forcing callers to call thru non-static function ensures ConnectivityManager
|
||||||
|
// instantiated.
|
||||||
|
return getProcessDefaultNetwork();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link Network} currently bound to this process via
|
||||||
|
* {@link #bindProcessToNetwork}, or {@code null} if no {@link Network} is explicitly bound.
|
||||||
|
*
|
||||||
|
* @return {@code Network} to which this process is bound, or {@code null}.
|
||||||
|
* @deprecated Using this function can lead to other functions throwing
|
||||||
|
* {@link IllegalStateException}. Use {@link #getBoundNetworkForProcess} instead.
|
||||||
|
* {@code getBoundNetworkForProcess} is a direct replacement.
|
||||||
|
*/
|
||||||
public static Network getProcessDefaultNetwork() {
|
public static Network getProcessDefaultNetwork() {
|
||||||
int netId = NetworkUtils.getNetworkBoundToProcess();
|
int netId = NetworkUtils.getBoundNetworkForProcess();
|
||||||
if (netId == NETID_UNSET) return null;
|
if (netId == NETID_UNSET) return null;
|
||||||
return new Network(netId);
|
return new Network(netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds host resolutions performed by this process to {@code network}.
|
* Binds host resolutions performed by this process to {@code network}.
|
||||||
* {@link #setProcessDefaultNetwork} takes precedence over this setting.
|
* {@link #bindProcessToNetwork} takes precedence over this setting.
|
||||||
*
|
*
|
||||||
* @param network The {@link Network} to bind host resolutions from the current process to, or
|
* @param network The {@link Network} to bind host resolutions from the current process to, or
|
||||||
* {@code null} to clear the current binding.
|
* {@code null} to clear the current binding.
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ import com.android.okhttp.OkHttpClient;
|
|||||||
* {@link ConnectivityManager#registerNetworkCallback} calls.
|
* {@link ConnectivityManager#registerNetworkCallback} calls.
|
||||||
* It is used to direct traffic to the given {@code Network}, either on a {@link Socket} basis
|
* It is used to direct traffic to the given {@code Network}, either on a {@link Socket} basis
|
||||||
* through a targeted {@link SocketFactory} or process-wide via
|
* through a targeted {@link SocketFactory} or process-wide via
|
||||||
* {@link ConnectivityManager#setProcessDefaultNetwork}.
|
* {@link ConnectivityManager#bindProcessToNetwork}.
|
||||||
*/
|
*/
|
||||||
public class Network implements Parcelable {
|
public class Network implements Parcelable {
|
||||||
|
|
||||||
@@ -245,7 +245,10 @@ public class Network implements Parcelable {
|
|||||||
* @see java.net.URL#openConnection()
|
* @see java.net.URL#openConnection()
|
||||||
*/
|
*/
|
||||||
public URLConnection openConnection(URL url) throws IOException {
|
public URLConnection openConnection(URL url) throws IOException {
|
||||||
final ConnectivityManager cm = ConnectivityManager.getInstance();
|
final ConnectivityManager cm = ConnectivityManager.getInstanceOrNull();
|
||||||
|
if (cm == null) {
|
||||||
|
throw new IOException("No ConnectivityManager yet constructed, please construct one");
|
||||||
|
}
|
||||||
// TODO: Should this be optimized to avoid fetching the global proxy for every request?
|
// TODO: Should this be optimized to avoid fetching the global proxy for every request?
|
||||||
ProxyInfo proxyInfo = cm.getGlobalProxy();
|
ProxyInfo proxyInfo = cm.getGlobalProxy();
|
||||||
if (proxyInfo == null) {
|
if (proxyInfo == null) {
|
||||||
@@ -299,7 +302,7 @@ public class Network implements Parcelable {
|
|||||||
/**
|
/**
|
||||||
* Binds the specified {@link DatagramSocket} to this {@code Network}. All data traffic on the
|
* Binds the specified {@link DatagramSocket} to this {@code Network}. All data traffic on the
|
||||||
* socket will be sent on this {@code Network}, irrespective of any process-wide network binding
|
* socket will be sent on this {@code Network}, irrespective of any process-wide network binding
|
||||||
* set by {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be
|
* set by {@link ConnectivityManager#bindProcessToNetwork}. The socket must not be
|
||||||
* connected.
|
* connected.
|
||||||
*/
|
*/
|
||||||
public void bindSocket(DatagramSocket socket) throws IOException {
|
public void bindSocket(DatagramSocket socket) throws IOException {
|
||||||
@@ -316,7 +319,7 @@ public class Network implements Parcelable {
|
|||||||
/**
|
/**
|
||||||
* Binds the specified {@link Socket} to this {@code Network}. All data traffic on the socket
|
* Binds the specified {@link Socket} to this {@code Network}. All data traffic on the socket
|
||||||
* will be sent on this {@code Network}, irrespective of any process-wide network binding set by
|
* will be sent on this {@code Network}, irrespective of any process-wide network binding set by
|
||||||
* {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be connected.
|
* {@link ConnectivityManager#bindProcessToNetwork}. The socket must not be connected.
|
||||||
*/
|
*/
|
||||||
public void bindSocket(Socket socket) throws IOException {
|
public void bindSocket(Socket socket) throws IOException {
|
||||||
// Apparently, the kernel doesn't update a connected TCP socket's routing upon mark changes.
|
// Apparently, the kernel doesn't update a connected TCP socket's routing upon mark changes.
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ public class NetworkUtils {
|
|||||||
* Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if
|
* Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if
|
||||||
* {@link #unbindProcessToNetwork} has been called since {@link #bindProcessToNetwork}.
|
* {@link #unbindProcessToNetwork} has been called since {@link #bindProcessToNetwork}.
|
||||||
*/
|
*/
|
||||||
public native static int getNetworkBoundToProcess();
|
public native static int getBoundNetworkForProcess();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds host resolutions performed by this process to the network designated by {@code netId}.
|
* Binds host resolutions performed by this process to the network designated by {@code netId}.
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz
|
|||||||
return (jboolean) !setNetworkForProcess(netId);
|
return (jboolean) !setNetworkForProcess(netId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz)
|
static jint android_net_utils_getBoundNetworkForProcess(JNIEnv *env, jobject thiz)
|
||||||
{
|
{
|
||||||
return getNetworkForProcess();
|
return getNetworkForProcess();
|
||||||
}
|
}
|
||||||
@@ -306,7 +306,7 @@ static JNINativeMethod gNetworkUtilMethods[] = {
|
|||||||
{ "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease },
|
{ "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease },
|
||||||
{ "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
|
{ "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
|
||||||
{ "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
|
{ "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
|
||||||
{ "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess },
|
{ "getBoundNetworkForProcess", "()I", (void*) android_net_utils_getBoundNetworkForProcess },
|
||||||
{ "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
|
{ "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
|
||||||
{ "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork },
|
{ "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork },
|
||||||
{ "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn },
|
{ "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn },
|
||||||
|
|||||||
Reference in New Issue
Block a user