OSDN Git Service

Add gservices updater for carrier provisioning url
[android-x86/frameworks-base.git] / core / java / android / net / ConnectivityManager.java
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 }