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