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.Messenger;
     27 import android.os.RemoteException;
     28 import android.os.ResultReceiver;
     29 import android.provider.Settings;
     30 
     31 import java.net.InetAddress;
     32 
     33 /**
     34  * Class that answers queries about the state of network connectivity. It also
     35  * notifies applications when network connectivity changes. Get an instance
     36  * of this class by calling
     37  * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
     38  * <p>
     39  * The primary responsibilities of this class are to:
     40  * <ol>
     41  * <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li>
     42  * <li>Send broadcast intents when network connectivity changes</li>
     43  * <li>Attempt to "fail over" to another network when connectivity to a network
     44  * is lost</li>
     45  * <li>Provide an API that allows applications to query the coarse-grained or fine-grained
     46  * state of the available networks</li>
     47  * </ol>
     48  */
     49 public class ConnectivityManager {
     50     private static final String TAG = "ConnectivityManager";
     51 
     52     /**
     53      * A change in network connectivity has occurred. A connection has either
     54      * been established or lost. The NetworkInfo for the affected network is
     55      * sent as an extra; it should be consulted to see what kind of
     56      * connectivity event occurred.
     57      * <p/>
     58      * If this is a connection that was the result of failing over from a
     59      * disconnected network, then the FAILOVER_CONNECTION boolean extra is
     60      * set to true.
     61      * <p/>
     62      * For a loss of connectivity, if the connectivity manager is attempting
     63      * to connect (or has already connected) to another network, the
     64      * NetworkInfo for the new network is also passed as an extra. This lets
     65      * any receivers of the broadcast know that they should not necessarily
     66      * tell the user that no data traffic will be possible. Instead, the
     67      * receiver should expect another broadcast soon, indicating either that
     68      * the failover attempt succeeded (and so there is still overall data
     69      * connectivity), or that the failover attempt failed, meaning that all
     70      * connectivity has been lost.
     71      * <p/>
     72      * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY
     73      * is set to {@code true} if there are no connected networks at all.
     74      */
     75     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     76     public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
     77 
     78     /**
     79      * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any
     80      * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}.
     81      *
     82      * @hide
     83      */
     84     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     85     public static final String CONNECTIVITY_ACTION_IMMEDIATE =
     86             "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE";
     87 
     88     /**
     89      * The lookup key for a {@link NetworkInfo} object. Retrieve with
     90      * {@link android.content.Intent#getParcelableExtra(String)}.
     91      *
     92      * @deprecated Since {@link NetworkInfo} can vary based on UID, applications
     93      *             should always obtain network information through
     94      *             {@link #getActiveNetworkInfo()} or
     95      *             {@link #getAllNetworkInfo()}.
     96      * @see #EXTRA_NETWORK_TYPE
     97      */
     98     @Deprecated
     99     public static final String EXTRA_NETWORK_INFO = "networkInfo";
    100 
    101     /**
    102      * Network type which triggered a {@link #CONNECTIVITY_ACTION} broadcast.
    103      * Can be used with {@link #getNetworkInfo(int)} to get {@link NetworkInfo}
    104      * state based on the calling application.
    105      *
    106      * @see android.content.Intent#getIntExtra(String, int)
    107      */
    108     public static final String EXTRA_NETWORK_TYPE = "networkType";
    109 
    110     /**
    111      * The lookup key for a boolean that indicates whether a connect event
    112      * is for a network to which the connectivity manager was failing over
    113      * following a disconnect on another network.
    114      * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
    115      */
    116     public static final String EXTRA_IS_FAILOVER = "isFailover";
    117     /**
    118      * The lookup key for a {@link NetworkInfo} object. This is supplied when
    119      * there is another network that it may be possible to connect to. Retrieve with
    120      * {@link android.content.Intent#getParcelableExtra(String)}.
    121      */
    122     public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
    123     /**
    124      * The lookup key for a boolean that indicates whether there is a
    125      * complete lack of connectivity, i.e., no network is available.
    126      * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
    127      */
    128     public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
    129     /**
    130      * The lookup key for a string that indicates why an attempt to connect
    131      * to a network failed. The string has no particular structure. It is
    132      * intended to be used in notifications presented to users. Retrieve
    133      * it with {@link android.content.Intent#getStringExtra(String)}.
    134      */
    135     public static final String EXTRA_REASON = "reason";
    136     /**
    137      * The lookup key for a string that provides optionally supplied
    138      * extra information about the network state. The information
    139      * may be passed up from the lower networking layers, and its
    140      * meaning may be specific to a particular network type. Retrieve
    141      * it with {@link android.content.Intent#getStringExtra(String)}.
    142      */
    143     public static final String EXTRA_EXTRA_INFO = "extraInfo";
    144     /**
    145      * The lookup key for an int that provides information about
    146      * our connection to the internet at large.  0 indicates no connection,
    147      * 100 indicates a great connection.  Retrieve it with
    148      * {@link android.content.Intent#getIntExtra(String, int)}.
    149      * {@hide}
    150      */
    151     public static final String EXTRA_INET_CONDITION = "inetCondition";
    152 
    153     /**
    154      * Broadcast action to indicate the change of data activity status
    155      * (idle or active) on a network in a recent period.
    156      * The network becomes active when data transmission is started, or
    157      * idle if there is no data transmission for a period of time.
    158      * {@hide}
    159      */
    160     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    161     public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE";
    162     /**
    163      * The lookup key for an enum that indicates the network device type on which this data activity
    164      * change happens.
    165      * {@hide}
    166      */
    167     public static final String EXTRA_DEVICE_TYPE = "deviceType";
    168     /**
    169      * The lookup key for a boolean that indicates the device is active or not. {@code true} means
    170      * it is actively sending or receiving data and {@code false} means it is idle.
    171      * {@hide}
    172      */
    173     public static final String EXTRA_IS_ACTIVE = "isActive";
    174 
    175     /**
    176      * Broadcast Action: The setting for background data usage has changed
    177      * values. Use {@link #getBackgroundDataSetting()} to get the current value.
    178      * <p>
    179      * If an application uses the network in the background, it should listen
    180      * for this broadcast and stop using the background data if the value is
    181      * {@code false}.
    182      * <p>
    183      *
    184      * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability
    185      *             of background data depends on several combined factors, and
    186      *             this broadcast is no longer sent. Instead, when background
    187      *             data is unavailable, {@link #getActiveNetworkInfo()} will now
    188      *             appear disconnected. During first boot after a platform
    189      *             upgrade, this broadcast will be sent once if
    190      *             {@link #getBackgroundDataSetting()} was {@code false} before
    191      *             the upgrade.
    192      */
    193     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    194     @Deprecated
    195     public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED =
    196             "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
    197 
    198     /**
    199      * Broadcast Action: The network connection may not be good
    200      * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and
    201      * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify
    202      * the network and it's condition.
    203      * @hide
    204      */
    205     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    206     public static final String INET_CONDITION_ACTION =
    207             "android.net.conn.INET_CONDITION_ACTION";
    208 
    209     /**
    210      * Broadcast Action: A tetherable connection has come or gone.
    211      * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER},
    212      * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER} and
    213      * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate
    214      * the current state of tethering.  Each include a list of
    215      * interface names in that state (may be empty).
    216      * @hide
    217      */
    218     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    219     public static final String ACTION_TETHER_STATE_CHANGED =
    220             "android.net.conn.TETHER_STATE_CHANGED";
    221 
    222     /**
    223      * @hide
    224      * gives a String[] listing all the interfaces configured for
    225      * tethering and currently available for tethering.
    226      */
    227     public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
    228 
    229     /**
    230      * @hide
    231      * gives a String[] listing all the interfaces currently tethered
    232      * (ie, has dhcp support and packets potentially forwarded/NATed)
    233      */
    234     public static final String EXTRA_ACTIVE_TETHER = "activeArray";
    235 
    236     /**
    237      * @hide
    238      * gives a String[] listing all the interfaces we tried to tether and
    239      * failed.  Use {@link #getLastTetherError} to find the error code
    240      * for any interfaces listed here.
    241      */
    242     public static final String EXTRA_ERRORED_TETHER = "erroredArray";
    243 
    244     /**
    245      * Broadcast Action: The captive portal tracker has finished its test.
    246      * Sent only while running Setup Wizard, in lieu of showing a user
    247      * notification.
    248      * @hide
    249      */
    250     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    251     public static final String ACTION_CAPTIVE_PORTAL_TEST_COMPLETED =
    252             "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED";
    253     /**
    254      * The lookup key for a boolean that indicates whether a captive portal was detected.
    255      * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
    256      * @hide
    257      */
    258     public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal";
    259 
    260     /**
    261      * The absence of a connection type.
    262      * @hide
    263      */
    264     public static final int TYPE_NONE        = -1;
    265 
    266     /**
    267      * The Mobile data connection.  When active, all data traffic
    268      * will use this network type's interface by default
    269      * (it has a default route)
    270      */
    271     public static final int TYPE_MOBILE      = 0;
    272     /**
    273      * The WIFI data connection.  When active, all data traffic
    274      * will use this network type's interface by default
    275      * (it has a default route).
    276      */
    277     public static final int TYPE_WIFI        = 1;
    278     /**
    279      * An MMS-specific Mobile data connection.  This network type may use the
    280      * same network interface as {@link #TYPE_MOBILE} or it may use a different
    281      * one.  This is used by applications needing to talk to the carrier's
    282      * Multimedia Messaging Service servers.
    283      */
    284     public static final int TYPE_MOBILE_MMS  = 2;
    285     /**
    286      * A SUPL-specific Mobile data connection.  This network type may use the
    287      * same network interface as {@link #TYPE_MOBILE} or it may use a different
    288      * one.  This is used by applications needing to talk to the carrier's
    289      * Secure User Plane Location servers for help locating the device.
    290      */
    291     public static final int TYPE_MOBILE_SUPL = 3;
    292     /**
    293      * A DUN-specific Mobile data connection.  This network type may use the
    294      * same network interface as {@link #TYPE_MOBILE} or it may use a different
    295      * one.  This is sometimes by the system when setting up an upstream connection
    296      * for tethering so that the carrier is aware of DUN traffic.
    297      */
    298     public static final int TYPE_MOBILE_DUN  = 4;
    299     /**
    300      * A High Priority Mobile data connection.  This network type uses the
    301      * same network interface as {@link #TYPE_MOBILE} but the routing setup
    302      * is different.  Only requesting processes will have access to the
    303      * Mobile DNS servers and only IP's explicitly requested via {@link #requestRouteToHost}
    304      * will route over this interface if no default route exists.
    305      */
    306     public static final int TYPE_MOBILE_HIPRI = 5;
    307     /**
    308      * The WiMAX data connection.  When active, all data traffic
    309      * will use this network type's interface by default
    310      * (it has a default route).
    311      */
    312     public static final int TYPE_WIMAX       = 6;
    313 
    314     /**
    315      * The Bluetooth data connection.  When active, all data traffic
    316      * will use this network type's interface by default
    317      * (it has a default route).
    318      */
    319     public static final int TYPE_BLUETOOTH   = 7;
    320 
    321     /**
    322      * Dummy data connection.  This should not be used on shipping devices.
    323      */
    324     public static final int TYPE_DUMMY       = 8;
    325 
    326     /**
    327      * The Ethernet data connection.  When active, all data traffic
    328      * will use this network type's interface by default
    329      * (it has a default route).
    330      */
    331     public static final int TYPE_ETHERNET    = 9;
    332 
    333     /**
    334      * Over the air Administration.
    335      * {@hide}
    336      */
    337     public static final int TYPE_MOBILE_FOTA = 10;
    338 
    339     /**
    340      * IP Multimedia Subsystem.
    341      * {@hide}
    342      */
    343     public static final int TYPE_MOBILE_IMS  = 11;
    344 
    345     /**
    346      * Carrier Branded Services.
    347      * {@hide}
    348      */
    349     public static final int TYPE_MOBILE_CBS  = 12;
    350 
    351     /**
    352      * A Wi-Fi p2p connection. Only requesting processes will have access to
    353      * the peers connected.
    354      * {@hide}
    355      */
    356     public static final int TYPE_WIFI_P2P    = 13;
    357 
    358     /** {@hide} */
    359     public static final int MAX_RADIO_TYPE   = TYPE_WIFI_P2P;
    360 
    361     /** {@hide} */
    362     public static final int MAX_NETWORK_TYPE = TYPE_WIFI_P2P;
    363 
    364     /**
    365      * If you want to set the default network preference,you can directly
    366      * change the networkAttributes array in framework's config.xml.
    367      *
    368      * @deprecated Since we support so many more networks now, the single
    369      *             network default network preference can't really express
    370      *             the hierarchy.  Instead, the default is defined by the
    371      *             networkAttributes in config.xml.  You can determine
    372      *             the current value by calling {@link #getNetworkPreference()}
    373      *             from an App.
    374      */
    375     @Deprecated
    376     public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
    377 
    378     /**
    379      * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in
    380      * milliseconds.  This was introduced because IPv6 routes seem to take a
    381      * moment to settle - trying network activity before the routes are adjusted
    382      * can lead to packets using the wrong interface or having the wrong IP address.
    383      * This delay is a bit crude, but in the future hopefully we will have kernel
    384      * notifications letting us know when it's safe to use the new network.
    385      *
    386      * @hide
    387      */
    388     public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000;
    389 
    390     private final IConnectivityManager mService;
    391 
    392     /**
    393      * Tests if a given integer represents a valid network type.
    394      * @param networkType the type to be tested
    395      * @return a boolean.  {@code true} if the type is valid, else {@code false}
    396      */
    397     public static boolean isNetworkTypeValid(int networkType) {
    398         return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
    399     }
    400 
    401     /**
    402      * Returns a non-localized string representing a given network type.
    403      * ONLY used for debugging output.
    404      * @param type the type needing naming
    405      * @return a String for the given type, or a string version of the type ("87")
    406      * if no name is known.
    407      * {@hide}
    408      */
    409     public static String getNetworkTypeName(int type) {
    410         switch (type) {
    411             case TYPE_MOBILE:
    412                 return "MOBILE";
    413             case TYPE_WIFI:
    414                 return "WIFI";
    415             case TYPE_MOBILE_MMS:
    416                 return "MOBILE_MMS";
    417             case TYPE_MOBILE_SUPL:
    418                 return "MOBILE_SUPL";
    419             case TYPE_MOBILE_DUN:
    420                 return "MOBILE_DUN";
    421             case TYPE_MOBILE_HIPRI:
    422                 return "MOBILE_HIPRI";
    423             case TYPE_WIMAX:
    424                 return "WIMAX";
    425             case TYPE_BLUETOOTH:
    426                 return "BLUETOOTH";
    427             case TYPE_DUMMY:
    428                 return "DUMMY";
    429             case TYPE_ETHERNET:
    430                 return "ETHERNET";
    431             case TYPE_MOBILE_FOTA:
    432                 return "MOBILE_FOTA";
    433             case TYPE_MOBILE_IMS:
    434                 return "MOBILE_IMS";
    435             case TYPE_MOBILE_CBS:
    436                 return "MOBILE_CBS";
    437             case TYPE_WIFI_P2P:
    438                 return "WIFI_P2P";
    439             default:
    440                 return Integer.toString(type);
    441         }
    442     }
    443 
    444     /**
    445      * Checks if a given type uses the cellular data connection.
    446      * This should be replaced in the future by a network property.
    447      * @param networkType the type to check
    448      * @return a boolean - {@code true} if uses cellular network, else {@code false}
    449      * {@hide}
    450      */
    451     public static boolean isNetworkTypeMobile(int networkType) {
    452         switch (networkType) {
    453             case TYPE_MOBILE:
    454             case TYPE_MOBILE_MMS:
    455             case TYPE_MOBILE_SUPL:
    456             case TYPE_MOBILE_DUN:
    457             case TYPE_MOBILE_HIPRI:
    458             case TYPE_MOBILE_FOTA:
    459             case TYPE_MOBILE_IMS:
    460             case TYPE_MOBILE_CBS:
    461                 return true;
    462             default:
    463                 return false;
    464         }
    465     }
    466 
    467     /**
    468      * Specifies the preferred network type.  When the device has more
    469      * than one type available the preferred network type will be used.
    470      * Note that this made sense when we only had 2 network types,
    471      * but with more and more default networks we need an array to list
    472      * their ordering.  This will be deprecated soon.
    473      *
    474      * @param preference the network type to prefer over all others.  It is
    475      *         unspecified what happens to the old preferred network in the
    476      *         overall ordering.
    477      */
    478     public void setNetworkPreference(int preference) {
    479         try {
    480             mService.setNetworkPreference(preference);
    481         } catch (RemoteException e) {
    482         }
    483     }
    484 
    485     /**
    486      * Retrieves the current preferred network type.
    487      * Note that this made sense when we only had 2 network types,
    488      * but with more and more default networks we need an array to list
    489      * their ordering.  This will be deprecated soon.
    490      *
    491      * @return an integer representing the preferred network type
    492      *
    493      * <p>This method requires the caller to hold the permission
    494      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    495      */
    496     public int getNetworkPreference() {
    497         try {
    498             return mService.getNetworkPreference();
    499         } catch (RemoteException e) {
    500             return -1;
    501         }
    502     }
    503 
    504     /**
    505      * Returns details about the currently active default data network. When
    506      * connected, this network is the default route for outgoing connections.
    507      * You should always check {@link NetworkInfo#isConnected()} before initiating
    508      * network traffic. This may return {@code null} when there is no default
    509      * network.
    510      *
    511      * @return a {@link NetworkInfo} object for the current default network
    512      *        or {@code null} if no network default network is currently active
    513      *
    514      * <p>This method requires the call to hold the permission
    515      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    516      */
    517     public NetworkInfo getActiveNetworkInfo() {
    518         try {
    519             return mService.getActiveNetworkInfo();
    520         } catch (RemoteException e) {
    521             return null;
    522         }
    523     }
    524 
    525     /**
    526      * Returns details about the currently active default data network
    527      * for a given uid.  This is for internal use only to avoid spying
    528      * other apps.
    529      *
    530      * @return a {@link NetworkInfo} object for the current default network
    531      *        for the given uid or {@code null} if no default network is
    532      *        available for the specified uid.
    533      *
    534      * <p>This method requires the caller to hold the permission
    535      * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}
    536      * {@hide}
    537      */
    538     public NetworkInfo getActiveNetworkInfoForUid(int uid) {
    539         try {
    540             return mService.getActiveNetworkInfoForUid(uid);
    541         } catch (RemoteException e) {
    542             return null;
    543         }
    544     }
    545 
    546     /**
    547      * Returns connection status information about a particular
    548      * network type.
    549      *
    550      * @param networkType integer specifying which networkType in
    551      *        which you're interested.
    552      * @return a {@link NetworkInfo} object for the requested
    553      *        network type or {@code null} if the type is not
    554      *        supported by the device.
    555      *
    556      * <p>This method requires the call to hold the permission
    557      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    558      */
    559     public NetworkInfo getNetworkInfo(int networkType) {
    560         try {
    561             return mService.getNetworkInfo(networkType);
    562         } catch (RemoteException e) {
    563             return null;
    564         }
    565     }
    566 
    567     /**
    568      * Returns connection status information about all network
    569      * types supported by the device.
    570      *
    571      * @return an array of {@link NetworkInfo} objects.  Check each
    572      * {@link NetworkInfo#getType} for which type each applies.
    573      *
    574      * <p>This method requires the call to hold the permission
    575      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    576      */
    577     public NetworkInfo[] getAllNetworkInfo() {
    578         try {
    579             return mService.getAllNetworkInfo();
    580         } catch (RemoteException e) {
    581             return null;
    582         }
    583     }
    584 
    585     /**
    586      * Returns the IP information for the current default network.
    587      *
    588      * @return a {@link LinkProperties} object describing the IP info
    589      *        for the current default network, or {@code null} if there
    590      *        is no current default network.
    591      *
    592      * <p>This method requires the call to hold the permission
    593      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    594      * {@hide}
    595      */
    596     public LinkProperties getActiveLinkProperties() {
    597         try {
    598             return mService.getActiveLinkProperties();
    599         } catch (RemoteException e) {
    600             return null;
    601         }
    602     }
    603 
    604     /**
    605      * Returns the IP information for a given network type.
    606      *
    607      * @param networkType the network type of interest.
    608      * @return a {@link LinkProperties} object describing the IP info
    609      *        for the given networkType, or {@code null} if there is
    610      *        no current default network.
    611      *
    612      * <p>This method requires the call to hold the permission
    613      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    614      * {@hide}
    615      */
    616     public LinkProperties getLinkProperties(int networkType) {
    617         try {
    618             return mService.getLinkProperties(networkType);
    619         } catch (RemoteException e) {
    620             return null;
    621         }
    622     }
    623 
    624     /**
    625      * Tells each network type to set its radio power state as directed.
    626      *
    627      * @param turnOn a boolean, {@code true} to turn the radios on,
    628      *        {@code false} to turn them off.
    629      * @return a boolean, {@code true} indicating success.  All network types
    630      *        will be tried, even if some fail.
    631      *
    632      * <p>This method requires the call to hold the permission
    633      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    634      * {@hide}
    635      */
    636     public boolean setRadios(boolean turnOn) {
    637         try {
    638             return mService.setRadios(turnOn);
    639         } catch (RemoteException e) {
    640             return false;
    641         }
    642     }
    643 
    644     /**
    645      * Tells a given networkType to set its radio power state as directed.
    646      *
    647      * @param networkType the int networkType of interest.
    648      * @param turnOn a boolean, {@code true} to turn the radio on,
    649      *        {@code} false to turn it off.
    650      * @return a boolean, {@code true} indicating success.
    651      *
    652      * <p>This method requires the call to hold the permission
    653      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    654      * {@hide}
    655      */
    656     public boolean setRadio(int networkType, boolean turnOn) {
    657         try {
    658             return mService.setRadio(networkType, turnOn);
    659         } catch (RemoteException e) {
    660             return false;
    661         }
    662     }
    663 
    664     /**
    665      * Tells the underlying networking system that the caller wants to
    666      * begin using the named feature. The interpretation of {@code feature}
    667      * is completely up to each networking implementation.
    668      * <p>This method requires the caller to hold the permission
    669      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    670      * @param networkType specifies which network the request pertains to
    671      * @param feature the name of the feature to be used
    672      * @return an integer value representing the outcome of the request.
    673      * The interpretation of this value is specific to each networking
    674      * implementation+feature combination, except that the value {@code -1}
    675      * always indicates failure.
    676      */
    677     public int startUsingNetworkFeature(int networkType, String feature) {
    678         try {
    679             return mService.startUsingNetworkFeature(networkType, feature,
    680                     new Binder());
    681         } catch (RemoteException e) {
    682             return -1;
    683         }
    684     }
    685 
    686     /**
    687      * Tells the underlying networking system that the caller is finished
    688      * using the named feature. The interpretation of {@code feature}
    689      * is completely up to each networking implementation.
    690      * <p>This method requires the caller to hold the permission
    691      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    692      * @param networkType specifies which network the request pertains to
    693      * @param feature the name of the feature that is no longer needed
    694      * @return an integer value representing the outcome of the request.
    695      * The interpretation of this value is specific to each networking
    696      * implementation+feature combination, except that the value {@code -1}
    697      * always indicates failure.
    698      */
    699     public int stopUsingNetworkFeature(int networkType, String feature) {
    700         try {
    701             return mService.stopUsingNetworkFeature(networkType, feature);
    702         } catch (RemoteException e) {
    703             return -1;
    704         }
    705     }
    706 
    707     /**
    708      * Ensure that a network route exists to deliver traffic to the specified
    709      * host via the specified network interface. An attempt to add a route that
    710      * already exists is ignored, but treated as successful.
    711      * <p>This method requires the caller to hold the permission
    712      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    713      * @param networkType the type of the network over which traffic to the specified
    714      * host is to be routed
    715      * @param hostAddress the IP address of the host to which the route is desired
    716      * @return {@code true} on success, {@code false} on failure
    717      */
    718     public boolean requestRouteToHost(int networkType, int hostAddress) {
    719         InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress);
    720 
    721         if (inetAddress == null) {
    722             return false;
    723         }
    724 
    725         return requestRouteToHostAddress(networkType, inetAddress);
    726     }
    727 
    728     /**
    729      * Ensure that a network route exists to deliver traffic to the specified
    730      * host via the specified network interface. An attempt to add a route that
    731      * already exists is ignored, but treated as successful.
    732      * @param networkType the type of the network over which traffic to the specified
    733      * host is to be routed
    734      * @param hostAddress the IP address of the host to which the route is desired
    735      * @return {@code true} on success, {@code false} on failure
    736      * @hide
    737      */
    738     public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
    739         byte[] address = hostAddress.getAddress();
    740         try {
    741             return mService.requestRouteToHostAddress(networkType, address);
    742         } catch (RemoteException e) {
    743             return false;
    744         }
    745     }
    746 
    747     /**
    748      * Returns the value of the setting for background data usage. If false,
    749      * applications should not use the network if the application is not in the
    750      * foreground. Developers should respect this setting, and check the value
    751      * of this before performing any background data operations.
    752      * <p>
    753      * All applications that have background services that use the network
    754      * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
    755      * <p>
    756      * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
    757      * background data depends on several combined factors, and this method will
    758      * always return {@code true}. Instead, when background data is unavailable,
    759      * {@link #getActiveNetworkInfo()} will now appear disconnected.
    760      *
    761      * @return Whether background data usage is allowed.
    762      */
    763     @Deprecated
    764     public boolean getBackgroundDataSetting() {
    765         // assume that background data is allowed; final authority is
    766         // NetworkInfo which may be blocked.
    767         return true;
    768     }
    769 
    770     /**
    771      * Sets the value of the setting for background data usage.
    772      *
    773      * @param allowBackgroundData Whether an application should use data while
    774      *            it is in the background.
    775      *
    776      * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
    777      * @see #getBackgroundDataSetting()
    778      * @hide
    779      */
    780     @Deprecated
    781     public void setBackgroundDataSetting(boolean allowBackgroundData) {
    782         // ignored
    783     }
    784 
    785     /**
    786      * Return quota status for the current active network, or {@code null} if no
    787      * network is active. Quota status can change rapidly, so these values
    788      * shouldn't be cached.
    789      *
    790      * <p>This method requires the call to hold the permission
    791      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    792      *
    793      * @hide
    794      */
    795     public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
    796         try {
    797             return mService.getActiveNetworkQuotaInfo();
    798         } catch (RemoteException e) {
    799             return null;
    800         }
    801     }
    802 
    803     /**
    804      * Gets the value of the setting for enabling Mobile data.
    805      *
    806      * @return Whether mobile data is enabled.
    807      *
    808      * <p>This method requires the call to hold the permission
    809      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    810      * @hide
    811      */
    812     public boolean getMobileDataEnabled() {
    813         try {
    814             return mService.getMobileDataEnabled();
    815         } catch (RemoteException e) {
    816             return true;
    817         }
    818     }
    819 
    820     /**
    821      * Sets the persisted value for enabling/disabling Mobile data.
    822      *
    823      * @param enabled Whether the user wants the mobile data connection used
    824      *            or not.
    825      * @hide
    826      */
    827     public void setMobileDataEnabled(boolean enabled) {
    828         try {
    829             mService.setMobileDataEnabled(enabled);
    830         } catch (RemoteException e) {
    831         }
    832     }
    833 
    834     /**
    835      * {@hide}
    836      */
    837     public ConnectivityManager(IConnectivityManager service) {
    838         mService = checkNotNull(service, "missing IConnectivityManager");
    839     }
    840 
    841     /** {@hide} */
    842     public static ConnectivityManager from(Context context) {
    843         return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    844     }
    845 
    846     /**
    847      * Get the set of tetherable, available interfaces.  This list is limited by
    848      * device configuration and current interface existence.
    849      *
    850      * @return an array of 0 or more Strings of tetherable interface names.
    851      *
    852      * <p>This method requires the call to hold the permission
    853      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    854      * {@hide}
    855      */
    856     public String[] getTetherableIfaces() {
    857         try {
    858             return mService.getTetherableIfaces();
    859         } catch (RemoteException e) {
    860             return new String[0];
    861         }
    862     }
    863 
    864     /**
    865      * Get the set of tethered interfaces.
    866      *
    867      * @return an array of 0 or more String of currently tethered interface names.
    868      *
    869      * <p>This method requires the call to hold the permission
    870      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    871      * {@hide}
    872      */
    873     public String[] getTetheredIfaces() {
    874         try {
    875             return mService.getTetheredIfaces();
    876         } catch (RemoteException e) {
    877             return new String[0];
    878         }
    879     }
    880 
    881     /**
    882      * Get the set of interface names which attempted to tether but
    883      * failed.  Re-attempting to tether may cause them to reset to the Tethered
    884      * state.  Alternatively, causing the interface to be destroyed and recreated
    885      * may cause them to reset to the available state.
    886      * {@link ConnectivityManager#getLastTetherError} can be used to get more
    887      * information on the cause of the errors.
    888      *
    889      * @return an array of 0 or more String indicating the interface names
    890      *        which failed to tether.
    891      *
    892      * <p>This method requires the call to hold the permission
    893      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    894      * {@hide}
    895      */
    896     public String[] getTetheringErroredIfaces() {
    897         try {
    898             return mService.getTetheringErroredIfaces();
    899         } catch (RemoteException e) {
    900             return new String[0];
    901         }
    902     }
    903 
    904     /**
    905      * Attempt to tether the named interface.  This will setup a dhcp server
    906      * on the interface, forward and NAT IP packets and forward DNS requests
    907      * to the best active upstream network interface.  Note that if no upstream
    908      * IP network interface is available, dhcp will still run and traffic will be
    909      * allowed between the tethered devices and this device, though upstream net
    910      * access will of course fail until an upstream network interface becomes
    911      * active.
    912      *
    913      * @param iface the interface name to tether.
    914      * @return error a {@code TETHER_ERROR} value indicating success or failure type
    915      *
    916      * <p>This method requires the call to hold the permission
    917      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    918      * {@hide}
    919      */
    920     public int tether(String iface) {
    921         try {
    922             return mService.tether(iface);
    923         } catch (RemoteException e) {
    924             return TETHER_ERROR_SERVICE_UNAVAIL;
    925         }
    926     }
    927 
    928     /**
    929      * Stop tethering the named interface.
    930      *
    931      * @param iface the interface name to untether.
    932      * @return error a {@code TETHER_ERROR} value indicating success or failure type
    933      *
    934      * <p>This method requires the call to hold the permission
    935      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
    936      * {@hide}
    937      */
    938     public int untether(String iface) {
    939         try {
    940             return mService.untether(iface);
    941         } catch (RemoteException e) {
    942             return TETHER_ERROR_SERVICE_UNAVAIL;
    943         }
    944     }
    945 
    946     /**
    947      * Check if the device allows for tethering.  It may be disabled via
    948      * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or
    949      * due to device configuration.
    950      *
    951      * @return a boolean - {@code true} indicating Tethering is supported.
    952      *
    953      * <p>This method requires the call to hold the permission
    954      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    955      * {@hide}
    956      */
    957     public boolean isTetheringSupported() {
    958         try {
    959             return mService.isTetheringSupported();
    960         } catch (RemoteException e) {
    961             return false;
    962         }
    963     }
    964 
    965     /**
    966      * Get the list of regular expressions that define any tetherable
    967      * USB network interfaces.  If USB tethering is not supported by the
    968      * device, this list should be empty.
    969      *
    970      * @return an array of 0 or more regular expression Strings defining
    971      *        what interfaces are considered tetherable usb interfaces.
    972      *
    973      * <p>This method requires the call to hold the permission
    974      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    975      * {@hide}
    976      */
    977     public String[] getTetherableUsbRegexs() {
    978         try {
    979             return mService.getTetherableUsbRegexs();
    980         } catch (RemoteException e) {
    981             return new String[0];
    982         }
    983     }
    984 
    985     /**
    986      * Get the list of regular expressions that define any tetherable
    987      * Wifi network interfaces.  If Wifi tethering is not supported by the
    988      * device, this list should be empty.
    989      *
    990      * @return an array of 0 or more regular expression Strings defining
    991      *        what interfaces are considered tetherable wifi interfaces.
    992      *
    993      * <p>This method requires the call to hold the permission
    994      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
    995      * {@hide}
    996      */
    997     public String[] getTetherableWifiRegexs() {
    998         try {
    999             return mService.getTetherableWifiRegexs();
   1000         } catch (RemoteException e) {
   1001             return new String[0];
   1002         }
   1003     }
   1004 
   1005     /**
   1006      * Get the list of regular expressions that define any tetherable
   1007      * Bluetooth network interfaces.  If Bluetooth tethering is not supported by the
   1008      * device, this list should be empty.
   1009      *
   1010      * @return an array of 0 or more regular expression Strings defining
   1011      *        what interfaces are considered tetherable bluetooth interfaces.
   1012      *
   1013      * <p>This method requires the call to hold the permission
   1014      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1015      * {@hide}
   1016      */
   1017     public String[] getTetherableBluetoothRegexs() {
   1018         try {
   1019             return mService.getTetherableBluetoothRegexs();
   1020         } catch (RemoteException e) {
   1021             return new String[0];
   1022         }
   1023     }
   1024 
   1025     /**
   1026      * Attempt to both alter the mode of USB and Tethering of USB.  A
   1027      * utility method to deal with some of the complexity of USB - will
   1028      * attempt to switch to Rndis and subsequently tether the resulting
   1029      * interface on {@code true} or turn off tethering and switch off
   1030      * Rndis on {@code false}.
   1031      *
   1032      * @param enable a boolean - {@code true} to enable tethering
   1033      * @return error a {@code TETHER_ERROR} value indicating success or failure type
   1034      *
   1035      * <p>This method requires the call to hold the permission
   1036      * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
   1037      * {@hide}
   1038      */
   1039     public int setUsbTethering(boolean enable) {
   1040         try {
   1041             return mService.setUsbTethering(enable);
   1042         } catch (RemoteException e) {
   1043             return TETHER_ERROR_SERVICE_UNAVAIL;
   1044         }
   1045     }
   1046 
   1047     /** {@hide} */
   1048     public static final int TETHER_ERROR_NO_ERROR           = 0;
   1049     /** {@hide} */
   1050     public static final int TETHER_ERROR_UNKNOWN_IFACE      = 1;
   1051     /** {@hide} */
   1052     public static final int TETHER_ERROR_SERVICE_UNAVAIL    = 2;
   1053     /** {@hide} */
   1054     public static final int TETHER_ERROR_UNSUPPORTED        = 3;
   1055     /** {@hide} */
   1056     public static final int TETHER_ERROR_UNAVAIL_IFACE      = 4;
   1057     /** {@hide} */
   1058     public static final int TETHER_ERROR_MASTER_ERROR       = 5;
   1059     /** {@hide} */
   1060     public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
   1061     /** {@hide} */
   1062     public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
   1063     /** {@hide} */
   1064     public static final int TETHER_ERROR_ENABLE_NAT_ERROR     = 8;
   1065     /** {@hide} */
   1066     public static final int TETHER_ERROR_DISABLE_NAT_ERROR    = 9;
   1067     /** {@hide} */
   1068     public static final int TETHER_ERROR_IFACE_CFG_ERROR      = 10;
   1069 
   1070     /**
   1071      * Get a more detailed error code after a Tethering or Untethering
   1072      * request asynchronously failed.
   1073      *
   1074      * @param iface The name of the interface of interest
   1075      * @return error The error code of the last error tethering or untethering the named
   1076      *               interface
   1077      *
   1078      * <p>This method requires the call to hold the permission
   1079      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1080      * {@hide}
   1081      */
   1082     public int getLastTetherError(String iface) {
   1083         try {
   1084             return mService.getLastTetherError(iface);
   1085         } catch (RemoteException e) {
   1086             return TETHER_ERROR_SERVICE_UNAVAIL;
   1087         }
   1088     }
   1089 
   1090     /**
   1091      * Try to ensure the device stays awake until we connect with the next network.
   1092      * Actually just holds a wakelock for a number of seconds while we try to connect
   1093      * to any default networks.  This will expire if the timeout passes or if we connect
   1094      * to a default after this is called.  For internal use only.
   1095      *
   1096      * @param forWhom the name of the network going down for logging purposes
   1097      * @return {@code true} on success, {@code false} on failure
   1098      *
   1099      * <p>This method requires the call to hold the permission
   1100      * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
   1101      * {@hide}
   1102      */
   1103     public boolean requestNetworkTransitionWakelock(String forWhom) {
   1104         try {
   1105             mService.requestNetworkTransitionWakelock(forWhom);
   1106             return true;
   1107         } catch (RemoteException e) {
   1108             return false;
   1109         }
   1110     }
   1111 
   1112     /**
   1113      * Report network connectivity status.  This is currently used only
   1114      * to alter status bar UI.
   1115      *
   1116      * @param networkType The type of network you want to report on
   1117      * @param percentage The quality of the connection 0 is bad, 100 is good
   1118      *
   1119      * <p>This method requires the call to hold the permission
   1120      * {@link android.Manifest.permission#STATUS_BAR}.
   1121      * {@hide}
   1122      */
   1123     public void reportInetCondition(int networkType, int percentage) {
   1124         try {
   1125             mService.reportInetCondition(networkType, percentage);
   1126         } catch (RemoteException e) {
   1127         }
   1128     }
   1129 
   1130     /**
   1131      * Set a network-independent global http proxy.  This is not normally what you want
   1132      * for typical HTTP proxies - they are general network dependent.  However if you're
   1133      * doing something unusual like general internal filtering this may be useful.  On
   1134      * a private network where the proxy is not accessible, you may break HTTP using this.
   1135      *
   1136      * @param proxyProperties The a {@link ProxyProperites} object defining the new global
   1137      *        HTTP proxy.  A {@code null} value will clear the global HTTP proxy.
   1138      *
   1139      * <p>This method requires the call to hold the permission
   1140      * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
   1141      * {@hide}
   1142      */
   1143     public void setGlobalProxy(ProxyProperties p) {
   1144         try {
   1145             mService.setGlobalProxy(p);
   1146         } catch (RemoteException e) {
   1147         }
   1148     }
   1149 
   1150     /**
   1151      * Retrieve any network-independent global HTTP proxy.
   1152      *
   1153      * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null}
   1154      *        if no global HTTP proxy is set.
   1155      *
   1156      * <p>This method requires the call to hold the permission
   1157      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1158      * {@hide}
   1159      */
   1160     public ProxyProperties getGlobalProxy() {
   1161         try {
   1162             return mService.getGlobalProxy();
   1163         } catch (RemoteException e) {
   1164             return null;
   1165         }
   1166     }
   1167 
   1168     /**
   1169      * Get the HTTP proxy settings for the current default network.  Note that
   1170      * if a global proxy is set, it will override any per-network setting.
   1171      *
   1172      * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no
   1173      *        HTTP proxy is active.
   1174      *
   1175      * <p>This method requires the call to hold the permission
   1176      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1177      * {@hide}
   1178      */
   1179     public ProxyProperties getProxy() {
   1180         try {
   1181             return mService.getProxy();
   1182         } catch (RemoteException e) {
   1183             return null;
   1184         }
   1185     }
   1186 
   1187     /**
   1188      * Sets a secondary requirement bit for the given networkType.
   1189      * This requirement bit is generally under the control of the carrier
   1190      * or its agents and is not directly controlled by the user.
   1191      *
   1192      * @param networkType The network who's dependence has changed
   1193      * @param met Boolean - true if network use is OK, false if not
   1194      *
   1195      * <p>This method requires the call to hold the permission
   1196      * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
   1197      * {@hide}
   1198      */
   1199     public void setDataDependency(int networkType, boolean met) {
   1200         try {
   1201             mService.setDataDependency(networkType, met);
   1202         } catch (RemoteException e) {
   1203         }
   1204     }
   1205 
   1206     /**
   1207      * Returns true if the hardware supports the given network type
   1208      * else it returns false.  This doesn't indicate we have coverage
   1209      * or are authorized onto a network, just whether or not the
   1210      * hardware supports it.  For example a GSM phone without a SIM
   1211      * should still return {@code true} for mobile data, but a wifi only
   1212      * tablet would return {@code false}.
   1213      *
   1214      * @param networkType The network type we'd like to check
   1215      * @return {@code true} if supported, else {@code false}
   1216      *
   1217      * <p>This method requires the call to hold the permission
   1218      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1219      * @hide
   1220      */
   1221     public boolean isNetworkSupported(int networkType) {
   1222         try {
   1223             return mService.isNetworkSupported(networkType);
   1224         } catch (RemoteException e) {}
   1225         return false;
   1226     }
   1227 
   1228     /**
   1229      * Returns if the currently active data network is metered. A network is
   1230      * classified as metered when the user is sensitive to heavy data usage on
   1231      * that connection due to monetary costs, data limitations or
   1232      * battery/performance issues. You should check this before doing large
   1233      * data transfers, and warn the user or delay the operation until another
   1234      * network is available.
   1235      *
   1236      * @return {@code true} if large transfers should be avoided, otherwise
   1237      *        {@code false}.
   1238      *
   1239      * <p>This method requires the call to hold the permission
   1240      * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
   1241      */
   1242     public boolean isActiveNetworkMetered() {
   1243         try {
   1244             return mService.isActiveNetworkMetered();
   1245         } catch (RemoteException e) {
   1246             return false;
   1247         }
   1248     }
   1249 
   1250     /**
   1251      * If the LockdownVpn mechanism is enabled, updates the vpn
   1252      * with a reload of its profile.
   1253      *
   1254      * @return a boolean with {@code} indicating success
   1255      *
   1256      * <p>This method can only be called by the system UID
   1257      * {@hide}
   1258      */
   1259     public boolean updateLockdownVpn() {
   1260         try {
   1261             return mService.updateLockdownVpn();
   1262         } catch (RemoteException e) {
   1263             return false;
   1264         }
   1265     }
   1266 
   1267     /**
   1268      * Signal that the captive portal check on the indicated network
   1269      * is complete and we can turn the network on for general use.
   1270      *
   1271      * @param info the {@link NetworkInfo} object for the networkType
   1272      *        in question.
   1273      *
   1274      * <p>This method requires the call to hold the permission
   1275      * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
   1276      * {@hide}
   1277      */
   1278     public void captivePortalCheckComplete(NetworkInfo info) {
   1279         try {
   1280             mService.captivePortalCheckComplete(info);
   1281         } catch (RemoteException e) {
   1282         }
   1283     }
   1284 
   1285     /**
   1286      * Supply the backend messenger for a network tracker
   1287      *
   1288      * @param type NetworkType to set
   1289      * @param messenger {@link Messenger}
   1290      * {@hide}
   1291      */
   1292     public void supplyMessenger(int networkType, Messenger messenger) {
   1293         try {
   1294             mService.supplyMessenger(networkType, messenger);
   1295         } catch (RemoteException e) {
   1296         }
   1297     }
   1298 
   1299     /**
   1300      * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
   1301      */
   1302 
   1303     /**
   1304      * No connection was possible to the network.
   1305      * {@hide}
   1306      */
   1307     public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
   1308 
   1309     /**
   1310      * A connection was made to the internet, all is well.
   1311      * {@hide}
   1312      */
   1313     public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
   1314 
   1315     /**
   1316      * A connection was made but there was a redirection, we appear to be in walled garden.
   1317      * This is an indication of a warm sim on a mobile network.
   1318      * {@hide}
   1319      */
   1320     public static final int CMP_RESULT_CODE_REDIRECTED = 2;
   1321 
   1322     /**
   1323      * A connection was made but no dns server was available to resolve a name to address.
   1324      * This is an indication of a warm sim on a mobile network.
   1325      *
   1326      * {@hide}
   1327      */
   1328     public static final int CMP_RESULT_CODE_NO_DNS = 3;
   1329 
   1330     /**
   1331      * A connection was made but could not open a TCP connection.
   1332      * This is an indication of a warm sim on a mobile network.
   1333      * {@hide}
   1334      */
   1335     public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
   1336 
   1337     /**
   1338      * Check mobile provisioning. The resultCode passed to
   1339      * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above.
   1340      * This may take a minute or more to complete.
   1341      *
   1342      * @param sendNotificaiton, when true a notification will be sent to user.
   1343      * @param suggestedTimeOutMs, timeout in milliseconds
   1344      * @param resultReceiver needs to  be supplied to receive the result
   1345      *
   1346      * @return time out that will be used, maybe less that suggestedTimeOutMs
   1347      * -1 if an error.
   1348      *
   1349      * {@hide}
   1350      */
   1351     public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs,
   1352             ResultReceiver resultReceiver) {
   1353         int timeOutMs = -1;
   1354         try {
   1355             timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs,
   1356                     resultReceiver);
   1357         } catch (RemoteException e) {
   1358         }
   1359         return timeOutMs;
   1360     }
   1361 
   1362     /**
   1363      * Get the carrier provisioning url.
   1364      * {@hide}
   1365      */
   1366     public String getMobileProvisioningUrl() {
   1367         try {
   1368             return mService.getMobileProvisioningUrl();
   1369         } catch (RemoteException e) {
   1370         }
   1371         return null;
   1372     }
   1373 }
   1374