Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.net;
     18 
     19 import static com.android.internal.util.Preconditions.checkNotNull;
     20 
     21 import android.annotation.SdkConstant;
     22 import android.annotation.SdkConstant.SdkConstantType;
     23 import android.content.Context;
     24 import android.os.Binder;
     25 import android.os.Build.VERSION_CODES;
     26 import android.os.RemoteException;
     27 import android.provider.Settings;
     28 
     29 import java.net.InetAddress;
     30 
     31 /**
     32  * Class that answers queries about the state of network connectivity. It also
     33  * notifies applications when network connectivity changes. Get an instance
     34  * of this class by calling
     35  * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
     36  * <p>
     37  * The primary responsibilities of this class are to:
     38  * <ol>
     39  * <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li>
     40  * <li>Send broadcast intents when network connectivity changes</li>
     41  * <li>Attempt to "fail over" to another network when connectivity to a network
     42  * is lost</li>
     43  * <li>Provide an API that allows applications to query the coarse-grained or fine-grained
     44  * state of the available networks</li>
     45  * </ol>
     46  */
     47 public class ConnectivityManager {
     48     private static final String TAG = "ConnectivityManager";
     49 
     50     /**
     51      * A change in network connectivity has occurred. A connection has either
     52      * been established or lost. The NetworkInfo for the affected network is
     53      * sent as an extra; it should be consulted to see what kind of
     54      * connectivity event occurred.
     55      * <p/>
     56      * If this is a connection that was the result of failing over from a
     57      * disconnected network, then the FAILOVER_CONNECTION boolean extra is
     58      * set to true.
     59      * <p/>
     60      * For a loss of connectivity, if the connectivity manager is attempting
     61      * to connect (or has already connected) to another network, the
     62      * NetworkInfo for the new network is also passed as an extra. This lets
     63      * any receivers of the broadcast know that they should not necessarily
     64      * tell the user that no data traffic will be possible. Instead, the
     65      * reciever should expect another broadcast soon, indicating either that
     66      * the failover attempt succeeded (and so there is still overall data
     67      * connectivity), or that the failover attempt failed, meaning that all
     68      * connectivity has been lost.
     69      * <p/>
     70      * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY
     71      * is set to {@code true} if there are no connected networks at all.
     72      */
     73     public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
     74 
     75     /**
     76      * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any
     77      * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}.
     78      *
     79      * @hide
     80      */
     81     public static final String CONNECTIVITY_ACTION_IMMEDIATE =
     82             "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE";
     83 
     84     /**
     85      * The lookup key for a {@link NetworkInfo} object. Retrieve with
     86      * {@link android.content.Intent#getParcelableExtra(String)}.
     87      *
     88      * @deprecated Since {@link NetworkInfo} can vary based on UID, applications
     89      *             should always obtain network information through
     90      *             {@link #getActiveNetworkInfo()} or
     91      *             {@link #getAllNetworkInfo()}.
     92      */
     93     @Deprecated
     94     public static final String EXTRA_NETWORK_INFO = "networkInfo";
     95 
     96     /**
     97      * The lookup key for a boolean that indicates whether a connect event
     98      * is for a network to which the connectivity manager was failing over
     99      * following a disconnect on another network.
    100      * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
    101      */
    102     public static final String EXTRA_IS_FAILOVER = "isFailover";
    103     /**
    104      * The lookup key for a {@link NetworkInfo} object. This is supplied when
    105      * there is another network that it may be possible to connect to. Retrieve with
    106      * {@link android.content.Intent#getParcelableExtra(String)}.
    107      */
    108     public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
    109     /**
    110      * The lookup key for a boolean that indicates whether there is a
    111      * complete lack of connectivity, i.e., no network is available.
    112      * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
    113      */
    114     public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
    115     /**
    116      * The lookup key for a string that indicates why an attempt to connect
    117      * to a network failed. The string has no particular structure. It is
    118      * intended to be used in notifications presented to users. Retrieve
    119      * it with {@link android.content.Intent#getStringExtra(String)}.
    120      */
    121     public static final String EXTRA_REASON = "reason";
    122     /**
    123      * The lookup key for a string that provides optionally supplied
    124      * extra information about the network state. The information
    125      * may be passed up from the lower networking layers, and its
    126      * meaning may be specific to a particular network type. Retrieve
    127      * it with {@link android.content.Intent#getStringExtra(String)}.
    128      */
    129     public static final String EXTRA_EXTRA_INFO = "extraInfo";
    130     /**
    131      * The lookup key for an int that provides information about
    132      * our connection to the internet at large.  0 indicates no connection,
    133      * 100 indicates a great connection.  Retrieve it with
    134      * {@link android.content.Intent#getIntExtra(String, int)}.
    135      * {@hide}
    136      */
    137     public static final String EXTRA_INET_CONDITION = "inetCondition";
    138 
    139     /**
    140      * Broadcast Action: The setting for background data usage has changed
    141      * values. Use {@link #getBackgroundDataSetting()} to get the current value.
    142      * <p>
    143      * If an application uses the network in the background, it should listen
    144      * for this broadcast and stop using the background data if the value is
    145      * {@code false}.
    146      * <p>
    147      *
    148      * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability
    149      *             of background data depends on several combined factors, and
    150      *             this broadcast is no longer sent. Instead, when background
    151      *             data is unavailable, {@link #getActiveNetworkInfo()} will now
    152      *             appear disconnected. During first boot after a platform
    153      *             upgrade, this broadcast will be sent once if
    154      *             {@link #getBackgroundDataSetting()} was {@code false} before
    155      *             the upgrade.
    156      */
    157     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    158     @Deprecated
    159     public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED =
    160             "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
    161 
    162     /**
    163      * Broadcast Action: The network connection may not be good
    164      * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and
    165      * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify
    166      * the network and it's condition.
    167      * @hide
    168      */
    169     public static final String INET_CONDITION_ACTION =
    170             "android.net.conn.INET_CONDITION_ACTION";
    171 
    172     /**
    173      * Broadcast Action: A tetherable connection has come or gone
    174      * TODO - finish the doc
    175      * @hide
    176      */
    177     public static final String ACTION_TETHER_STATE_CHANGED =
    178             "android.net.conn.TETHER_STATE_CHANGED";
    179 
    180     /**
    181      * @hide
    182      * gives a String[]
    183      */
    184     public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
    185 
    186     /**
    187      * @hide
    188      * gives a String[]
    189      */
    190     public static final String EXTRA_ACTIVE_TETHER = "activeArray";
    191 
    192     /**
    193      * @hide
    194      * gives a String[]
    195      */
    196     public static final String EXTRA_ERRORED_TETHER = "erroredArray";
    197 
    198     /**
    199      * The absence of APN..
    200      * @hide
    201      */
    202     public static final int TYPE_NONE        = -1;
    203 
    204     /**
    205      * The Default Mobile data connection.  When active, all data traffic
    206      * will use this connection by default.
    207      */
    208     public static final int TYPE_MOBILE      = 0;
    209     /**
    210      * The Default WIFI data connection.  When active, all data traffic
    211      * will use this connection by default.
    212      */
    213     public static final int TYPE_WIFI        = 1;
    214     /**
    215      * An MMS-specific Mobile data connection.  This connection may be the
    216      * same as {@link #TYPE_MOBILE} but it may be different.  This is used
    217      * by applications needing to talk to the carrier's Multimedia Messaging
    218      * Service servers.  It may coexist with default data connections.
    219      */
    220     public static final int TYPE_MOBILE_MMS  = 2;
    221     /**
    222      * A SUPL-specific Mobile data connection.  This connection may be the
    223      * same as {@link #TYPE_MOBILE} but it may be different.  This is used
    224      * by applications needing to talk to the carrier's Secure User Plane
    225      * Location servers for help locating the device.  It may coexist with
    226      * default data connections.
    227      */
    228     public static final int TYPE_MOBILE_SUPL = 3;
    229     /**
    230      * A DUN-specific Mobile data connection.  This connection may be the
    231      * same as {@link #TYPE_MOBILE} but it may be different.  This is used
    232      * by applicaitons performing a Dial Up Networking bridge so that
    233      * the carrier is aware of DUN traffic.  It may coexist with default data
    234      * connections.
    235      */
    236     public static final int TYPE_MOBILE_DUN  = 4;
    237     /**
    238      * A High Priority Mobile data connection.  This connection is typically
    239      * the same as {@link #TYPE_MOBILE} but the routing setup is different.
    240      * Only requesting processes will have access to the Mobile DNS servers
    241      * and only IP's explicitly requested via {@link #requestRouteToHost}
    242      * will route over this interface if a default route exists.
    243      */
    244     public static final int TYPE_MOBILE_HIPRI = 5;
    245     /**
    246      * The Default WiMAX data connection.  When active, all data traffic
    247      * will use this connection by default.
    248      */
    249     public static final int TYPE_WIMAX       = 6;
    250 
    251     /**
    252      * The Default Bluetooth data connection. When active, all data traffic
    253      * will use this connection by default.
    254      */
    255     public static final int TYPE_BLUETOOTH   = 7;
    256 
    257     /**
    258      * Dummy data connection.  This should not be used on shipping devices.
    259      */
    260     public static final int TYPE_DUMMY       = 8;
    261 
    262     /**
    263      * The Default Ethernet data connection.  When active, all data traffic
    264      * will use this connection by default.
    265      */
    266     public static final int TYPE_ETHERNET    = 9;
    267 
    268     /**
    269      * Over the air Adminstration.
    270      * {@hide}
    271      */
    272     public static final int TYPE_MOBILE_FOTA = 10;
    273 
    274     /**
    275      * IP Multimedia Subsystem
    276      * {@hide}
    277      */
    278     public static final int TYPE_MOBILE_IMS  = 11;
    279 
    280     /**
    281      * Carrier Branded Services
    282      * {@hide}
    283      */
    284     public static final int TYPE_MOBILE_CBS  = 12;
    285 
    286     /**
    287      * A Wi-Fi p2p connection. Only requesting processes will have access to
    288      * the peers connected.
    289      * {@hide}
    290      */
    291     public static final int TYPE_WIFI_P2P    = 13;
    292 
    293     /** {@hide} */
    294     public static final int MAX_RADIO_TYPE   = TYPE_WIFI_P2P;
    295 
    296     /** {@hide} */
    297     public static final int MAX_NETWORK_TYPE = TYPE_WIFI_P2P;
    298 
    299     public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
    300 
    301     private final IConnectivityManager mService;
    302 
    303     public static boolean isNetworkTypeValid(int networkType) {
    304         return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
    305     }
    306 
    307     /** {@hide} */
    308     public static String getNetworkTypeName(int type) {
    309         switch (type) {
    310             case TYPE_MOBILE:
    311                 return "MOBILE";
    312             case TYPE_WIFI:
    313                 return "WIFI";
    314             case TYPE_MOBILE_MMS:
    315                 return "MOBILE_MMS";
    316             case TYPE_MOBILE_SUPL:
    317                 return "MOBILE_SUPL";
    318             case TYPE_MOBILE_DUN:
    319                 return "MOBILE_DUN";
    320             case TYPE_MOBILE_HIPRI:
    321                 return "MOBILE_HIPRI";
    322             case TYPE_WIMAX:
    323                 return "WIMAX";
    324             case TYPE_BLUETOOTH:
    325                 return "BLUETOOTH";
    326             case TYPE_DUMMY:
    327                 return "DUMMY";
    328             case TYPE_ETHERNET:
    329                 return "ETHERNET";
    330             case TYPE_MOBILE_FOTA:
    331                 return "MOBILE_FOTA";
    332             case TYPE_MOBILE_IMS:
    333                 return "MOBILE_IMS";
    334             case TYPE_MOBILE_CBS:
    335                 return "MOBILE_CBS";
    336             case TYPE_WIFI_P2P:
    337                 return "WIFI_P2P";
    338             default:
    339                 return Integer.toString(type);
    340         }
    341     }
    342 
    343     /** {@hide} */
    344     public static boolean isNetworkTypeMobile(int networkType) {
    345         switch (networkType) {
    346             case TYPE_MOBILE:
    347             case TYPE_MOBILE_MMS:
    348             case TYPE_MOBILE_SUPL:
    349             case TYPE_MOBILE_DUN:
    350             case TYPE_MOBILE_HIPRI:
    351             case TYPE_MOBILE_FOTA:
    352             case TYPE_MOBILE_IMS:
    353             case TYPE_MOBILE_CBS:
    354                 return true;
    355             default:
    356                 return false;
    357         }
    358     }
    359 
    360     public void setNetworkPreference(int preference) {
    361         try {
    362             mService.setNetworkPreference(preference);
    363         } catch (RemoteException e) {
    364         }
    365     }
    366 
    367     public int getNetworkPreference() {
    368         try {
    369             return mService.getNetworkPreference();
    370         } catch (RemoteException e) {
    371             return -1;
    372         }
    373     }
    374 
    375     /**
    376      * Returns details about the currently active data network. When connected,
    377      * this network is the default route for outgoing connections. You should
    378      * always check {@link NetworkInfo#isConnected()} before initiating network
    379      * traffic. This may return {@code null} when no networks are available.
    380      * <p>This method requires the caller to hold the permission
    381      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    382      */
    383     public NetworkInfo getActiveNetworkInfo() {
    384         try {
    385             return mService.getActiveNetworkInfo();
    386         } catch (RemoteException e) {
    387             return null;
    388         }
    389     }
    390 
    391     /** {@hide} */
    392     public NetworkInfo getActiveNetworkInfoForUid(int uid) {
    393         try {
    394             return mService.getActiveNetworkInfoForUid(uid);
    395         } catch (RemoteException e) {
    396             return null;
    397         }
    398     }
    399 
    400     public NetworkInfo getNetworkInfo(int networkType) {
    401         try {
    402             return mService.getNetworkInfo(networkType);
    403         } catch (RemoteException e) {
    404             return null;
    405         }
    406     }
    407 
    408     public NetworkInfo[] getAllNetworkInfo() {
    409         try {
    410             return mService.getAllNetworkInfo();
    411         } catch (RemoteException e) {
    412             return null;
    413         }
    414     }
    415 
    416     /** {@hide} */
    417     public LinkProperties getActiveLinkProperties() {
    418         try {
    419             return mService.getActiveLinkProperties();
    420         } catch (RemoteException e) {
    421             return null;
    422         }
    423     }
    424 
    425     /** {@hide} */
    426     public LinkProperties getLinkProperties(int networkType) {
    427         try {
    428             return mService.getLinkProperties(networkType);
    429         } catch (RemoteException e) {
    430             return null;
    431         }
    432     }
    433 
    434     /** {@hide} */
    435     public boolean setRadios(boolean turnOn) {
    436         try {
    437             return mService.setRadios(turnOn);
    438         } catch (RemoteException e) {
    439             return false;
    440         }
    441     }
    442 
    443     /** {@hide} */
    444     public boolean setRadio(int networkType, boolean turnOn) {
    445         try {
    446             return mService.setRadio(networkType, turnOn);
    447         } catch (RemoteException e) {
    448             return false;
    449         }
    450     }
    451 
    452     /**
    453      * Tells the underlying networking system that the caller wants to
    454      * begin using the named feature. The interpretation of {@code feature}
    455      * is completely up to each networking implementation.
    456      * <p>This method requires the caller to hold the permission
    457      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    458      * @param networkType specifies which network the request pertains to
    459      * @param feature the name of the feature to be used
    460      * @return an integer value representing the outcome of the request.
    461      * The interpretation of this value is specific to each networking
    462      * implementation+feature combination, except that the value {@code -1}
    463      * always indicates failure.
    464      */
    465     public int startUsingNetworkFeature(int networkType, String feature) {
    466         try {
    467             return mService.startUsingNetworkFeature(networkType, feature,
    468                     new Binder());
    469         } catch (RemoteException e) {
    470             return -1;
    471         }
    472     }
    473 
    474     /**
    475      * Tells the underlying networking system that the caller is finished
    476      * using the named feature. The interpretation of {@code feature}
    477      * is completely up to each networking implementation.
    478      * <p>This method requires the caller to hold the permission
    479      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    480      * @param networkType specifies which network the request pertains to
    481      * @param feature the name of the feature that is no longer needed
    482      * @return an integer value representing the outcome of the request.
    483      * The interpretation of this value is specific to each networking
    484      * implementation+feature combination, except that the value {@code -1}
    485      * always indicates failure.
    486      */
    487     public int stopUsingNetworkFeature(int networkType, String feature) {
    488         try {
    489             return mService.stopUsingNetworkFeature(networkType, feature);
    490         } catch (RemoteException e) {
    491             return -1;
    492         }
    493     }
    494 
    495     /**
    496      * Ensure that a network route exists to deliver traffic to the specified
    497      * host via the specified network interface. An attempt to add a route that
    498      * already exists is ignored, but treated as successful.
    499      * <p>This method requires the caller to hold the permission
    500      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    501      * @param networkType the type of the network over which traffic to the specified
    502      * host is to be routed
    503      * @param hostAddress the IP address of the host to which the route is desired
    504      * @return {@code true} on success, {@code false} on failure
    505      */
    506     public boolean requestRouteToHost(int networkType, int hostAddress) {
    507         InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress);
    508 
    509         if (inetAddress == null) {
    510             return false;
    511         }
    512 
    513         return requestRouteToHostAddress(networkType, inetAddress);
    514     }
    515 
    516     /**
    517      * Ensure that a network route exists to deliver traffic to the specified
    518      * host via the specified network interface. An attempt to add a route that
    519      * already exists is ignored, but treated as successful.
    520      * @param networkType the type of the network over which traffic to the specified
    521      * host is to be routed
    522      * @param hostAddress the IP address of the host to which the route is desired
    523      * @return {@code true} on success, {@code false} on failure
    524      * @hide
    525      */
    526     public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
    527         byte[] address = hostAddress.getAddress();
    528         try {
    529             return mService.requestRouteToHostAddress(networkType, address);
    530         } catch (RemoteException e) {
    531             return false;
    532         }
    533     }
    534 
    535     /**
    536      * Returns the value of the setting for background data usage. If false,
    537      * applications should not use the network if the application is not in the
    538      * foreground. Developers should respect this setting, and check the value
    539      * of this before performing any background data operations.
    540      * <p>
    541      * All applications that have background services that use the network
    542      * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
    543      * <p>
    544      * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
    545      * background data depends on several combined factors, and this method will
    546      * always return {@code true}. Instead, when background data is unavailable,
    547      * {@link #getActiveNetworkInfo()} will now appear disconnected.
    548      *
    549      * @return Whether background data usage is allowed.
    550      */
    551     @Deprecated
    552     public boolean getBackgroundDataSetting() {
    553         // assume that background data is allowed; final authority is
    554         // NetworkInfo which may be blocked.
    555         return true;
    556     }
    557 
    558     /**
    559      * Sets the value of the setting for background data usage.
    560      *
    561      * @param allowBackgroundData Whether an application should use data while
    562      *            it is in the background.
    563      *
    564      * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
    565      * @see #getBackgroundDataSetting()
    566      * @hide
    567      */
    568     @Deprecated
    569     public void setBackgroundDataSetting(boolean allowBackgroundData) {
    570         // ignored
    571     }
    572 
    573     /**
    574      * Return quota status for the current active network, or {@code null} if no
    575      * network is active. Quota status can change rapidly, so these values
    576      * shouldn't be cached.
    577      *
    578      * @hide
    579      */
    580     public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
    581         try {
    582             return mService.getActiveNetworkQuotaInfo();
    583         } catch (RemoteException e) {
    584             return null;
    585         }
    586     }
    587 
    588     /**
    589      * Gets the value of the setting for enabling Mobile data.
    590      *
    591      * @return Whether mobile data is enabled.
    592      * @hide
    593      */
    594     public boolean getMobileDataEnabled() {
    595         try {
    596             return mService.getMobileDataEnabled();
    597         } catch (RemoteException e) {
    598             return true;
    599         }
    600     }
    601 
    602     /**
    603      * Sets the persisted value for enabling/disabling Mobile data.
    604      *
    605      * @param enabled Whether the mobile data connection should be
    606      *            used or not.
    607      * @hide
    608      */
    609     public void setMobileDataEnabled(boolean enabled) {
    610         try {
    611             mService.setMobileDataEnabled(enabled);
    612         } catch (RemoteException e) {
    613         }
    614     }
    615 
    616     /**
    617      * {@hide}
    618      */
    619     public ConnectivityManager(IConnectivityManager service) {
    620         mService = checkNotNull(service, "missing IConnectivityManager");
    621     }
    622 
    623     /** {@hide} */
    624     public static ConnectivityManager from(Context context) {
    625         return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    626     }
    627 
    628     /**
    629      * {@hide}
    630      */
    631     public String[] getTetherableIfaces() {
    632         try {
    633             return mService.getTetherableIfaces();
    634         } catch (RemoteException e) {
    635             return new String[0];
    636         }
    637     }
    638 
    639     /**
    640      * {@hide}
    641      */
    642     public String[] getTetheredIfaces() {
    643         try {
    644             return mService.getTetheredIfaces();
    645         } catch (RemoteException e) {
    646             return new String[0];
    647         }
    648     }
    649 
    650     /**
    651      * {@hide}
    652      */
    653     public String[] getTetheringErroredIfaces() {
    654         try {
    655             return mService.getTetheringErroredIfaces();
    656         } catch (RemoteException e) {
    657             return new String[0];
    658         }
    659     }
    660 
    661     /**
    662      * @return error A TETHER_ERROR value indicating success or failure type
    663      * {@hide}
    664      */
    665     public int tether(String iface) {
    666         try {
    667             return mService.tether(iface);
    668         } catch (RemoteException e) {
    669             return TETHER_ERROR_SERVICE_UNAVAIL;
    670         }
    671     }
    672 
    673     /**
    674      * @return error A TETHER_ERROR value indicating success or failure type
    675      * {@hide}
    676      */
    677     public int untether(String iface) {
    678         try {
    679             return mService.untether(iface);
    680         } catch (RemoteException e) {
    681             return TETHER_ERROR_SERVICE_UNAVAIL;
    682         }
    683     }
    684 
    685     /**
    686      * {@hide}
    687      */
    688     public boolean isTetheringSupported() {
    689         try {
    690             return mService.isTetheringSupported();
    691         } catch (RemoteException e) {
    692             return false;
    693         }
    694     }
    695 
    696     /**
    697      * {@hide}
    698      */
    699     public String[] getTetherableUsbRegexs() {
    700         try {
    701             return mService.getTetherableUsbRegexs();
    702         } catch (RemoteException e) {
    703             return new String[0];
    704         }
    705     }
    706 
    707     /**
    708      * {@hide}
    709      */
    710     public String[] getTetherableWifiRegexs() {
    711         try {
    712             return mService.getTetherableWifiRegexs();
    713         } catch (RemoteException e) {
    714             return new String[0];
    715         }
    716     }
    717 
    718     /**
    719      * {@hide}
    720      */
    721     public String[] getTetherableBluetoothRegexs() {
    722         try {
    723             return mService.getTetherableBluetoothRegexs();
    724         } catch (RemoteException e) {
    725             return new String[0];
    726         }
    727     }
    728 
    729     /**
    730      * {@hide}
    731      */
    732     public int setUsbTethering(boolean enable) {
    733         try {
    734             return mService.setUsbTethering(enable);
    735         } catch (RemoteException e) {
    736             return TETHER_ERROR_SERVICE_UNAVAIL;
    737         }
    738     }
    739 
    740     /** {@hide} */
    741     public static final int TETHER_ERROR_NO_ERROR           = 0;
    742     /** {@hide} */
    743     public static final int TETHER_ERROR_UNKNOWN_IFACE      = 1;
    744     /** {@hide} */
    745     public static final int TETHER_ERROR_SERVICE_UNAVAIL    = 2;
    746     /** {@hide} */
    747     public static final int TETHER_ERROR_UNSUPPORTED        = 3;
    748     /** {@hide} */
    749     public static final int TETHER_ERROR_UNAVAIL_IFACE      = 4;
    750     /** {@hide} */
    751     public static final int TETHER_ERROR_MASTER_ERROR       = 5;
    752     /** {@hide} */
    753     public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
    754     /** {@hide} */
    755     public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
    756     /** {@hide} */
    757     public static final int TETHER_ERROR_ENABLE_NAT_ERROR     = 8;
    758     /** {@hide} */
    759     public static final int TETHER_ERROR_DISABLE_NAT_ERROR    = 9;
    760     /** {@hide} */
    761     public static final int TETHER_ERROR_IFACE_CFG_ERROR      = 10;
    762 
    763     /**
    764      * @param iface The name of the interface we're interested in
    765      * @return error The error code of the last error tethering or untethering the named
    766      *               interface
    767      * {@hide}
    768      */
    769     public int getLastTetherError(String iface) {
    770         try {
    771             return mService.getLastTetherError(iface);
    772         } catch (RemoteException e) {
    773             return TETHER_ERROR_SERVICE_UNAVAIL;
    774         }
    775     }
    776 
    777     /**
    778      * Ensure the device stays awake until we connect with the next network
    779      * @param forWhome The name of the network going down for logging purposes
    780      * @return {@code true} on success, {@code false} on failure
    781      * {@hide}
    782      */
    783     public boolean requestNetworkTransitionWakelock(String forWhom) {
    784         try {
    785             mService.requestNetworkTransitionWakelock(forWhom);
    786             return true;
    787         } catch (RemoteException e) {
    788             return false;
    789         }
    790     }
    791 
    792     /**
    793      * @param networkType The type of network you want to report on
    794      * @param percentage The quality of the connection 0 is bad, 100 is good
    795      * {@hide}
    796      */
    797     public void reportInetCondition(int networkType, int percentage) {
    798         try {
    799             mService.reportInetCondition(networkType, percentage);
    800         } catch (RemoteException e) {
    801         }
    802     }
    803 
    804     /**
    805      * @param proxyProperties The definition for the new global http proxy
    806      * {@hide}
    807      */
    808     public void setGlobalProxy(ProxyProperties p) {
    809         try {
    810             mService.setGlobalProxy(p);
    811         } catch (RemoteException e) {
    812         }
    813     }
    814 
    815     /**
    816      * @return proxyProperties for the current global proxy
    817      * {@hide}
    818      */
    819     public ProxyProperties getGlobalProxy() {
    820         try {
    821             return mService.getGlobalProxy();
    822         } catch (RemoteException e) {
    823             return null;
    824         }
    825     }
    826 
    827     /**
    828      * @return proxyProperties for the current proxy (global if set, network specific if not)
    829      * {@hide}
    830      */
    831     public ProxyProperties getProxy() {
    832         try {
    833             return mService.getProxy();
    834         } catch (RemoteException e) {
    835             return null;
    836         }
    837     }
    838 
    839     /**
    840      * @param networkType The network who's dependence has changed
    841      * @param met Boolean - true if network use is ok, false if not
    842      * {@hide}
    843      */
    844     public void setDataDependency(int networkType, boolean met) {
    845         try {
    846             mService.setDataDependency(networkType, met);
    847         } catch (RemoteException e) {
    848         }
    849     }
    850 
    851     /**
    852      * Returns true if the hardware supports the given network type
    853      * else it returns false.  This doesn't indicate we have coverage
    854      * or are authorized onto a network, just whether or not the
    855      * hardware supports it.  For example a gsm phone without a sim
    856      * should still return true for mobile data, but a wifi only tablet
    857      * would return false.
    858      * @param networkType The nework type we'd like to check
    859      * @return true if supported, else false
    860      * @hide
    861      */
    862     public boolean isNetworkSupported(int networkType) {
    863         try {
    864             return mService.isNetworkSupported(networkType);
    865         } catch (RemoteException e) {}
    866         return false;
    867     }
    868 
    869     /**
    870      * Returns if the currently active data network is metered. A network is
    871      * classified as metered when the user is sensitive to heavy data usage on
    872      * that connection. You should check this before doing large data transfers,
    873      * and warn the user or delay the operation until another network is
    874      * available.
    875      */
    876     public boolean isActiveNetworkMetered() {
    877         try {
    878             return mService.isActiveNetworkMetered();
    879         } catch (RemoteException e) {
    880             return false;
    881         }
    882     }
    883 }
    884