From faa4b403d9a09a77189cb738e98d65f26af2610a Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Fri, 15 Feb 2013 10:56:35 -0800 Subject: [PATCH] Improve ConnectivityManager docs Also fix some permission problems. bug:5738328 Change-Id: Ib32c223f425b1fc03b8cce528456bcb50b540fdf --- .../java/android/net/ConnectivityManager.java | 458 +++++++++++++++--- .../android/server/ConnectivityService.java | 8 +- 2 files changed, 389 insertions(+), 77 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 1f44e49f2e..3a04c271ca 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -62,7 +62,7 @@ public class ConnectivityManager { * NetworkInfo for the new network is also passed as an extra. This lets * any receivers of the broadcast know that they should not necessarily * tell the user that no data traffic will be possible. Instead, the - * reciever should expect another broadcast soon, indicating either that + * receiver should expect another broadcast soon, indicating either that * the failover attempt succeeded (and so there is still overall data * connectivity), or that the failover attempt failed, meaning that all * connectivity has been lost. @@ -151,8 +151,8 @@ public class ConnectivityManager { /** * Broadcast action to indicate the change of data activity status * (idle or active) on a network in a recent period. - * The network becomes active when data transimission is started, or - * idle if there is no data transimition for a period of time. + * The network becomes active when data transmission is started, or + * idle if there is no data transmission for a period of time. * {@hide} */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @@ -205,8 +205,12 @@ public class ConnectivityManager { "android.net.conn.INET_CONDITION_ACTION"; /** - * Broadcast Action: A tetherable connection has come or gone - * TODO - finish the doc + * Broadcast Action: A tetherable connection has come or gone. + * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER}, + * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER} and + * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate + * the current state of tethering. Each include a list of + * interface names in that state (may be empty). * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @@ -215,19 +219,23 @@ public class ConnectivityManager { /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces configured for + * tethering and currently available for tethering. */ public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces currently tethered + * (ie, has dhcp support and packets potentially forwarded/NATed) */ public static final String EXTRA_ACTIVE_TETHER = "activeArray"; /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces we tried to tether and + * failed. Use {@link #getLastTetherError} to find the error code + * for any interfaces listed here. */ public static final String EXTRA_ERRORED_TETHER = "erroredArray"; @@ -248,61 +256,63 @@ public class ConnectivityManager { public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal"; /** - * The absence of APN.. + * The absence of a connection type. * @hide */ public static final int TYPE_NONE = -1; /** - * The Default Mobile data connection. When active, all data traffic - * will use this connection by default. + * The Mobile data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route) */ public static final int TYPE_MOBILE = 0; /** - * The Default WIFI data connection. When active, all data traffic - * will use this connection by default. + * The WIFI data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ 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. + * An MMS-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is used by applications needing to talk to the carrier's + * Multimedia Messaging Service servers. */ 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. + * A SUPL-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is used by applications needing to talk to the carrier's + * Secure User Plane Location servers for help locating the device. */ 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. + * A DUN-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is sometimes by the system when setting up an upstream connection + * for tethering so that the carrier is aware of DUN traffic. */ 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. + * A High Priority Mobile data connection. This network type uses the + * same network interface 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 no 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. + * The WiMAX data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_WIMAX = 6; /** - * The Default Bluetooth data connection. When active, all data traffic - * will use this connection by default. + * The Bluetooth data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_BLUETOOTH = 7; @@ -312,25 +322,26 @@ public class ConnectivityManager { public static final int TYPE_DUMMY = 8; /** - * The Default Ethernet data connection. When active, all data traffic - * will use this connection by default. + * The Ethernet data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_ETHERNET = 9; /** - * Over the air Adminstration. + * Over the air Administration. * {@hide} */ public static final int TYPE_MOBILE_FOTA = 10; /** - * IP Multimedia Subsystem + * IP Multimedia Subsystem. * {@hide} */ public static final int TYPE_MOBILE_IMS = 11; /** - * Carrier Branded Services + * Carrier Branded Services. * {@hide} */ public static final int TYPE_MOBILE_CBS = 12; @@ -354,7 +365,7 @@ public class ConnectivityManager { * * @deprecated Since we support so many more networks now, the single * network default network preference can't really express - * the heirarchy. Instead, the default is defined by the + * the hierarchy. Instead, the default is defined by the * networkAttributes in config.xml. You can determine * the current value by calling {@link #getNetworkPreference()} * from an App. @@ -364,7 +375,11 @@ public class ConnectivityManager { /** * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in - * milliseconds. + * milliseconds. This was introduced because IPv6 routes seem to take a + * moment to settle - trying network activity before the routes are adjusted + * can lead to packets using the wrong interface or having the wrong IP address. + * This delay is a bit crude, but in the future hopefully we will have kernel + * notifications letting us know when it's safe to use the new network. * * @hide */ @@ -372,11 +387,23 @@ public class ConnectivityManager { private final IConnectivityManager mService; + /** + * Tests if a given integer represents a valid network type. + * @param networkType the type to be tested + * @return a boolean. {@code true} if the type is valid, else {@code false} + */ public static boolean isNetworkTypeValid(int networkType) { return networkType >= 0 && networkType <= MAX_NETWORK_TYPE; } - /** {@hide} */ + /** + * Returns a non-localized string representing a given network type. + * ONLY used for debugging output. + * @param type the type needing naming + * @return a String for the given type, or a string version of the type ("87") + * if no name is known. + * {@hide} + */ public static String getNetworkTypeName(int type) { switch (type) { case TYPE_MOBILE: @@ -412,7 +439,13 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Checks if a given type uses the cellular data connection. + * This should be replaced in the future by a network property. + * @param networkType the type to check + * @return a boolean - {@code true} if uses cellular network, else {@code false} + * {@hide} + */ public static boolean isNetworkTypeMobile(int networkType) { switch (networkType) { case TYPE_MOBILE: @@ -429,6 +462,17 @@ public class ConnectivityManager { } } + /** + * Specifies the preferred network type. When the device has more + * than one type available the preferred network type will be used. + * Note that this made sense when we only had 2 network types, + * but with more and more default networks we need an array to list + * their ordering. This will be deprecated soon. + * + * @param preference the network type to prefer over all others. It is + * unspecified what happens to the old preferred network in the + * overall ordering. + */ public void setNetworkPreference(int preference) { try { mService.setNetworkPreference(preference); @@ -436,6 +480,17 @@ public class ConnectivityManager { } } + /** + * Retrieves the current preferred network type. + * Note that this made sense when we only had 2 network types, + * but with more and more default networks we need an array to list + * their ordering. This will be deprecated soon. + * + * @return an integer representing the preferred network type + * + *

This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + */ public int getNetworkPreference() { try { return mService.getNetworkPreference(); @@ -445,11 +500,16 @@ public class ConnectivityManager { } /** - * Returns details about the currently active data network. When connected, - * this network is the default route for outgoing connections. You should - * always check {@link NetworkInfo#isConnected()} before initiating network - * traffic. This may return {@code null} when no networks are available. - *

This method requires the caller to hold the permission + * Returns details about the currently active default data network. When + * connected, this network is the default route for outgoing connections. + * You should always check {@link NetworkInfo#isConnected()} before initiating + * network traffic. This may return {@code null} when there is no default + * network. + * + * @return a {@link NetworkInfo} object for the current default network + * or {@code null} if no network default network is currently active + * + *

This method requires the call to hold the permission * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public NetworkInfo getActiveNetworkInfo() { @@ -460,7 +520,19 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns details about the currently active default data network + * for a given uid. This is for internal use only to avoid spying + * other apps. + * + * @return a {@link NetworkInfo} object for the current default network + * for the given uid or {@code null} if no default network is + * available for the specified uid. + * + *

This method requires the caller to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL} + * {@hide} + */ public NetworkInfo getActiveNetworkInfoForUid(int uid) { try { return mService.getActiveNetworkInfoForUid(uid); @@ -469,6 +541,19 @@ public class ConnectivityManager { } } + /** + * Returns connection status information about a particular + * network type. + * + * @param networkType integer specifying which networkType in + * which you're interested. + * @return a {@link NetworkInfo} object for the requested + * network type or {@code null} if the type is not + * supported by the device. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + */ public NetworkInfo getNetworkInfo(int networkType) { try { return mService.getNetworkInfo(networkType); @@ -477,6 +562,16 @@ public class ConnectivityManager { } } + /** + * Returns connection status information about all network + * types supported by the device. + * + * @return an array of {@link NetworkInfo} objects. Check each + * {@link NetworkInfo#getType} for which type each applies. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + */ public NetworkInfo[] getAllNetworkInfo() { try { return mService.getAllNetworkInfo(); @@ -485,7 +580,17 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns the IP information for the current default network. + * + * @return a {@link LinkProperties} object describing the IP info + * for the current default network, or {@code null} if there + * is no current default network. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * {@hide} + */ public LinkProperties getActiveLinkProperties() { try { return mService.getActiveLinkProperties(); @@ -494,7 +599,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns the IP information for a given network type. + * + * @param networkType the network type of interest. + * @return a {@link LinkProperties} object describing the IP info + * for the given networkType, or {@code null} if there is + * no current default network. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * {@hide} + */ public LinkProperties getLinkProperties(int networkType) { try { return mService.getLinkProperties(networkType); @@ -503,7 +619,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Tells each network type to set its radio power state as directed. + * + * @param turnOn a boolean, {@code true} to turn the radios on, + * {@code false} to turn them off. + * @return a boolean, {@code true} indicating success. All network types + * will be tried, even if some fail. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. + * {@hide} + */ public boolean setRadios(boolean turnOn) { try { return mService.setRadios(turnOn); @@ -512,7 +639,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Tells a given networkType to set its radio power state as directed. + * + * @param networkType the int networkType of interest. + * @param turnOn a boolean, {@code true} to turn the radio on, + * {@code} false to turn it off. + * @return a boolean, {@code true} indicating success. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. + * {@hide} + */ public boolean setRadio(int networkType, boolean turnOn) { try { return mService.setRadio(networkType, turnOn); @@ -647,6 +785,9 @@ public class ConnectivityManager { * network is active. Quota status can change rapidly, so these values * shouldn't be cached. * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * * @hide */ public NetworkQuotaInfo getActiveNetworkQuotaInfo() { @@ -661,6 +802,9 @@ public class ConnectivityManager { * Gets the value of the setting for enabling Mobile data. * * @return Whether mobile data is enabled. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @hide */ public boolean getMobileDataEnabled() { @@ -674,8 +818,8 @@ public class ConnectivityManager { /** * Sets the persisted value for enabling/disabling Mobile data. * - * @param enabled Whether the mobile data connection should be - * used or not. + * @param enabled Whether the user wants the mobile data connection used + * or not. * @hide */ public void setMobileDataEnabled(boolean enabled) { @@ -698,6 +842,13 @@ public class ConnectivityManager { } /** + * Get the set of tetherable, available interfaces. This list is limited by + * device configuration and current interface existence. + * + * @return an array of 0 or more Strings of tetherable interface names. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableIfaces() { @@ -709,6 +860,12 @@ public class ConnectivityManager { } /** + * Get the set of tethered interfaces. + * + * @return an array of 0 or more String of currently tethered interface names. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheredIfaces() { @@ -720,6 +877,18 @@ public class ConnectivityManager { } /** + * Get the set of interface names which attempted to tether but + * failed. Re-attempting to tether may cause them to reset to the Tethered + * state. Alternatively, causing the interface to be destroyed and recreated + * may cause them to reset to the available state. + * {@link ConnectivityManager#getLastTetherError} can be used to get more + * information on the cause of the errors. + * + * @return an array of 0 or more String indicating the interface names + * which failed to tether. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheringErroredIfaces() { @@ -731,7 +900,19 @@ public class ConnectivityManager { } /** - * @return error A TETHER_ERROR value indicating success or failure type + * Attempt to tether the named interface. This will setup a dhcp server + * on the interface, forward and NAT IP packets and forward DNS requests + * to the best active upstream network interface. Note that if no upstream + * IP network interface is available, dhcp will still run and traffic will be + * allowed between the tethered devices and this device, though upstream net + * access will of course fail until an upstream network interface becomes + * active. + * + * @param iface the interface name to tether. + * @return error a {@code TETHER_ERROR} value indicating success or failure type + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int tether(String iface) { @@ -743,7 +924,13 @@ public class ConnectivityManager { } /** - * @return error A TETHER_ERROR value indicating success or failure type + * Stop tethering the named interface. + * + * @param iface the interface name to untether. + * @return error a {@code TETHER_ERROR} value indicating success or failure type + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int untether(String iface) { @@ -755,6 +942,14 @@ public class ConnectivityManager { } /** + * Check if the device allows for tethering. It may be disabled via + * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or + * due to device configuration. + * + * @return a boolean - {@code true} indicating Tethering is supported. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public boolean isTetheringSupported() { @@ -766,6 +961,15 @@ public class ConnectivityManager { } /** + * Get the list of regular expressions that define any tetherable + * USB network interfaces. If USB tethering is not supported by the + * device, this list should be empty. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable usb interfaces. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableUsbRegexs() { @@ -777,6 +981,15 @@ public class ConnectivityManager { } /** + * Get the list of regular expressions that define any tetherable + * Wifi network interfaces. If Wifi tethering is not supported by the + * device, this list should be empty. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable wifi interfaces. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableWifiRegexs() { @@ -788,6 +1001,15 @@ public class ConnectivityManager { } /** + * Get the list of regular expressions that define any tetherable + * Bluetooth network interfaces. If Bluetooth tethering is not supported by the + * device, this list should be empty. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable bluetooth interfaces. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableBluetoothRegexs() { @@ -799,6 +1021,17 @@ public class ConnectivityManager { } /** + * Attempt to both alter the mode of USB and Tethering of USB. A + * utility method to deal with some of the complexity of USB - will + * attempt to switch to Rndis and subsequently tether the resulting + * interface on {@code true} or turn off tethering and switch off + * Rndis on {@code false}. + * + * @param enable a boolean - {@code true} to enable tethering + * @return error a {@code TETHER_ERROR} value indicating success or failure type + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int setUsbTethering(boolean enable) { @@ -833,9 +1066,15 @@ public class ConnectivityManager { public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; /** - * @param iface The name of the interface we're interested in + * Get a more detailed error code after a Tethering or Untethering + * request asynchronously failed. + * + * @param iface The name of the interface of interest * @return error The error code of the last error tethering or untethering the named * interface + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public int getLastTetherError(String iface) { @@ -847,9 +1086,16 @@ public class ConnectivityManager { } /** - * Ensure the device stays awake until we connect with the next network - * @param forWhome The name of the network going down for logging purposes + * Try to ensure the device stays awake until we connect with the next network. + * Actually just holds a wakelock for a number of seconds while we try to connect + * to any default networks. This will expire if the timeout passes or if we connect + * to a default after this is called. For internal use only. + * + * @param forWhom the name of the network going down for logging purposes * @return {@code true} on success, {@code false} on failure + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public boolean requestNetworkTransitionWakelock(String forWhom) { @@ -862,8 +1108,14 @@ public class ConnectivityManager { } /** + * Report network connectivity status. This is currently used only + * to alter status bar UI. + * * @param networkType The type of network you want to report on * @param percentage The quality of the connection 0 is bad, 100 is good + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#STATUS_BAR}. * {@hide} */ public void reportInetCondition(int networkType, int percentage) { @@ -874,7 +1126,16 @@ public class ConnectivityManager { } /** - * @param proxyProperties The definition for the new global http proxy + * Set a network-independent global http proxy. This is not normally what you want + * for typical HTTP proxies - they are general network dependent. However if you're + * doing something unusual like general internal filtering this may be useful. On + * a private network where the proxy is not accessible, you may break HTTP using this. + * + * @param proxyProperties The a {@link ProxyProperites} object defining the new global + * HTTP proxy. A {@code null} value will clear the global HTTP proxy. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public void setGlobalProxy(ProxyProperties p) { @@ -885,7 +1146,13 @@ public class ConnectivityManager { } /** - * @return proxyProperties for the current global proxy + * Retrieve any network-independent global HTTP proxy. + * + * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null} + * if no global HTTP proxy is set. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public ProxyProperties getGlobalProxy() { @@ -897,7 +1164,14 @@ public class ConnectivityManager { } /** - * @return proxyProperties for the current proxy (global if set, network specific if not) + * Get the HTTP proxy settings for the current default network. Note that + * if a global proxy is set, it will override any per-network setting. + * + * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no + * HTTP proxy is active. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public ProxyProperties getProxy() { @@ -909,8 +1183,15 @@ public class ConnectivityManager { } /** + * Sets a secondary requirement bit for the given networkType. + * This requirement bit is generally under the control of the carrier + * or its agents and is not directly controlled by the user. + * * @param networkType The network who's dependence has changed - * @param met Boolean - true if network use is ok, false if not + * @param met Boolean - true if network use is OK, false if not + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public void setDataDependency(int networkType, boolean met) { @@ -924,11 +1205,15 @@ public class ConnectivityManager { * Returns true if the hardware supports the given network type * else it returns false. This doesn't indicate we have coverage * or are authorized onto a network, just whether or not the - * hardware supports it. For example a gsm phone without a sim - * should still return true for mobile data, but a wifi only tablet - * would return false. - * @param networkType The nework type we'd like to check - * @return true if supported, else false + * hardware supports it. For example a GSM phone without a SIM + * should still return {@code true} for mobile data, but a wifi only + * tablet would return {@code false}. + * + * @param networkType The network type we'd like to check + * @return {@code true} if supported, else {@code false} + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @hide */ public boolean isNetworkSupported(int networkType) { @@ -941,9 +1226,16 @@ public class ConnectivityManager { /** * Returns if the currently active data network is metered. A network is * classified as metered when the user is sensitive to heavy data usage on - * that connection. You should check this before doing large data transfers, - * and warn the user or delay the operation until another network is - * available. + * that connection due to monetary costs, data limitations or + * battery/performance issues. You should check this before doing large + * data transfers, and warn the user or delay the operation until another + * network is available. + * + * @return {@code true} if large transfers should be avoided, otherwise + * {@code false}. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public boolean isActiveNetworkMetered() { try { @@ -953,7 +1245,15 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * If the LockdownVpn mechanism is enabled, updates the vpn + * with a reload of its profile. + * + * @return a boolean with {@code} indicating success + * + *

This method can only be called by the system UID + * {@hide} + */ public boolean updateLockdownVpn() { try { return mService.updateLockdownVpn(); @@ -963,6 +1263,14 @@ public class ConnectivityManager { } /** + * Signal that the captive portal check on the indicated network + * is complete and we can turn the network on for general use. + * + * @param info the {@link NetworkInfo} object for the networkType + * in question. + * + *

This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public void captivePortalCheckComplete(NetworkInfo info) { diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 6d817a17e7..7abd530b27 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -1823,6 +1823,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public void sendConnectedBroadcast(NetworkInfo info) { + enforceConnectivityInternalPermission(); sendGeneralBroadcast(info, CONNECTIVITY_ACTION_IMMEDIATE); sendGeneralBroadcast(info, CONNECTIVITY_ACTION); } @@ -2107,6 +2108,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { /** @hide */ public void captivePortalCheckComplete(NetworkInfo info) { + enforceConnectivityInternalPermission(); mNetTrackers[info.getType()].captivePortalCheckComplete(); } @@ -2365,7 +2367,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { * net.tcp.buffersize.[default|wifi|umts|edge|gprs] and set them for system * wide use */ - public void updateNetworkSettings(NetworkStateTracker nt) { + private void updateNetworkSettings(NetworkStateTracker nt) { String key = nt.getTcpBufferSizesPropName(); String bufferSizes = key == null ? null : SystemProperties.get(key); @@ -2844,7 +2846,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public int setUsbTethering(boolean enable) { - enforceTetherAccessPermission(); + enforceTetherChangePermission(); if (isTetheringSupported()) { return mTethering.setUsbTethering(enable); } else { @@ -2997,6 +2999,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public ProxyProperties getProxy() { + enforceAccessPermission(); synchronized (mDefaultProxyLock) { return mDefaultProxyDisabled ? null : mDefaultProxy; } @@ -3048,6 +3051,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public ProxyProperties getGlobalProxy() { + enforceAccessPermission(); synchronized (mGlobalProxyLock) { return mGlobalProxy; }