/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.os.Binder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import java.net.InetAddress; /** * Class that answers queries about the state of network connectivity. It also * notifies applications when network connectivity changes. Get an instance * of this class by calling * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}. *
* The primary responsibilities of this class are to: *
* If an application uses the network in the background, it should listen * for this broadcast and stop using the background data if the value is * {@code false}. */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; /** * Broadcast Action: The network connection may not be good * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify * the network and it's condition. * @hide */ public static final String INET_CONDITION_ACTION = "android.net.conn.INET_CONDITION_ACTION"; /** * Broadcast Action: A tetherable connection has come or gone * TODO - finish the doc * @hide */ public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; /** * @hide * gives a String[] */ public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; /** * @hide * gives a String[] */ public static final String EXTRA_ACTIVE_TETHER = "activeArray"; /** * @hide * gives a String[] */ public static final String EXTRA_ERRORED_TETHER = "erroredArray"; /** * The Default Mobile data connection. When active, all data traffic * will use this connection by default. */ public static final int TYPE_MOBILE = 0; /** * The Default WIFI data connection. When active, all data traffic * will use this connection by default. */ public static final int TYPE_WIFI = 1; /** * An MMS-specific Mobile data connection. This connection may be the * same as {@link #TYPE_MOBILE} but it may be different. This is used * by applications needing to talk to the carrier's Multimedia Messaging * Service servers. It may coexist with default data connections. */ public static final int TYPE_MOBILE_MMS = 2; /** * A SUPL-specific Mobile data connection. This connection may be the * same as {@link #TYPE_MOBILE} but it may be different. This is used * by applications needing to talk to the carrier's Secure User Plane * Location servers for help locating the device. It may coexist with * default data connections. */ public static final int TYPE_MOBILE_SUPL = 3; /** * A DUN-specific Mobile data connection. This connection may be the * same as {@link #TYPE_MOBILE} but it may be different. This is used * by applicaitons performing a Dial Up Networking bridge so that * the carrier is aware of DUN traffic. It may coexist with default data * connections. */ public static final int TYPE_MOBILE_DUN = 4; /** * A High Priority Mobile data connection. This connection is typically * the same as {@link #TYPE_MOBILE} but the routing setup is different. * Only requesting processes will have access to the Mobile DNS servers * and only IP's explicitly requested via {@link #requestRouteToHost} * will route over this interface if a default route exists. */ public static final int TYPE_MOBILE_HIPRI = 5; /** * The Default WiMAX data connection. When active, all data traffic * will use this connection by default. */ public static final int TYPE_WIMAX = 6; /** * The Default Bluetooth data connection. When active, all data traffic * will use this connection by default. */ public static final int TYPE_BLUETOOTH = 7; /** * Dummy data connection. This should not be used on shipping devices. */ public static final int TYPE_DUMMY = 8; /** * The Default Ethernet data connection. When active, all data traffic * will use this connection by default. */ public static final int TYPE_ETHERNET = 9; /** * Over the air Adminstration. * {@hide} */ public static final int TYPE_MOBILE_FOTA = 10; /** * IP Multimedia Subsystem * {@hide} */ public static final int TYPE_MOBILE_IMS = 11; /** * Carrier Branded Services * {@hide} */ public static final int TYPE_MOBILE_CBS = 12; /** {@hide} */ public static final int MAX_RADIO_TYPE = TYPE_MOBILE_CBS; /** {@hide} */ public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_CBS; public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; private final IConnectivityManager mService; public static boolean isNetworkTypeValid(int networkType) { return networkType >= 0 && networkType <= MAX_NETWORK_TYPE; } /** {@hide} */ public static String getNetworkTypeName(int type) { switch (type) { case TYPE_MOBILE: return "MOBILE"; case TYPE_WIFI: return "WIFI"; case TYPE_MOBILE_MMS: return "MOBILE_MMS"; case TYPE_MOBILE_SUPL: return "MOBILE_SUPL"; case TYPE_MOBILE_DUN: return "MOBILE_DUN"; case TYPE_MOBILE_HIPRI: return "MOBILE_HIPRI"; case TYPE_WIMAX: return "WIMAX"; case TYPE_BLUETOOTH: return "BLUETOOTH"; case TYPE_DUMMY: return "DUMMY"; case TYPE_ETHERNET: return "ETHERNET"; case TYPE_MOBILE_FOTA: return "MOBILE_FOTA"; case TYPE_MOBILE_IMS: return "MOBILE_IMS"; case TYPE_MOBILE_CBS: return "MOBILE_CBS"; default: return Integer.toString(type); } } /** {@hide} */ public static boolean isNetworkTypeMobile(int networkType) { switch (networkType) { case TYPE_MOBILE: case TYPE_MOBILE_MMS: case TYPE_MOBILE_SUPL: case TYPE_MOBILE_DUN: case TYPE_MOBILE_HIPRI: case TYPE_MOBILE_FOTA: case TYPE_MOBILE_IMS: case TYPE_MOBILE_CBS: return true; default: return false; } } public void setNetworkPreference(int preference) { try { mService.setNetworkPreference(preference); } catch (RemoteException e) { } } public int getNetworkPreference() { try { return mService.getNetworkPreference(); } catch (RemoteException e) { return -1; } } public NetworkInfo getActiveNetworkInfo() { try { return mService.getActiveNetworkInfo(); } catch (RemoteException e) { return null; } } /** {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid) { try { return mService.getActiveNetworkInfoForUid(uid); } catch (RemoteException e) { return null; } } public NetworkInfo getNetworkInfo(int networkType) { try { return mService.getNetworkInfo(networkType); } catch (RemoteException e) { return null; } } public NetworkInfo[] getAllNetworkInfo() { try { return mService.getAllNetworkInfo(); } catch (RemoteException e) { return null; } } /** {@hide} */ public LinkProperties getActiveLinkProperties() { try { return mService.getActiveLinkProperties(); } catch (RemoteException e) { return null; } } /** {@hide} */ public LinkProperties getLinkProperties(int networkType) { try { return mService.getLinkProperties(networkType); } catch (RemoteException e) { return null; } } /** {@hide} */ public boolean setRadios(boolean turnOn) { try { return mService.setRadios(turnOn); } catch (RemoteException e) { return false; } } /** {@hide} */ public boolean setRadio(int networkType, boolean turnOn) { try { return mService.setRadio(networkType, turnOn); } catch (RemoteException e) { return false; } } /** * Tells the underlying networking system that the caller wants to * begin using the named feature. The interpretation of {@code feature} * is completely up to each networking implementation. * @param networkType specifies which network the request pertains to * @param feature the name of the feature to be used * @return an integer value representing the outcome of the request. * The interpretation of this value is specific to each networking * implementation+feature combination, except that the value {@code -1} * always indicates failure. */ public int startUsingNetworkFeature(int networkType, String feature) { try { return mService.startUsingNetworkFeature(networkType, feature, new Binder()); } catch (RemoteException e) { return -1; } } /** * Tells the underlying networking system that the caller is finished * using the named feature. The interpretation of {@code feature} * is completely up to each networking implementation. * @param networkType specifies which network the request pertains to * @param feature the name of the feature that is no longer needed * @return an integer value representing the outcome of the request. * The interpretation of this value is specific to each networking * implementation+feature combination, except that the value {@code -1} * always indicates failure. */ public int stopUsingNetworkFeature(int networkType, String feature) { try { return mService.stopUsingNetworkFeature(networkType, feature); } catch (RemoteException e) { return -1; } } /** * Ensure that a network route exists to deliver traffic to the specified * host via the specified network interface. An attempt to add a route that * already exists is ignored, but treated as successful. * @param networkType the type of the network over which traffic to the specified * host is to be routed * @param hostAddress the IP address of the host to which the route is desired * @return {@code true} on success, {@code false} on failure */ public boolean requestRouteToHost(int networkType, int hostAddress) { InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress); if (inetAddress == null) { return false; } return requestRouteToHostAddress(networkType, inetAddress); } /** * Ensure that a network route exists to deliver traffic to the specified * host via the specified network interface. An attempt to add a route that * already exists is ignored, but treated as successful. * @param networkType the type of the network over which traffic to the specified * host is to be routed * @param hostAddress the IP address of the host to which the route is desired * @return {@code true} on success, {@code false} on failure * @hide */ public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { byte[] address = hostAddress.getAddress(); try { return mService.requestRouteToHostAddress(networkType, address); } catch (RemoteException e) { return false; } } /** * Returns the value of the setting for background data usage. If false, * applications should not use the network if the application is not in the * foreground. Developers should respect this setting, and check the value * of this before performing any background data operations. *
* All applications that have background services that use the network * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}. * * @return Whether background data usage is allowed. */ public boolean getBackgroundDataSetting() { try { return mService.getBackgroundDataSetting(); } catch (RemoteException e) { // Err on the side of safety return false; } } /** * Sets the value of the setting for background data usage. * * @param allowBackgroundData Whether an application should use data while * it is in the background. * * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING * @see #getBackgroundDataSetting() * @hide */ public void setBackgroundDataSetting(boolean allowBackgroundData) { try { mService.setBackgroundDataSetting(allowBackgroundData); } catch (RemoteException e) { } } /** * Gets the value of the setting for enabling Mobile data. * * @return Whether mobile data is enabled. * @hide */ public boolean getMobileDataEnabled() { try { return mService.getMobileDataEnabled(); } catch (RemoteException e) { return true; } } /** * Sets the persisted value for enabling/disabling Mobile data. * * @param enabled Whether the mobile data connection should be * used or not. * @hide */ public void setMobileDataEnabled(boolean enabled) { try { mService.setMobileDataEnabled(enabled); } catch (RemoteException e) { } } /** * {@hide} */ public ConnectivityManager(IConnectivityManager service) { if (service == null) { throw new IllegalArgumentException("missing IConnectivityManager"); } mService = service; } /** * {@hide} */ public String[] getTetherableIfaces() { try { return mService.getTetherableIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetheredIfaces() { try { return mService.getTetheredIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetheringErroredIfaces() { try { return mService.getTetheringErroredIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * @return error A TETHER_ERROR value indicating success or failure type * {@hide} */ public int tether(String iface) { try { return mService.tether(iface); } catch (RemoteException e) { return TETHER_ERROR_SERVICE_UNAVAIL; } } /** * @return error A TETHER_ERROR value indicating success or failure type * {@hide} */ public int untether(String iface) { try { return mService.untether(iface); } catch (RemoteException e) { return TETHER_ERROR_SERVICE_UNAVAIL; } } /** * {@hide} */ public boolean isTetheringSupported() { try { return mService.isTetheringSupported(); } catch (RemoteException e) { return false; } } /** * {@hide} */ public String[] getTetherableUsbRegexs() { try { return mService.getTetherableUsbRegexs(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetherableWifiRegexs() { try { return mService.getTetherableWifiRegexs(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetherableBluetoothRegexs() { try { return mService.getTetherableBluetoothRegexs(); } catch (RemoteException e) { return new String[0]; } } /** {@hide} */ public static final int TETHER_ERROR_NO_ERROR = 0; /** {@hide} */ public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; /** {@hide} */ public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; /** {@hide} */ public static final int TETHER_ERROR_UNSUPPORTED = 3; /** {@hide} */ public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; /** {@hide} */ public static final int TETHER_ERROR_MASTER_ERROR = 5; /** {@hide} */ public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; /** {@hide} */ public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; /** {@hide} */ public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8; /** {@hide} */ public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9; /** {@hide} */ public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; /** * @param iface The name of the interface we're interested in * @return error The error code of the last error tethering or untethering the named * interface * {@hide} */ public int getLastTetherError(String iface) { try { return mService.getLastTetherError(iface); } catch (RemoteException e) { return TETHER_ERROR_SERVICE_UNAVAIL; } } /** * Ensure the device stays awake until we connect with the next network * @param forWhome The name of the network going down for logging purposes * @return {@code true} on success, {@code false} on failure * {@hide} */ public boolean requestNetworkTransitionWakelock(String forWhom) { try { mService.requestNetworkTransitionWakelock(forWhom); return true; } catch (RemoteException e) { return false; } } /** * @param networkType The type of network you want to report on * @param percentage The quality of the connection 0 is bad, 100 is good * {@hide} */ public void reportInetCondition(int networkType, int percentage) { try { mService.reportInetCondition(networkType, percentage); } catch (RemoteException e) { } } /** * @param proxyProperties The definition for the new global http proxy * {@hide} */ public void setGlobalProxy(ProxyProperties p) { try { mService.setGlobalProxy(p); } catch (RemoteException e) { } } /** * @return proxyProperties for the current global proxy * {@hide} */ public ProxyProperties getGlobalProxy() { try { return mService.getGlobalProxy(); } catch (RemoteException e) { return null; } } /** * @return proxyProperties for the current proxy (global if set, network specific if not) * {@hide} */ public ProxyProperties getProxy() { try { return mService.getProxy(); } catch (RemoteException e) { return null; } } /** * @param networkType The network who's dependence has changed * @param met Boolean - true if network use is ok, false if not * {@hide} */ public void setDataDependency(int networkType, boolean met) { try { mService.setDataDependency(networkType, met); } catch (RemoteException e) { } } }