ConnectivityManager.java revision 6a2d32597a3f158f4ff5b07ad61c7d892d08f3bf
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
17package android.net;
18
19import static com.android.internal.util.Preconditions.checkNotNull;
20
21import android.annotation.SdkConstant;
22import android.annotation.SdkConstant.SdkConstantType;
23import android.content.Context;
24import android.os.Binder;
25import android.os.Build.VERSION_CODES;
26import android.os.Messenger;
27import android.os.RemoteException;
28import android.os.ResultReceiver;
29import android.provider.Settings;
30
31import 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 */
49public 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    /**
359     * The network to use for initially attaching to the network
360     * {@hide}
361     */
362    public static final int TYPE_MOBILE_IA = 14;
363
364    /** {@hide} */
365    public static final int MAX_RADIO_TYPE   = TYPE_MOBILE_IA;
366
367    /** {@hide} */
368    public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_IA;
369
370    /**
371     * If you want to set the default network preference,you can directly
372     * change the networkAttributes array in framework's config.xml.
373     *
374     * @deprecated Since we support so many more networks now, the single
375     *             network default network preference can't really express
376     *             the hierarchy.  Instead, the default is defined by the
377     *             networkAttributes in config.xml.  You can determine
378     *             the current value by calling {@link #getNetworkPreference()}
379     *             from an App.
380     */
381    @Deprecated
382    public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
383
384    /**
385     * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in
386     * milliseconds.  This was introduced because IPv6 routes seem to take a
387     * moment to settle - trying network activity before the routes are adjusted
388     * can lead to packets using the wrong interface or having the wrong IP address.
389     * This delay is a bit crude, but in the future hopefully we will have kernel
390     * notifications letting us know when it's safe to use the new network.
391     *
392     * @hide
393     */
394    public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000;
395
396    private final IConnectivityManager mService;
397
398    /**
399     * Tests if a given integer represents a valid network type.
400     * @param networkType the type to be tested
401     * @return a boolean.  {@code true} if the type is valid, else {@code false}
402     */
403    public static boolean isNetworkTypeValid(int networkType) {
404        return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
405    }
406
407    /**
408     * Returns a non-localized string representing a given network type.
409     * ONLY used for debugging output.
410     * @param type the type needing naming
411     * @return a String for the given type, or a string version of the type ("87")
412     * if no name is known.
413     * {@hide}
414     */
415    public static String getNetworkTypeName(int type) {
416        switch (type) {
417            case TYPE_MOBILE:
418                return "MOBILE";
419            case TYPE_WIFI:
420                return "WIFI";
421            case TYPE_MOBILE_MMS:
422                return "MOBILE_MMS";
423            case TYPE_MOBILE_SUPL:
424                return "MOBILE_SUPL";
425            case TYPE_MOBILE_DUN:
426                return "MOBILE_DUN";
427            case TYPE_MOBILE_HIPRI:
428                return "MOBILE_HIPRI";
429            case TYPE_WIMAX:
430                return "WIMAX";
431            case TYPE_BLUETOOTH:
432                return "BLUETOOTH";
433            case TYPE_DUMMY:
434                return "DUMMY";
435            case TYPE_ETHERNET:
436                return "ETHERNET";
437            case TYPE_MOBILE_FOTA:
438                return "MOBILE_FOTA";
439            case TYPE_MOBILE_IMS:
440                return "MOBILE_IMS";
441            case TYPE_MOBILE_CBS:
442                return "MOBILE_CBS";
443            case TYPE_WIFI_P2P:
444                return "WIFI_P2P";
445            case TYPE_MOBILE_IA:
446                return "MOBILE_IA";
447            default:
448                return Integer.toString(type);
449        }
450    }
451
452    /**
453     * Checks if a given type uses the cellular data connection.
454     * This should be replaced in the future by a network property.
455     * @param networkType the type to check
456     * @return a boolean - {@code true} if uses cellular network, else {@code false}
457     * {@hide}
458     */
459    public static boolean isNetworkTypeMobile(int networkType) {
460        switch (networkType) {
461            case TYPE_MOBILE:
462            case TYPE_MOBILE_MMS:
463            case TYPE_MOBILE_SUPL:
464            case TYPE_MOBILE_DUN:
465            case TYPE_MOBILE_HIPRI:
466            case TYPE_MOBILE_FOTA:
467            case TYPE_MOBILE_IMS:
468            case TYPE_MOBILE_CBS:
469            case TYPE_MOBILE_IA:
470                return true;
471            default:
472                return false;
473        }
474    }
475
476    /**
477     * Checks if the given network type is backed by a Wi-Fi radio.
478     *
479     * @hide
480     */
481    public static boolean isNetworkTypeWifi(int networkType) {
482        switch (networkType) {
483            case TYPE_WIFI:
484            case TYPE_WIFI_P2P:
485                return true;
486            default:
487                return false;
488        }
489    }
490
491    /**
492     * Checks if the given network type should be exempt from VPN routing rules
493     *
494     * @hide
495     */
496    public static boolean isNetworkTypeExempt(int networkType) {
497        switch (networkType) {
498            case TYPE_MOBILE_MMS:
499            case TYPE_MOBILE_SUPL:
500            case TYPE_MOBILE_HIPRI:
501            case TYPE_MOBILE_IA:
502                return true;
503            default:
504                return false;
505        }
506    }
507
508    /**
509     * Specifies the preferred network type.  When the device has more
510     * than one type available the preferred network type will be used.
511     * Note that this made sense when we only had 2 network types,
512     * but with more and more default networks we need an array to list
513     * their ordering.  This will be deprecated soon.
514     *
515     * @param preference the network type to prefer over all others.  It is
516     *         unspecified what happens to the old preferred network in the
517     *         overall ordering.
518     */
519    public void setNetworkPreference(int preference) {
520        try {
521            mService.setNetworkPreference(preference);
522        } catch (RemoteException e) {
523        }
524    }
525
526    /**
527     * Retrieves the current preferred network type.
528     * Note that this made sense when we only had 2 network types,
529     * but with more and more default networks we need an array to list
530     * their ordering.  This will be deprecated soon.
531     *
532     * @return an integer representing the preferred network type
533     *
534     * <p>This method requires the caller to hold the permission
535     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
536     */
537    public int getNetworkPreference() {
538        try {
539            return mService.getNetworkPreference();
540        } catch (RemoteException e) {
541            return -1;
542        }
543    }
544
545    /**
546     * Returns details about the currently active default data network. When
547     * connected, this network is the default route for outgoing connections.
548     * You should always check {@link NetworkInfo#isConnected()} before initiating
549     * network traffic. This may return {@code null} when there is no default
550     * network.
551     *
552     * @return a {@link NetworkInfo} object for the current default network
553     *        or {@code null} if no network default network is currently active
554     *
555     * <p>This method requires the call to hold the permission
556     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
557     */
558    public NetworkInfo getActiveNetworkInfo() {
559        try {
560            return mService.getActiveNetworkInfo();
561        } catch (RemoteException e) {
562            return null;
563        }
564    }
565
566    /**
567     * Returns details about the currently active default data network
568     * for a given uid.  This is for internal use only to avoid spying
569     * other apps.
570     *
571     * @return a {@link NetworkInfo} object for the current default network
572     *        for the given uid or {@code null} if no default network is
573     *        available for the specified uid.
574     *
575     * <p>This method requires the caller to hold the permission
576     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}
577     * {@hide}
578     */
579    public NetworkInfo getActiveNetworkInfoForUid(int uid) {
580        try {
581            return mService.getActiveNetworkInfoForUid(uid);
582        } catch (RemoteException e) {
583            return null;
584        }
585    }
586
587    /**
588     * Returns connection status information about a particular
589     * network type.
590     *
591     * @param networkType integer specifying which networkType in
592     *        which you're interested.
593     * @return a {@link NetworkInfo} object for the requested
594     *        network type or {@code null} if the type is not
595     *        supported by the device.
596     *
597     * <p>This method requires the call to hold the permission
598     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
599     */
600    public NetworkInfo getNetworkInfo(int networkType) {
601        try {
602            return mService.getNetworkInfo(networkType);
603        } catch (RemoteException e) {
604            return null;
605        }
606    }
607
608    /**
609     * Returns connection status information about all network
610     * types supported by the device.
611     *
612     * @return an array of {@link NetworkInfo} objects.  Check each
613     * {@link NetworkInfo#getType} for which type each applies.
614     *
615     * <p>This method requires the call to hold the permission
616     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
617     */
618    public NetworkInfo[] getAllNetworkInfo() {
619        try {
620            return mService.getAllNetworkInfo();
621        } catch (RemoteException e) {
622            return null;
623        }
624    }
625
626    /**
627     * Returns the IP information for the current default network.
628     *
629     * @return a {@link LinkProperties} object describing the IP info
630     *        for the current default network, or {@code null} if there
631     *        is no current default network.
632     *
633     * <p>This method requires the call to hold the permission
634     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
635     * {@hide}
636     */
637    public LinkProperties getActiveLinkProperties() {
638        try {
639            return mService.getActiveLinkProperties();
640        } catch (RemoteException e) {
641            return null;
642        }
643    }
644
645    /**
646     * Returns the IP information for a given network type.
647     *
648     * @param networkType the network type of interest.
649     * @return a {@link LinkProperties} object describing the IP info
650     *        for the given networkType, or {@code null} if there is
651     *        no current default network.
652     *
653     * <p>This method requires the call to hold the permission
654     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
655     * {@hide}
656     */
657    public LinkProperties getLinkProperties(int networkType) {
658        try {
659            return mService.getLinkProperties(networkType);
660        } catch (RemoteException e) {
661            return null;
662        }
663    }
664
665    /**
666     * Tells each network type to set its radio power state as directed.
667     *
668     * @param turnOn a boolean, {@code true} to turn the radios on,
669     *        {@code false} to turn them off.
670     * @return a boolean, {@code true} indicating success.  All network types
671     *        will be tried, even if some fail.
672     *
673     * <p>This method requires the call to hold the permission
674     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
675     * {@hide}
676     */
677    public boolean setRadios(boolean turnOn) {
678        try {
679            return mService.setRadios(turnOn);
680        } catch (RemoteException e) {
681            return false;
682        }
683    }
684
685    /**
686     * Tells a given networkType to set its radio power state as directed.
687     *
688     * @param networkType the int networkType of interest.
689     * @param turnOn a boolean, {@code true} to turn the radio on,
690     *        {@code} false to turn it off.
691     * @return a boolean, {@code true} indicating success.
692     *
693     * <p>This method requires the call to hold the permission
694     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
695     * {@hide}
696     */
697    public boolean setRadio(int networkType, boolean turnOn) {
698        try {
699            return mService.setRadio(networkType, turnOn);
700        } catch (RemoteException e) {
701            return false;
702        }
703    }
704
705    /**
706     * Tells the underlying networking system that the caller wants to
707     * begin using the named feature. The interpretation of {@code feature}
708     * is completely up to each networking implementation.
709     * <p>This method requires the caller to hold the permission
710     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
711     * @param networkType specifies which network the request pertains to
712     * @param feature the name of the feature to be used
713     * @return an integer value representing the outcome of the request.
714     * The interpretation of this value is specific to each networking
715     * implementation+feature combination, except that the value {@code -1}
716     * always indicates failure.
717     */
718    public int startUsingNetworkFeature(int networkType, String feature) {
719        try {
720            return mService.startUsingNetworkFeature(networkType, feature,
721                    new Binder());
722        } catch (RemoteException e) {
723            return -1;
724        }
725    }
726
727    /**
728     * Tells the underlying networking system that the caller is finished
729     * using the named feature. The interpretation of {@code feature}
730     * is completely up to each networking implementation.
731     * <p>This method requires the caller to hold the permission
732     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
733     * @param networkType specifies which network the request pertains to
734     * @param feature the name of the feature that is no longer needed
735     * @return an integer value representing the outcome of the request.
736     * The interpretation of this value is specific to each networking
737     * implementation+feature combination, except that the value {@code -1}
738     * always indicates failure.
739     */
740    public int stopUsingNetworkFeature(int networkType, String feature) {
741        try {
742            return mService.stopUsingNetworkFeature(networkType, feature);
743        } catch (RemoteException e) {
744            return -1;
745        }
746    }
747
748    /**
749     * Ensure that a network route exists to deliver traffic to the specified
750     * host via the specified network interface. An attempt to add a route that
751     * already exists is ignored, but treated as successful.
752     * <p>This method requires the caller to hold the permission
753     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
754     * @param networkType the type of the network over which traffic to the specified
755     * host is to be routed
756     * @param hostAddress the IP address of the host to which the route is desired
757     * @return {@code true} on success, {@code false} on failure
758     */
759    public boolean requestRouteToHost(int networkType, int hostAddress) {
760        InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress);
761
762        if (inetAddress == null) {
763            return false;
764        }
765
766        return requestRouteToHostAddress(networkType, inetAddress);
767    }
768
769    /**
770     * Ensure that a network route exists to deliver traffic to the specified
771     * host via the specified network interface. An attempt to add a route that
772     * already exists is ignored, but treated as successful.
773     * @param networkType the type of the network over which traffic to the specified
774     * host is to be routed
775     * @param hostAddress the IP address of the host to which the route is desired
776     * @return {@code true} on success, {@code false} on failure
777     * @hide
778     */
779    public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
780        byte[] address = hostAddress.getAddress();
781        try {
782            return mService.requestRouteToHostAddress(networkType, address);
783        } catch (RemoteException e) {
784            return false;
785        }
786    }
787
788    /**
789     * Returns the value of the setting for background data usage. If false,
790     * applications should not use the network if the application is not in the
791     * foreground. Developers should respect this setting, and check the value
792     * of this before performing any background data operations.
793     * <p>
794     * All applications that have background services that use the network
795     * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
796     * <p>
797     * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
798     * background data depends on several combined factors, and this method will
799     * always return {@code true}. Instead, when background data is unavailable,
800     * {@link #getActiveNetworkInfo()} will now appear disconnected.
801     *
802     * @return Whether background data usage is allowed.
803     */
804    @Deprecated
805    public boolean getBackgroundDataSetting() {
806        // assume that background data is allowed; final authority is
807        // NetworkInfo which may be blocked.
808        return true;
809    }
810
811    /**
812     * Sets the value of the setting for background data usage.
813     *
814     * @param allowBackgroundData Whether an application should use data while
815     *            it is in the background.
816     *
817     * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
818     * @see #getBackgroundDataSetting()
819     * @hide
820     */
821    @Deprecated
822    public void setBackgroundDataSetting(boolean allowBackgroundData) {
823        // ignored
824    }
825
826    /**
827     * Return quota status for the current active network, or {@code null} if no
828     * network is active. Quota status can change rapidly, so these values
829     * shouldn't be cached.
830     *
831     * <p>This method requires the call to hold the permission
832     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
833     *
834     * @hide
835     */
836    public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
837        try {
838            return mService.getActiveNetworkQuotaInfo();
839        } catch (RemoteException e) {
840            return null;
841        }
842    }
843
844    /**
845     * Gets the value of the setting for enabling Mobile data.
846     *
847     * @return Whether mobile data is enabled.
848     *
849     * <p>This method requires the call to hold the permission
850     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
851     * @hide
852     */
853    public boolean getMobileDataEnabled() {
854        try {
855            return mService.getMobileDataEnabled();
856        } catch (RemoteException e) {
857            return true;
858        }
859    }
860
861    /**
862     * Sets the persisted value for enabling/disabling Mobile data.
863     *
864     * @param enabled Whether the user wants the mobile data connection used
865     *            or not.
866     * @hide
867     */
868    public void setMobileDataEnabled(boolean enabled) {
869        try {
870            mService.setMobileDataEnabled(enabled);
871        } catch (RemoteException e) {
872        }
873    }
874
875    /**
876     * {@hide}
877     */
878    public ConnectivityManager(IConnectivityManager service) {
879        mService = checkNotNull(service, "missing IConnectivityManager");
880    }
881
882    /** {@hide} */
883    public static ConnectivityManager from(Context context) {
884        return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
885    }
886
887    /**
888     * Get the set of tetherable, available interfaces.  This list is limited by
889     * device configuration and current interface existence.
890     *
891     * @return an array of 0 or more Strings of tetherable interface names.
892     *
893     * <p>This method requires the call to hold the permission
894     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
895     * {@hide}
896     */
897    public String[] getTetherableIfaces() {
898        try {
899            return mService.getTetherableIfaces();
900        } catch (RemoteException e) {
901            return new String[0];
902        }
903    }
904
905    /**
906     * Get the set of tethered interfaces.
907     *
908     * @return an array of 0 or more String of currently tethered interface names.
909     *
910     * <p>This method requires the call to hold the permission
911     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
912     * {@hide}
913     */
914    public String[] getTetheredIfaces() {
915        try {
916            return mService.getTetheredIfaces();
917        } catch (RemoteException e) {
918            return new String[0];
919        }
920    }
921
922    /**
923     * Get the set of interface names which attempted to tether but
924     * failed.  Re-attempting to tether may cause them to reset to the Tethered
925     * state.  Alternatively, causing the interface to be destroyed and recreated
926     * may cause them to reset to the available state.
927     * {@link ConnectivityManager#getLastTetherError} can be used to get more
928     * information on the cause of the errors.
929     *
930     * @return an array of 0 or more String indicating the interface names
931     *        which failed to tether.
932     *
933     * <p>This method requires the call to hold the permission
934     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
935     * {@hide}
936     */
937    public String[] getTetheringErroredIfaces() {
938        try {
939            return mService.getTetheringErroredIfaces();
940        } catch (RemoteException e) {
941            return new String[0];
942        }
943    }
944
945    /**
946     * Attempt to tether the named interface.  This will setup a dhcp server
947     * on the interface, forward and NAT IP packets and forward DNS requests
948     * to the best active upstream network interface.  Note that if no upstream
949     * IP network interface is available, dhcp will still run and traffic will be
950     * allowed between the tethered devices and this device, though upstream net
951     * access will of course fail until an upstream network interface becomes
952     * active.
953     *
954     * @param iface the interface name to tether.
955     * @return error a {@code TETHER_ERROR} value indicating success or failure type
956     *
957     * <p>This method requires the call to hold the permission
958     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
959     * {@hide}
960     */
961    public int tether(String iface) {
962        try {
963            return mService.tether(iface);
964        } catch (RemoteException e) {
965            return TETHER_ERROR_SERVICE_UNAVAIL;
966        }
967    }
968
969    /**
970     * Stop tethering the named interface.
971     *
972     * @param iface the interface name to untether.
973     * @return error a {@code TETHER_ERROR} value indicating success or failure type
974     *
975     * <p>This method requires the call to hold the permission
976     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
977     * {@hide}
978     */
979    public int untether(String iface) {
980        try {
981            return mService.untether(iface);
982        } catch (RemoteException e) {
983            return TETHER_ERROR_SERVICE_UNAVAIL;
984        }
985    }
986
987    /**
988     * Check if the device allows for tethering.  It may be disabled via
989     * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or
990     * due to device configuration.
991     *
992     * @return a boolean - {@code true} indicating Tethering is supported.
993     *
994     * <p>This method requires the call to hold the permission
995     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
996     * {@hide}
997     */
998    public boolean isTetheringSupported() {
999        try {
1000            return mService.isTetheringSupported();
1001        } catch (RemoteException e) {
1002            return false;
1003        }
1004    }
1005
1006    /**
1007     * Get the list of regular expressions that define any tetherable
1008     * USB network interfaces.  If USB tethering is not supported by the
1009     * device, this list should be empty.
1010     *
1011     * @return an array of 0 or more regular expression Strings defining
1012     *        what interfaces are considered tetherable usb interfaces.
1013     *
1014     * <p>This method requires the call to hold the permission
1015     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1016     * {@hide}
1017     */
1018    public String[] getTetherableUsbRegexs() {
1019        try {
1020            return mService.getTetherableUsbRegexs();
1021        } catch (RemoteException e) {
1022            return new String[0];
1023        }
1024    }
1025
1026    /**
1027     * Get the list of regular expressions that define any tetherable
1028     * Wifi network interfaces.  If Wifi tethering is not supported by the
1029     * device, this list should be empty.
1030     *
1031     * @return an array of 0 or more regular expression Strings defining
1032     *        what interfaces are considered tetherable wifi interfaces.
1033     *
1034     * <p>This method requires the call to hold the permission
1035     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1036     * {@hide}
1037     */
1038    public String[] getTetherableWifiRegexs() {
1039        try {
1040            return mService.getTetherableWifiRegexs();
1041        } catch (RemoteException e) {
1042            return new String[0];
1043        }
1044    }
1045
1046    /**
1047     * Get the list of regular expressions that define any tetherable
1048     * Bluetooth network interfaces.  If Bluetooth tethering is not supported by the
1049     * device, this list should be empty.
1050     *
1051     * @return an array of 0 or more regular expression Strings defining
1052     *        what interfaces are considered tetherable bluetooth interfaces.
1053     *
1054     * <p>This method requires the call to hold the permission
1055     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1056     * {@hide}
1057     */
1058    public String[] getTetherableBluetoothRegexs() {
1059        try {
1060            return mService.getTetherableBluetoothRegexs();
1061        } catch (RemoteException e) {
1062            return new String[0];
1063        }
1064    }
1065
1066    /**
1067     * Attempt to both alter the mode of USB and Tethering of USB.  A
1068     * utility method to deal with some of the complexity of USB - will
1069     * attempt to switch to Rndis and subsequently tether the resulting
1070     * interface on {@code true} or turn off tethering and switch off
1071     * Rndis on {@code false}.
1072     *
1073     * @param enable a boolean - {@code true} to enable tethering
1074     * @return error a {@code TETHER_ERROR} value indicating success or failure type
1075     *
1076     * <p>This method requires the call to hold the permission
1077     * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
1078     * {@hide}
1079     */
1080    public int setUsbTethering(boolean enable) {
1081        try {
1082            return mService.setUsbTethering(enable);
1083        } catch (RemoteException e) {
1084            return TETHER_ERROR_SERVICE_UNAVAIL;
1085        }
1086    }
1087
1088    /** {@hide} */
1089    public static final int TETHER_ERROR_NO_ERROR           = 0;
1090    /** {@hide} */
1091    public static final int TETHER_ERROR_UNKNOWN_IFACE      = 1;
1092    /** {@hide} */
1093    public static final int TETHER_ERROR_SERVICE_UNAVAIL    = 2;
1094    /** {@hide} */
1095    public static final int TETHER_ERROR_UNSUPPORTED        = 3;
1096    /** {@hide} */
1097    public static final int TETHER_ERROR_UNAVAIL_IFACE      = 4;
1098    /** {@hide} */
1099    public static final int TETHER_ERROR_MASTER_ERROR       = 5;
1100    /** {@hide} */
1101    public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
1102    /** {@hide} */
1103    public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
1104    /** {@hide} */
1105    public static final int TETHER_ERROR_ENABLE_NAT_ERROR     = 8;
1106    /** {@hide} */
1107    public static final int TETHER_ERROR_DISABLE_NAT_ERROR    = 9;
1108    /** {@hide} */
1109    public static final int TETHER_ERROR_IFACE_CFG_ERROR      = 10;
1110
1111    /**
1112     * Get a more detailed error code after a Tethering or Untethering
1113     * request asynchronously failed.
1114     *
1115     * @param iface The name of the interface of interest
1116     * @return error The error code of the last error tethering or untethering the named
1117     *               interface
1118     *
1119     * <p>This method requires the call to hold the permission
1120     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1121     * {@hide}
1122     */
1123    public int getLastTetherError(String iface) {
1124        try {
1125            return mService.getLastTetherError(iface);
1126        } catch (RemoteException e) {
1127            return TETHER_ERROR_SERVICE_UNAVAIL;
1128        }
1129    }
1130
1131    /**
1132     * Try to ensure the device stays awake until we connect with the next network.
1133     * Actually just holds a wakelock for a number of seconds while we try to connect
1134     * to any default networks.  This will expire if the timeout passes or if we connect
1135     * to a default after this is called.  For internal use only.
1136     *
1137     * @param forWhom the name of the network going down for logging purposes
1138     * @return {@code true} on success, {@code false} on failure
1139     *
1140     * <p>This method requires the call to hold the permission
1141     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1142     * {@hide}
1143     */
1144    public boolean requestNetworkTransitionWakelock(String forWhom) {
1145        try {
1146            mService.requestNetworkTransitionWakelock(forWhom);
1147            return true;
1148        } catch (RemoteException e) {
1149            return false;
1150        }
1151    }
1152
1153    /**
1154     * Report network connectivity status.  This is currently used only
1155     * to alter status bar UI.
1156     *
1157     * @param networkType The type of network you want to report on
1158     * @param percentage The quality of the connection 0 is bad, 100 is good
1159     *
1160     * <p>This method requires the call to hold the permission
1161     * {@link android.Manifest.permission#STATUS_BAR}.
1162     * {@hide}
1163     */
1164    public void reportInetCondition(int networkType, int percentage) {
1165        try {
1166            mService.reportInetCondition(networkType, percentage);
1167        } catch (RemoteException e) {
1168        }
1169    }
1170
1171    /**
1172     * Set a network-independent global http proxy.  This is not normally what you want
1173     * for typical HTTP proxies - they are general network dependent.  However if you're
1174     * doing something unusual like general internal filtering this may be useful.  On
1175     * a private network where the proxy is not accessible, you may break HTTP using this.
1176     *
1177     * @param proxyProperties The a {@link ProxyProperites} object defining the new global
1178     *        HTTP proxy.  A {@code null} value will clear the global HTTP proxy.
1179     *
1180     * <p>This method requires the call to hold the permission
1181     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1182     * {@hide}
1183     */
1184    public void setGlobalProxy(ProxyProperties p) {
1185        try {
1186            mService.setGlobalProxy(p);
1187        } catch (RemoteException e) {
1188        }
1189    }
1190
1191    /**
1192     * Retrieve any network-independent global HTTP proxy.
1193     *
1194     * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null}
1195     *        if no global HTTP proxy is set.
1196     *
1197     * <p>This method requires the call to hold the permission
1198     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1199     * {@hide}
1200     */
1201    public ProxyProperties getGlobalProxy() {
1202        try {
1203            return mService.getGlobalProxy();
1204        } catch (RemoteException e) {
1205            return null;
1206        }
1207    }
1208
1209    /**
1210     * Get the HTTP proxy settings for the current default network.  Note that
1211     * if a global proxy is set, it will override any per-network setting.
1212     *
1213     * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no
1214     *        HTTP proxy is active.
1215     *
1216     * <p>This method requires the call to hold the permission
1217     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1218     * {@hide}
1219     */
1220    public ProxyProperties getProxy() {
1221        try {
1222            return mService.getProxy();
1223        } catch (RemoteException e) {
1224            return null;
1225        }
1226    }
1227
1228    /**
1229     * Sets a secondary requirement bit for the given networkType.
1230     * This requirement bit is generally under the control of the carrier
1231     * or its agents and is not directly controlled by the user.
1232     *
1233     * @param networkType The network who's dependence has changed
1234     * @param met Boolean - true if network use is OK, false if not
1235     *
1236     * <p>This method requires the call to hold the permission
1237     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1238     * {@hide}
1239     */
1240    public void setDataDependency(int networkType, boolean met) {
1241        try {
1242            mService.setDataDependency(networkType, met);
1243        } catch (RemoteException e) {
1244        }
1245    }
1246
1247    /**
1248     * Returns true if the hardware supports the given network type
1249     * else it returns false.  This doesn't indicate we have coverage
1250     * or are authorized onto a network, just whether or not the
1251     * hardware supports it.  For example a GSM phone without a SIM
1252     * should still return {@code true} for mobile data, but a wifi only
1253     * tablet would return {@code false}.
1254     *
1255     * @param networkType The network type we'd like to check
1256     * @return {@code true} if supported, else {@code false}
1257     *
1258     * <p>This method requires the call to hold the permission
1259     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1260     * @hide
1261     */
1262    public boolean isNetworkSupported(int networkType) {
1263        try {
1264            return mService.isNetworkSupported(networkType);
1265        } catch (RemoteException e) {}
1266        return false;
1267    }
1268
1269    /**
1270     * Returns if the currently active data network is metered. A network is
1271     * classified as metered when the user is sensitive to heavy data usage on
1272     * that connection due to monetary costs, data limitations or
1273     * battery/performance issues. You should check this before doing large
1274     * data transfers, and warn the user or delay the operation until another
1275     * network is available.
1276     *
1277     * @return {@code true} if large transfers should be avoided, otherwise
1278     *        {@code false}.
1279     *
1280     * <p>This method requires the call to hold the permission
1281     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1282     */
1283    public boolean isActiveNetworkMetered() {
1284        try {
1285            return mService.isActiveNetworkMetered();
1286        } catch (RemoteException e) {
1287            return false;
1288        }
1289    }
1290
1291    /**
1292     * If the LockdownVpn mechanism is enabled, updates the vpn
1293     * with a reload of its profile.
1294     *
1295     * @return a boolean with {@code} indicating success
1296     *
1297     * <p>This method can only be called by the system UID
1298     * {@hide}
1299     */
1300    public boolean updateLockdownVpn() {
1301        try {
1302            return mService.updateLockdownVpn();
1303        } catch (RemoteException e) {
1304            return false;
1305        }
1306    }
1307
1308    /**
1309     * Signal that the captive portal check on the indicated network
1310     * is complete and we can turn the network on for general use.
1311     *
1312     * @param info the {@link NetworkInfo} object for the networkType
1313     *        in question.
1314     *
1315     * <p>This method requires the call to hold the permission
1316     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1317     * {@hide}
1318     */
1319    public void captivePortalCheckComplete(NetworkInfo info) {
1320        try {
1321            mService.captivePortalCheckComplete(info);
1322        } catch (RemoteException e) {
1323        }
1324    }
1325
1326    /**
1327     * Signal that the captive portal check on the indicated network
1328     * is complete and whether its a captive portal or not.
1329     *
1330     * @param info the {@link NetworkInfo} object for the networkType
1331     *        in question.
1332     * @param isCaptivePortal true/false.
1333     *
1334     * <p>This method requires the call to hold the permission
1335     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1336     * {@hide}
1337     */
1338    public void captivePortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) {
1339        try {
1340            mService.captivePortalCheckCompleted(info, isCaptivePortal);
1341        } catch (RemoteException e) {
1342        }
1343    }
1344
1345    /**
1346     * Supply the backend messenger for a network tracker
1347     *
1348     * @param type NetworkType to set
1349     * @param messenger {@link Messenger}
1350     * {@hide}
1351     */
1352    public void supplyMessenger(int networkType, Messenger messenger) {
1353        try {
1354            mService.supplyMessenger(networkType, messenger);
1355        } catch (RemoteException e) {
1356        }
1357    }
1358
1359    /**
1360     * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
1361     */
1362
1363    /**
1364     * No connection was possible to the network.
1365     * {@hide}
1366     */
1367    public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
1368
1369    /**
1370     * A connection was made to the internet, all is well.
1371     * {@hide}
1372     */
1373    public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
1374
1375    /**
1376     * A connection was made but there was a redirection, we appear to be in walled garden.
1377     * This is an indication of a warm sim on a mobile network.
1378     * {@hide}
1379     */
1380    public static final int CMP_RESULT_CODE_REDIRECTED = 2;
1381
1382    /**
1383     * A connection was made but no dns server was available to resolve a name to address.
1384     * This is an indication of a warm sim on a mobile network.
1385     *
1386     * {@hide}
1387     */
1388    public static final int CMP_RESULT_CODE_NO_DNS = 3;
1389
1390    /**
1391     * A connection was made but could not open a TCP connection.
1392     * This is an indication of a warm sim on a mobile network.
1393     * {@hide}
1394     */
1395    public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
1396
1397    /**
1398     * Check mobile provisioning. The resultCode passed to
1399     * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above.
1400     * This may take a minute or more to complete.
1401     *
1402     * @param sendNotificaiton, when true a notification will be sent to user.
1403     * @param suggestedTimeOutMs, timeout in milliseconds
1404     * @param resultReceiver needs to  be supplied to receive the result
1405     *
1406     * @return time out that will be used, maybe less that suggestedTimeOutMs
1407     * -1 if an error.
1408     *
1409     * {@hide}
1410     */
1411    public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs,
1412            ResultReceiver resultReceiver) {
1413        int timeOutMs = -1;
1414        try {
1415            timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs,
1416                    resultReceiver);
1417        } catch (RemoteException e) {
1418        }
1419        return timeOutMs;
1420    }
1421
1422    /**
1423     * Get the mobile provisioning url.
1424     * {@hide}
1425     */
1426    public String getMobileProvisioningUrl() {
1427        try {
1428            return mService.getMobileProvisioningUrl();
1429        } catch (RemoteException e) {
1430        }
1431        return null;
1432    }
1433
1434    /**
1435     * Get the mobile redirected provisioning url.
1436     * {@hide}
1437     */
1438    public String getMobileRedirectedProvisioningUrl() {
1439        try {
1440            return mService.getMobileRedirectedProvisioningUrl();
1441        } catch (RemoteException e) {
1442        }
1443        return null;
1444    }
1445
1446    /**
1447     * get the information about a specific network link
1448     * @hide
1449     */
1450    public LinkQualityInfo getLinkQualityInfo(int networkType) {
1451        try {
1452            LinkQualityInfo li = mService.getLinkQualityInfo(networkType);
1453            return li;
1454        } catch (RemoteException e) {
1455            return null;
1456        }
1457    }
1458
1459    /**
1460     * get the information of currently active network link
1461     * @hide
1462     */
1463    public LinkQualityInfo getActiveLinkQualityInfo() {
1464        try {
1465            LinkQualityInfo li = mService.getActiveLinkQualityInfo();
1466            return li;
1467        } catch (RemoteException e) {
1468            return null;
1469        }
1470    }
1471
1472    /**
1473     * get the information of all network links
1474     * @hide
1475     */
1476    public LinkQualityInfo[] getAllLinkQualityInfo() {
1477        try {
1478            LinkQualityInfo[] li = mService.getAllLinkQualityInfo();
1479            return li;
1480        } catch (RemoteException e) {
1481            return null;
1482        }
1483    }
1484}
1485