blob: 1dbe34e201154a7c1cac8de36dea87e65daf6cc0 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -070019import static com.android.internal.util.Preconditions.checkNotNull;
20
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import android.annotation.SdkConstant;
22import android.annotation.SdkConstant.SdkConstantType;
Jeff Sharkey8fc27e82012-04-04 20:40:58 -070023import android.content.Context;
Robert Greenwalt42acef32009-08-12 16:08:25 -070024import android.os.Binder;
Jeff Sharkey3a844fc2011-08-16 14:37:57 -070025import android.os.Build.VERSION_CODES;
Robert Greenwalt665e1ae2012-08-21 19:27:00 -070026import android.os.Messenger;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027import android.os.RemoteException;
Wink Savilleab9321d2013-06-29 21:10:57 -070028import android.os.ResultReceiver;
Jeff Sharkey961e3042011-08-29 16:02:57 -070029import android.provider.Settings;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
Robert Greenwalt585ac0f2010-08-27 09:24:29 -070031import java.net.InetAddress;
Robert Greenwalt585ac0f2010-08-27 09:24:29 -070032
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033/**
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 */
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -070049public class ConnectivityManager {
50 private static final String TAG = "ConnectivityManager";
51
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052 /**
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
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -080067 * receiver should expect another broadcast soon, indicating either that
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080068 * 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 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -080075 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080076 public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -070077
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078 /**
Jeff Sharkey961e3042011-08-29 16:02:57 -070079 * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any
80 * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}.
81 *
82 * @hide
83 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -080084 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Jeff Sharkey961e3042011-08-29 16:02:57 -070085 public static final String CONNECTIVITY_ACTION_IMMEDIATE =
86 "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE";
87
88 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080089 * The lookup key for a {@link NetworkInfo} object. Retrieve with
90 * {@link android.content.Intent#getParcelableExtra(String)}.
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -070091 *
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()}.
Jeff Sharkey75fbb4b2012-08-06 11:41:50 -070096 * @see #EXTRA_NETWORK_TYPE
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097 */
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -070098 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 public static final String EXTRA_NETWORK_INFO = "networkInfo";
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700100
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800101 /**
Jeff Sharkey75fbb4b2012-08-06 11:41:50 -0700102 * 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 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111 * 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";
Robert Greenwaltd7085fc2010-09-08 15:24:47 -0700144 /**
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
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700148 * {@link android.content.Intent#getIntExtra(String, int)}.
Robert Greenwaltd7085fc2010-09-08 15:24:47 -0700149 * {@hide}
150 */
151 public static final String EXTRA_INET_CONDITION = "inetCondition";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800152
153 /**
Haoyu Baidb3c8672012-06-20 14:29:57 -0700154 * Broadcast action to indicate the change of data activity status
155 * (idle or active) on a network in a recent period.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800156 * The network becomes active when data transmission is started, or
157 * idle if there is no data transmission for a period of time.
Haoyu Baidb3c8672012-06-20 14:29:57 -0700158 * {@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 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800176 * 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
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700181 * {@code false}.
Jeff Sharkey54ee2ad2012-01-30 16:29:24 -0800182 * <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.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 */
193 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Jeff Sharkey54ee2ad2012-01-30 16:29:24 -0800194 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED =
196 "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
197
Robert Greenwalt1e9aac22010-09-15 17:36:33 -0700198 /**
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 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800205 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Robert Greenwalt1e9aac22010-09-15 17:36:33 -0700206 public static final String INET_CONDITION_ACTION =
207 "android.net.conn.INET_CONDITION_ACTION";
208
Robert Greenwalt42acef32009-08-12 16:08:25 -0700209 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800210 * 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).
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800216 * @hide
217 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800218 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800219 public static final String ACTION_TETHER_STATE_CHANGED =
220 "android.net.conn.TETHER_STATE_CHANGED";
221
222 /**
223 * @hide
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800224 * gives a String[] listing all the interfaces configured for
225 * tethering and currently available for tethering.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800226 */
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800227 public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800228
229 /**
230 * @hide
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800231 * gives a String[] listing all the interfaces currently tethered
232 * (ie, has dhcp support and packets potentially forwarded/NATed)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800233 */
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800234 public static final String EXTRA_ACTIVE_TETHER = "activeArray";
235
236 /**
237 * @hide
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800238 * 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.
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800241 */
242 public static final String EXTRA_ERRORED_TETHER = "erroredArray";
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800243
244 /**
Russell Brenner108da0c2013-02-12 10:03:14 -0800245 * 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 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800250 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Russell Brenner108da0c2013-02-12 10:03:14 -0800251 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 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800261 * The absence of a connection type.
Robert Greenwaltccf83af12011-06-02 17:30:47 -0700262 * @hide
263 */
264 public static final int TYPE_NONE = -1;
265
266 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800267 * 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)
Robert Greenwalt42acef32009-08-12 16:08:25 -0700270 */
271 public static final int TYPE_MOBILE = 0;
272 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800273 * 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).
Robert Greenwalt42acef32009-08-12 16:08:25 -0700276 */
277 public static final int TYPE_WIFI = 1;
278 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800279 * 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.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700283 */
284 public static final int TYPE_MOBILE_MMS = 2;
285 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800286 * 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.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700290 */
291 public static final int TYPE_MOBILE_SUPL = 3;
292 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800293 * 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.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700297 */
298 public static final int TYPE_MOBILE_DUN = 4;
299 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800300 * 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.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700305 */
306 public static final int TYPE_MOBILE_HIPRI = 5;
jsh8214deb2010-03-11 15:04:43 -0800307 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800308 * 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).
jsh8214deb2010-03-11 15:04:43 -0800311 */
312 public static final int TYPE_WIMAX = 6;
Robert Greenwaltda3d5e62010-12-06 13:56:24 -0800313
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800314 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800315 * 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).
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800318 */
319 public static final int TYPE_BLUETOOTH = 7;
320
Robert Greenwalt60810842011-04-22 15:28:18 -0700321 /**
322 * Dummy data connection. This should not be used on shipping devices.
323 */
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800324 public static final int TYPE_DUMMY = 8;
Wink Saville9d7d6282011-03-12 14:52:01 -0800325
Robert Greenwalt60810842011-04-22 15:28:18 -0700326 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800327 * 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).
Robert Greenwalt60810842011-04-22 15:28:18 -0700330 */
Robert Greenwalte12aec92011-01-28 14:48:37 -0800331 public static final int TYPE_ETHERNET = 9;
Robert Greenwalt60810842011-04-22 15:28:18 -0700332
Wink Saville9d7d6282011-03-12 14:52:01 -0800333 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800334 * Over the air Administration.
Wink Saville9d7d6282011-03-12 14:52:01 -0800335 * {@hide}
336 */
337 public static final int TYPE_MOBILE_FOTA = 10;
338
339 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800340 * IP Multimedia Subsystem.
Wink Saville9d7d6282011-03-12 14:52:01 -0800341 * {@hide}
342 */
343 public static final int TYPE_MOBILE_IMS = 11;
344
345 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800346 * Carrier Branded Services.
Wink Saville9d7d6282011-03-12 14:52:01 -0800347 * {@hide}
348 */
349 public static final int TYPE_MOBILE_CBS = 12;
350
repo syncaea743a2011-07-29 23:55:49 -0700351 /**
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;
Wink Saville9d7d6282011-03-12 14:52:01 -0800357
Wink Saville5e56bc52013-07-29 15:00:57 -0700358 /**
359 * The network to use for initially attaching to the network
360 * {@hide}
361 */
362 public static final int TYPE_MOBILE_IA = 14;
repo syncaea743a2011-07-29 23:55:49 -0700363
364 /** {@hide} */
Wink Saville5e56bc52013-07-29 15:00:57 -0700365 public static final int MAX_RADIO_TYPE = TYPE_MOBILE_IA;
366
367 /** {@hide} */
368 public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_IA;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800369
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800370 /**
371 * If you want to set the default network preference,you can directly
372 * change the networkAttributes array in framework's config.xml.
373 *
374 * @deprecated Since we support so many more networks now, the single
375 * network default network preference can't really express
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800376 * the hierarchy. Instead, the default is defined by the
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800377 * networkAttributes in config.xml. You can determine
Robert Greenwalt4c8b7482012-12-07 09:56:50 -0800378 * the current value by calling {@link #getNetworkPreference()}
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800379 * from an App.
380 */
381 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800382 public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
383
Jeff Sharkey625239a2012-09-26 22:03:49 -0700384 /**
385 * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800386 * milliseconds. This was introduced because IPv6 routes seem to take a
387 * moment to settle - trying network activity before the routes are adjusted
388 * can lead to packets using the wrong interface or having the wrong IP address.
389 * This delay is a bit crude, but in the future hopefully we will have kernel
390 * notifications letting us know when it's safe to use the new network.
Jeff Sharkey625239a2012-09-26 22:03:49 -0700391 *
392 * @hide
393 */
394 public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000;
395
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700396 private final IConnectivityManager mService;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800397
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800398 /**
399 * Tests if a given integer represents a valid network type.
400 * @param networkType the type to be tested
401 * @return a boolean. {@code true} if the type is valid, else {@code false}
402 */
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700403 public static boolean isNetworkTypeValid(int networkType) {
Robert Greenwalt42acef32009-08-12 16:08:25 -0700404 return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800405 }
406
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800407 /**
408 * Returns a non-localized string representing a given network type.
409 * ONLY used for debugging output.
410 * @param type the type needing naming
411 * @return a String for the given type, or a string version of the type ("87")
412 * if no name is known.
413 * {@hide}
414 */
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700415 public static String getNetworkTypeName(int type) {
416 switch (type) {
417 case TYPE_MOBILE:
418 return "MOBILE";
419 case TYPE_WIFI:
420 return "WIFI";
421 case TYPE_MOBILE_MMS:
422 return "MOBILE_MMS";
423 case TYPE_MOBILE_SUPL:
424 return "MOBILE_SUPL";
425 case TYPE_MOBILE_DUN:
426 return "MOBILE_DUN";
427 case TYPE_MOBILE_HIPRI:
428 return "MOBILE_HIPRI";
429 case TYPE_WIMAX:
430 return "WIMAX";
431 case TYPE_BLUETOOTH:
432 return "BLUETOOTH";
433 case TYPE_DUMMY:
434 return "DUMMY";
435 case TYPE_ETHERNET:
436 return "ETHERNET";
437 case TYPE_MOBILE_FOTA:
438 return "MOBILE_FOTA";
439 case TYPE_MOBILE_IMS:
440 return "MOBILE_IMS";
441 case TYPE_MOBILE_CBS:
442 return "MOBILE_CBS";
repo syncaea743a2011-07-29 23:55:49 -0700443 case TYPE_WIFI_P2P:
444 return "WIFI_P2P";
Wink Saville5e56bc52013-07-29 15:00:57 -0700445 case TYPE_MOBILE_IA:
446 return "MOBILE_IA";
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700447 default:
448 return Integer.toString(type);
449 }
450 }
451
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800452 /**
453 * Checks if a given type uses the cellular data connection.
454 * This should be replaced in the future by a network property.
455 * @param networkType the type to check
456 * @return a boolean - {@code true} if uses cellular network, else {@code false}
457 * {@hide}
458 */
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700459 public static boolean isNetworkTypeMobile(int networkType) {
460 switch (networkType) {
461 case TYPE_MOBILE:
462 case TYPE_MOBILE_MMS:
463 case TYPE_MOBILE_SUPL:
464 case TYPE_MOBILE_DUN:
465 case TYPE_MOBILE_HIPRI:
466 case TYPE_MOBILE_FOTA:
467 case TYPE_MOBILE_IMS:
468 case TYPE_MOBILE_CBS:
Wink Saville5e56bc52013-07-29 15:00:57 -0700469 case TYPE_MOBILE_IA:
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700470 return true;
471 default:
472 return false;
473 }
474 }
475
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800476 /**
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700477 * Checks if the given network type is backed by a Wi-Fi radio.
478 *
479 * @hide
480 */
481 public static boolean isNetworkTypeWifi(int networkType) {
482 switch (networkType) {
483 case TYPE_WIFI:
484 case TYPE_WIFI_P2P:
485 return true;
486 default:
487 return false;
488 }
489 }
490
491 /**
Chad Brubakerf336d722013-07-15 16:34:04 -0700492 * Checks if the given network type should be exempt from VPN routing rules
493 *
494 * @hide
495 */
496 public static boolean isNetworkTypeExempt(int networkType) {
497 switch (networkType) {
498 case TYPE_MOBILE_MMS:
499 case TYPE_MOBILE_SUPL:
500 case TYPE_MOBILE_HIPRI:
Wink Saville5e56bc52013-07-29 15:00:57 -0700501 case TYPE_MOBILE_IA:
Chad Brubakerf336d722013-07-15 16:34:04 -0700502 return true;
503 default:
504 return false;
505 }
506 }
507
508 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800509 * Specifies the preferred network type. When the device has more
510 * than one type available the preferred network type will be used.
511 * Note that this made sense when we only had 2 network types,
512 * but with more and more default networks we need an array to list
513 * their ordering. This will be deprecated soon.
514 *
515 * @param preference the network type to prefer over all others. It is
516 * unspecified what happens to the old preferred network in the
517 * overall ordering.
518 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800519 public void setNetworkPreference(int preference) {
520 try {
521 mService.setNetworkPreference(preference);
522 } catch (RemoteException e) {
523 }
524 }
525
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800526 /**
527 * Retrieves the current preferred network type.
528 * Note that this made sense when we only had 2 network types,
529 * but with more and more default networks we need an array to list
530 * their ordering. This will be deprecated soon.
531 *
532 * @return an integer representing the preferred network type
533 *
534 * <p>This method requires the caller to hold the permission
535 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
536 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800537 public int getNetworkPreference() {
538 try {
539 return mService.getNetworkPreference();
540 } catch (RemoteException e) {
541 return -1;
542 }
543 }
544
Scott Main671644c2011-10-06 19:02:28 -0700545 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800546 * Returns details about the currently active default data network. When
547 * connected, this network is the default route for outgoing connections.
548 * You should always check {@link NetworkInfo#isConnected()} before initiating
549 * network traffic. This may return {@code null} when there is no default
550 * network.
551 *
552 * @return a {@link NetworkInfo} object for the current default network
553 * or {@code null} if no network default network is currently active
554 *
555 * <p>This method requires the call to hold the permission
Nicolas Falliere9530e3a2012-06-18 17:21:06 -0700556 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -0700557 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800558 public NetworkInfo getActiveNetworkInfo() {
559 try {
560 return mService.getActiveNetworkInfo();
561 } catch (RemoteException e) {
562 return null;
563 }
564 }
565
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800566 /**
567 * Returns details about the currently active default data network
568 * for a given uid. This is for internal use only to avoid spying
569 * other apps.
570 *
571 * @return a {@link NetworkInfo} object for the current default network
572 * for the given uid or {@code null} if no default network is
573 * available for the specified uid.
574 *
575 * <p>This method requires the caller to hold the permission
576 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}
577 * {@hide}
578 */
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700579 public NetworkInfo getActiveNetworkInfoForUid(int uid) {
580 try {
581 return mService.getActiveNetworkInfoForUid(uid);
582 } catch (RemoteException e) {
583 return null;
584 }
585 }
586
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800587 /**
588 * Returns connection status information about a particular
589 * network type.
590 *
591 * @param networkType integer specifying which networkType in
592 * which you're interested.
593 * @return a {@link NetworkInfo} object for the requested
594 * network type or {@code null} if the type is not
595 * supported by the device.
596 *
597 * <p>This method requires the call to hold the permission
598 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
599 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800600 public NetworkInfo getNetworkInfo(int networkType) {
601 try {
602 return mService.getNetworkInfo(networkType);
603 } catch (RemoteException e) {
604 return null;
605 }
606 }
607
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800608 /**
609 * Returns connection status information about all network
610 * types supported by the device.
611 *
612 * @return an array of {@link NetworkInfo} objects. Check each
613 * {@link NetworkInfo#getType} for which type each applies.
614 *
615 * <p>This method requires the call to hold the permission
616 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
617 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800618 public NetworkInfo[] getAllNetworkInfo() {
619 try {
620 return mService.getAllNetworkInfo();
621 } catch (RemoteException e) {
622 return null;
623 }
624 }
625
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800626 /**
627 * Returns the IP information for the current default network.
628 *
629 * @return a {@link LinkProperties} object describing the IP info
630 * for the current default network, or {@code null} if there
631 * is no current default network.
632 *
633 * <p>This method requires the call to hold the permission
634 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
635 * {@hide}
636 */
Robert Greenwaltd192dad2010-09-14 09:18:02 -0700637 public LinkProperties getActiveLinkProperties() {
638 try {
639 return mService.getActiveLinkProperties();
640 } catch (RemoteException e) {
641 return null;
642 }
643 }
644
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800645 /**
646 * Returns the IP information for a given network type.
647 *
648 * @param networkType the network type of interest.
649 * @return a {@link LinkProperties} object describing the IP info
650 * for the given networkType, or {@code null} if there is
651 * no current default network.
652 *
653 * <p>This method requires the call to hold the permission
654 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
655 * {@hide}
656 */
Robert Greenwaltd192dad2010-09-14 09:18:02 -0700657 public LinkProperties getLinkProperties(int networkType) {
658 try {
659 return mService.getLinkProperties(networkType);
660 } catch (RemoteException e) {
661 return null;
662 }
663 }
664
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800665 /**
666 * Tells each network type to set its radio power state as directed.
667 *
668 * @param turnOn a boolean, {@code true} to turn the radios on,
669 * {@code false} to turn them off.
670 * @return a boolean, {@code true} indicating success. All network types
671 * will be tried, even if some fail.
672 *
673 * <p>This method requires the call to hold the permission
674 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
675 * {@hide}
676 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800677 public boolean setRadios(boolean turnOn) {
678 try {
679 return mService.setRadios(turnOn);
680 } catch (RemoteException e) {
681 return false;
682 }
683 }
684
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800685 /**
686 * Tells a given networkType to set its radio power state as directed.
687 *
688 * @param networkType the int networkType of interest.
689 * @param turnOn a boolean, {@code true} to turn the radio on,
690 * {@code} false to turn it off.
691 * @return a boolean, {@code true} indicating success.
692 *
693 * <p>This method requires the call to hold the permission
694 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
695 * {@hide}
696 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800697 public boolean setRadio(int networkType, boolean turnOn) {
698 try {
699 return mService.setRadio(networkType, turnOn);
700 } catch (RemoteException e) {
701 return false;
702 }
703 }
704
705 /**
706 * Tells the underlying networking system that the caller wants to
707 * begin using the named feature. The interpretation of {@code feature}
708 * is completely up to each networking implementation.
Nicolas Falliere9530e3a2012-06-18 17:21:06 -0700709 * <p>This method requires the caller to hold the permission
710 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800711 * @param networkType specifies which network the request pertains to
712 * @param feature the name of the feature to be used
713 * @return an integer value representing the outcome of the request.
714 * The interpretation of this value is specific to each networking
715 * implementation+feature combination, except that the value {@code -1}
716 * always indicates failure.
717 */
718 public int startUsingNetworkFeature(int networkType, String feature) {
719 try {
Robert Greenwalt42acef32009-08-12 16:08:25 -0700720 return mService.startUsingNetworkFeature(networkType, feature,
721 new Binder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800722 } catch (RemoteException e) {
723 return -1;
724 }
725 }
726
727 /**
728 * Tells the underlying networking system that the caller is finished
729 * using the named feature. The interpretation of {@code feature}
730 * is completely up to each networking implementation.
Nicolas Falliere9530e3a2012-06-18 17:21:06 -0700731 * <p>This method requires the caller to hold the permission
732 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800733 * @param networkType specifies which network the request pertains to
734 * @param feature the name of the feature that is no longer needed
735 * @return an integer value representing the outcome of the request.
736 * The interpretation of this value is specific to each networking
737 * implementation+feature combination, except that the value {@code -1}
738 * always indicates failure.
739 */
740 public int stopUsingNetworkFeature(int networkType, String feature) {
741 try {
742 return mService.stopUsingNetworkFeature(networkType, feature);
743 } catch (RemoteException e) {
744 return -1;
745 }
746 }
747
748 /**
749 * Ensure that a network route exists to deliver traffic to the specified
750 * host via the specified network interface. An attempt to add a route that
751 * already exists is ignored, but treated as successful.
Nicolas Falliere9530e3a2012-06-18 17:21:06 -0700752 * <p>This method requires the caller to hold the permission
753 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800754 * @param networkType the type of the network over which traffic to the specified
755 * host is to be routed
756 * @param hostAddress the IP address of the host to which the route is desired
757 * @return {@code true} on success, {@code false} on failure
758 */
759 public boolean requestRouteToHost(int networkType, int hostAddress) {
Robert Greenwalt585ac0f2010-08-27 09:24:29 -0700760 InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress);
761
762 if (inetAddress == null) {
763 return false;
764 }
765
766 return requestRouteToHostAddress(networkType, inetAddress);
767 }
768
769 /**
770 * Ensure that a network route exists to deliver traffic to the specified
771 * host via the specified network interface. An attempt to add a route that
772 * already exists is ignored, but treated as successful.
773 * @param networkType the type of the network over which traffic to the specified
774 * host is to be routed
775 * @param hostAddress the IP address of the host to which the route is desired
776 * @return {@code true} on success, {@code false} on failure
777 * @hide
778 */
779 public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
780 byte[] address = hostAddress.getAddress();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800781 try {
Robert Greenwalt585ac0f2010-08-27 09:24:29 -0700782 return mService.requestRouteToHostAddress(networkType, address);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800783 } catch (RemoteException e) {
784 return false;
785 }
786 }
787
788 /**
789 * Returns the value of the setting for background data usage. If false,
790 * applications should not use the network if the application is not in the
791 * foreground. Developers should respect this setting, and check the value
792 * of this before performing any background data operations.
793 * <p>
794 * All applications that have background services that use the network
795 * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700796 * <p>
Scott Main4cc53332011-10-06 18:32:43 -0700797 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700798 * background data depends on several combined factors, and this method will
799 * always return {@code true}. Instead, when background data is unavailable,
800 * {@link #getActiveNetworkInfo()} will now appear disconnected.
Danica Chang6fdd0c62010-08-11 14:54:43 -0700801 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800802 * @return Whether background data usage is allowed.
803 */
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700804 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800805 public boolean getBackgroundDataSetting() {
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700806 // assume that background data is allowed; final authority is
807 // NetworkInfo which may be blocked.
808 return true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800809 }
810
811 /**
812 * Sets the value of the setting for background data usage.
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800813 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800814 * @param allowBackgroundData Whether an application should use data while
815 * it is in the background.
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800816 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800817 * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
818 * @see #getBackgroundDataSetting()
819 * @hide
820 */
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700821 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800822 public void setBackgroundDataSetting(boolean allowBackgroundData) {
Jeff Sharkey3a844fc2011-08-16 14:37:57 -0700823 // ignored
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800824 }
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800825
826 /**
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700827 * Return quota status for the current active network, or {@code null} if no
828 * network is active. Quota status can change rapidly, so these values
829 * shouldn't be cached.
Jeff Sharkey44a3e0d2011-10-06 10:50:09 -0700830 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800831 * <p>This method requires the call to hold the permission
832 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
833 *
Jeff Sharkey44a3e0d2011-10-06 10:50:09 -0700834 * @hide
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700835 */
836 public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
837 try {
838 return mService.getActiveNetworkQuotaInfo();
839 } catch (RemoteException e) {
840 return null;
841 }
842 }
843
844 /**
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800845 * Gets the value of the setting for enabling Mobile data.
846 *
847 * @return Whether mobile data is enabled.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800848 *
849 * <p>This method requires the call to hold the permission
850 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800851 * @hide
852 */
853 public boolean getMobileDataEnabled() {
854 try {
855 return mService.getMobileDataEnabled();
856 } catch (RemoteException e) {
857 return true;
858 }
859 }
860
861 /**
862 * Sets the persisted value for enabling/disabling Mobile data.
863 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800864 * @param enabled Whether the user wants the mobile data connection used
865 * or not.
Robert Greenwaltc03fa502010-02-23 18:58:05 -0800866 * @hide
867 */
868 public void setMobileDataEnabled(boolean enabled) {
869 try {
870 mService.setMobileDataEnabled(enabled);
871 } catch (RemoteException e) {
872 }
873 }
874
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800875 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800876 * {@hide}
877 */
878 public ConnectivityManager(IConnectivityManager service) {
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700879 mService = checkNotNull(service, "missing IConnectivityManager");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800880 }
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800881
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700882 /** {@hide} */
883 public static ConnectivityManager from(Context context) {
884 return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
885 }
886
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800887 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800888 * Get the set of tetherable, available interfaces. This list is limited by
889 * device configuration and current interface existence.
890 *
891 * @return an array of 0 or more Strings of tetherable interface names.
892 *
893 * <p>This method requires the call to hold the permission
894 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800895 * {@hide}
896 */
897 public String[] getTetherableIfaces() {
898 try {
899 return mService.getTetherableIfaces();
900 } catch (RemoteException e) {
901 return new String[0];
902 }
903 }
904
905 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800906 * Get the set of tethered interfaces.
907 *
908 * @return an array of 0 or more String of currently tethered interface names.
909 *
910 * <p>This method requires the call to hold the permission
911 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800912 * {@hide}
913 */
914 public String[] getTetheredIfaces() {
915 try {
916 return mService.getTetheredIfaces();
917 } catch (RemoteException e) {
918 return new String[0];
919 }
920 }
921
922 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800923 * Get the set of interface names which attempted to tether but
924 * failed. Re-attempting to tether may cause them to reset to the Tethered
925 * state. Alternatively, causing the interface to be destroyed and recreated
926 * may cause them to reset to the available state.
927 * {@link ConnectivityManager#getLastTetherError} can be used to get more
928 * information on the cause of the errors.
929 *
930 * @return an array of 0 or more String indicating the interface names
931 * which failed to tether.
932 *
933 * <p>This method requires the call to hold the permission
934 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800935 * {@hide}
936 */
Robert Greenwalt5a735062010-03-02 17:25:02 -0800937 public String[] getTetheringErroredIfaces() {
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800938 try {
Robert Greenwalt5a735062010-03-02 17:25:02 -0800939 return mService.getTetheringErroredIfaces();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800940 } catch (RemoteException e) {
Robert Greenwalt5a735062010-03-02 17:25:02 -0800941 return new String[0];
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800942 }
943 }
944
945 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800946 * Attempt to tether the named interface. This will setup a dhcp server
947 * on the interface, forward and NAT IP packets and forward DNS requests
948 * to the best active upstream network interface. Note that if no upstream
949 * IP network interface is available, dhcp will still run and traffic will be
950 * allowed between the tethered devices and this device, though upstream net
951 * access will of course fail until an upstream network interface becomes
952 * active.
953 *
954 * @param iface the interface name to tether.
955 * @return error a {@code TETHER_ERROR} value indicating success or failure type
956 *
957 * <p>This method requires the call to hold the permission
958 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800959 * {@hide}
960 */
Robert Greenwalt5a735062010-03-02 17:25:02 -0800961 public int tether(String iface) {
962 try {
963 return mService.tether(iface);
964 } catch (RemoteException e) {
965 return TETHER_ERROR_SERVICE_UNAVAIL;
966 }
967 }
968
969 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800970 * Stop tethering the named interface.
971 *
972 * @param iface the interface name to untether.
973 * @return error a {@code TETHER_ERROR} value indicating success or failure type
974 *
975 * <p>This method requires the call to hold the permission
976 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
Robert Greenwalt5a735062010-03-02 17:25:02 -0800977 * {@hide}
978 */
979 public int untether(String iface) {
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800980 try {
981 return mService.untether(iface);
982 } catch (RemoteException e) {
Robert Greenwalt5a735062010-03-02 17:25:02 -0800983 return TETHER_ERROR_SERVICE_UNAVAIL;
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800984 }
985 }
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800986
987 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800988 * Check if the device allows for tethering. It may be disabled via
989 * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or
990 * due to device configuration.
991 *
992 * @return a boolean - {@code true} indicating Tethering is supported.
993 *
994 * <p>This method requires the call to hold the permission
995 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800996 * {@hide}
997 */
998 public boolean isTetheringSupported() {
999 try {
1000 return mService.isTetheringSupported();
1001 } catch (RemoteException e) {
1002 return false;
1003 }
1004 }
1005
1006 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001007 * Get the list of regular expressions that define any tetherable
1008 * USB network interfaces. If USB tethering is not supported by the
1009 * device, this list should be empty.
1010 *
1011 * @return an array of 0 or more regular expression Strings defining
1012 * what interfaces are considered tetherable usb interfaces.
1013 *
1014 * <p>This method requires the call to hold the permission
1015 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt2a091d72010-02-11 18:18:40 -08001016 * {@hide}
1017 */
1018 public String[] getTetherableUsbRegexs() {
1019 try {
1020 return mService.getTetherableUsbRegexs();
1021 } catch (RemoteException e) {
1022 return new String[0];
1023 }
1024 }
1025
1026 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001027 * Get the list of regular expressions that define any tetherable
1028 * Wifi network interfaces. If Wifi tethering is not supported by the
1029 * device, this list should be empty.
1030 *
1031 * @return an array of 0 or more regular expression Strings defining
1032 * what interfaces are considered tetherable wifi interfaces.
1033 *
1034 * <p>This method requires the call to hold the permission
1035 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt2a091d72010-02-11 18:18:40 -08001036 * {@hide}
1037 */
1038 public String[] getTetherableWifiRegexs() {
1039 try {
1040 return mService.getTetherableWifiRegexs();
1041 } catch (RemoteException e) {
1042 return new String[0];
1043 }
1044 }
Robert Greenwalt5a735062010-03-02 17:25:02 -08001045
Danica Chang6fdd0c62010-08-11 14:54:43 -07001046 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001047 * Get the list of regular expressions that define any tetherable
1048 * Bluetooth network interfaces. If Bluetooth tethering is not supported by the
1049 * device, this list should be empty.
1050 *
1051 * @return an array of 0 or more regular expression Strings defining
1052 * what interfaces are considered tetherable bluetooth interfaces.
1053 *
1054 * <p>This method requires the call to hold the permission
1055 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Danica Chang6fdd0c62010-08-11 14:54:43 -07001056 * {@hide}
1057 */
1058 public String[] getTetherableBluetoothRegexs() {
1059 try {
1060 return mService.getTetherableBluetoothRegexs();
1061 } catch (RemoteException e) {
1062 return new String[0];
1063 }
1064 }
1065
Mike Lockwood6c2260b2011-07-19 13:04:47 -07001066 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001067 * Attempt to both alter the mode of USB and Tethering of USB. A
1068 * utility method to deal with some of the complexity of USB - will
1069 * attempt to switch to Rndis and subsequently tether the resulting
1070 * interface on {@code true} or turn off tethering and switch off
1071 * Rndis on {@code false}.
1072 *
1073 * @param enable a boolean - {@code true} to enable tethering
1074 * @return error a {@code TETHER_ERROR} value indicating success or failure type
1075 *
1076 * <p>This method requires the call to hold the permission
1077 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
Mike Lockwood6c2260b2011-07-19 13:04:47 -07001078 * {@hide}
1079 */
1080 public int setUsbTethering(boolean enable) {
1081 try {
1082 return mService.setUsbTethering(enable);
1083 } catch (RemoteException e) {
1084 return TETHER_ERROR_SERVICE_UNAVAIL;
1085 }
1086 }
1087
Robert Greenwalt5a735062010-03-02 17:25:02 -08001088 /** {@hide} */
1089 public static final int TETHER_ERROR_NO_ERROR = 0;
1090 /** {@hide} */
1091 public static final int TETHER_ERROR_UNKNOWN_IFACE = 1;
1092 /** {@hide} */
1093 public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2;
1094 /** {@hide} */
1095 public static final int TETHER_ERROR_UNSUPPORTED = 3;
1096 /** {@hide} */
1097 public static final int TETHER_ERROR_UNAVAIL_IFACE = 4;
1098 /** {@hide} */
1099 public static final int TETHER_ERROR_MASTER_ERROR = 5;
1100 /** {@hide} */
1101 public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
1102 /** {@hide} */
1103 public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
1104 /** {@hide} */
1105 public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8;
1106 /** {@hide} */
1107 public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9;
1108 /** {@hide} */
1109 public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10;
1110
1111 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001112 * Get a more detailed error code after a Tethering or Untethering
1113 * request asynchronously failed.
1114 *
1115 * @param iface The name of the interface of interest
Robert Greenwalt5a735062010-03-02 17:25:02 -08001116 * @return error The error code of the last error tethering or untethering the named
1117 * interface
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001118 *
1119 * <p>This method requires the call to hold the permission
1120 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt5a735062010-03-02 17:25:02 -08001121 * {@hide}
1122 */
1123 public int getLastTetherError(String iface) {
1124 try {
1125 return mService.getLastTetherError(iface);
1126 } catch (RemoteException e) {
1127 return TETHER_ERROR_SERVICE_UNAVAIL;
1128 }
Robert Greenwalt14f2ef42010-06-15 12:19:37 -07001129 }
1130
1131 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001132 * Try to ensure the device stays awake until we connect with the next network.
1133 * Actually just holds a wakelock for a number of seconds while we try to connect
1134 * to any default networks. This will expire if the timeout passes or if we connect
1135 * to a default after this is called. For internal use only.
1136 *
1137 * @param forWhom the name of the network going down for logging purposes
Robert Greenwalt14f2ef42010-06-15 12:19:37 -07001138 * @return {@code true} on success, {@code false} on failure
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001139 *
1140 * <p>This method requires the call to hold the permission
1141 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
Robert Greenwalt14f2ef42010-06-15 12:19:37 -07001142 * {@hide}
1143 */
1144 public boolean requestNetworkTransitionWakelock(String forWhom) {
1145 try {
1146 mService.requestNetworkTransitionWakelock(forWhom);
1147 return true;
1148 } catch (RemoteException e) {
1149 return false;
1150 }
1151 }
Robert Greenwaltca4306c2010-09-09 13:15:32 -07001152
Robert Greenwalt67fd6c92010-09-09 14:22:59 -07001153 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001154 * Report network connectivity status. This is currently used only
1155 * to alter status bar UI.
1156 *
Robert Greenwaltd7085fc2010-09-08 15:24:47 -07001157 * @param networkType The type of network you want to report on
1158 * @param percentage The quality of the connection 0 is bad, 100 is good
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001159 *
1160 * <p>This method requires the call to hold the permission
1161 * {@link android.Manifest.permission#STATUS_BAR}.
Robert Greenwaltd7085fc2010-09-08 15:24:47 -07001162 * {@hide}
1163 */
1164 public void reportInetCondition(int networkType, int percentage) {
1165 try {
1166 mService.reportInetCondition(networkType, percentage);
1167 } catch (RemoteException e) {
1168 }
1169 }
Robert Greenwalt434203a2010-10-11 16:00:27 -07001170
1171 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001172 * Set a network-independent global http proxy. This is not normally what you want
1173 * for typical HTTP proxies - they are general network dependent. However if you're
1174 * doing something unusual like general internal filtering this may be useful. On
1175 * a private network where the proxy is not accessible, you may break HTTP using this.
1176 *
1177 * @param proxyProperties The a {@link ProxyProperites} object defining the new global
1178 * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
1179 *
1180 * <p>This method requires the call to hold the permission
Robert Greenwalta9bebc22013-04-10 15:32:18 -07001181 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
Robert Greenwalt434203a2010-10-11 16:00:27 -07001182 * {@hide}
1183 */
1184 public void setGlobalProxy(ProxyProperties p) {
1185 try {
1186 mService.setGlobalProxy(p);
1187 } catch (RemoteException e) {
1188 }
1189 }
1190
1191 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001192 * Retrieve any network-independent global HTTP proxy.
1193 *
1194 * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null}
1195 * if no global HTTP proxy is set.
1196 *
1197 * <p>This method requires the call to hold the permission
1198 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt434203a2010-10-11 16:00:27 -07001199 * {@hide}
1200 */
1201 public ProxyProperties getGlobalProxy() {
1202 try {
1203 return mService.getGlobalProxy();
1204 } catch (RemoteException e) {
1205 return null;
1206 }
1207 }
1208
1209 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001210 * Get the HTTP proxy settings for the current default network. Note that
1211 * if a global proxy is set, it will override any per-network setting.
1212 *
1213 * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no
1214 * HTTP proxy is active.
1215 *
1216 * <p>This method requires the call to hold the permission
1217 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt434203a2010-10-11 16:00:27 -07001218 * {@hide}
1219 */
1220 public ProxyProperties getProxy() {
1221 try {
1222 return mService.getProxy();
1223 } catch (RemoteException e) {
1224 return null;
1225 }
1226 }
Robert Greenwaltd55a6b42011-03-25 13:09:25 -07001227
1228 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001229 * Sets a secondary requirement bit for the given networkType.
1230 * This requirement bit is generally under the control of the carrier
1231 * or its agents and is not directly controlled by the user.
1232 *
Robert Greenwaltd55a6b42011-03-25 13:09:25 -07001233 * @param networkType The network who's dependence has changed
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001234 * @param met Boolean - true if network use is OK, false if not
1235 *
1236 * <p>This method requires the call to hold the permission
1237 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
Robert Greenwaltd55a6b42011-03-25 13:09:25 -07001238 * {@hide}
1239 */
1240 public void setDataDependency(int networkType, boolean met) {
1241 try {
1242 mService.setDataDependency(networkType, met);
1243 } catch (RemoteException e) {
1244 }
1245 }
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07001246
1247 /**
1248 * Returns true if the hardware supports the given network type
1249 * else it returns false. This doesn't indicate we have coverage
1250 * or are authorized onto a network, just whether or not the
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001251 * hardware supports it. For example a GSM phone without a SIM
1252 * should still return {@code true} for mobile data, but a wifi only
1253 * tablet would return {@code false}.
1254 *
1255 * @param networkType The network type we'd like to check
1256 * @return {@code true} if supported, else {@code false}
1257 *
1258 * <p>This method requires the call to hold the permission
1259 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07001260 * @hide
1261 */
1262 public boolean isNetworkSupported(int networkType) {
1263 try {
1264 return mService.isNetworkSupported(networkType);
1265 } catch (RemoteException e) {}
1266 return false;
1267 }
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07001268
1269 /**
1270 * Returns if the currently active data network is metered. A network is
1271 * classified as metered when the user is sensitive to heavy data usage on
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001272 * that connection due to monetary costs, data limitations or
1273 * battery/performance issues. You should check this before doing large
1274 * data transfers, and warn the user or delay the operation until another
1275 * network is available.
1276 *
1277 * @return {@code true} if large transfers should be avoided, otherwise
1278 * {@code false}.
1279 *
1280 * <p>This method requires the call to hold the permission
1281 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07001282 */
1283 public boolean isActiveNetworkMetered() {
1284 try {
1285 return mService.isActiveNetworkMetered();
1286 } catch (RemoteException e) {
1287 return false;
1288 }
1289 }
Jeff Sharkey69ddab42012-08-25 00:05:46 -07001290
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001291 /**
1292 * If the LockdownVpn mechanism is enabled, updates the vpn
1293 * with a reload of its profile.
1294 *
1295 * @return a boolean with {@code} indicating success
1296 *
1297 * <p>This method can only be called by the system UID
1298 * {@hide}
1299 */
Jeff Sharkey69ddab42012-08-25 00:05:46 -07001300 public boolean updateLockdownVpn() {
1301 try {
1302 return mService.updateLockdownVpn();
1303 } catch (RemoteException e) {
1304 return false;
1305 }
1306 }
Irfan Sheriffda6da092012-08-16 12:49:23 -07001307
1308 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001309 * Signal that the captive portal check on the indicated network
1310 * is complete and we can turn the network on for general use.
1311 *
1312 * @param info the {@link NetworkInfo} object for the networkType
1313 * in question.
1314 *
1315 * <p>This method requires the call to hold the permission
1316 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
Irfan Sheriffda6da092012-08-16 12:49:23 -07001317 * {@hide}
1318 */
1319 public void captivePortalCheckComplete(NetworkInfo info) {
1320 try {
1321 mService.captivePortalCheckComplete(info);
1322 } catch (RemoteException e) {
1323 }
1324 }
1325
Robert Greenwalt665e1ae2012-08-21 19:27:00 -07001326 /**
1327 * Supply the backend messenger for a network tracker
1328 *
1329 * @param type NetworkType to set
1330 * @param messenger {@link Messenger}
1331 * {@hide}
1332 */
1333 public void supplyMessenger(int networkType, Messenger messenger) {
1334 try {
1335 mService.supplyMessenger(networkType, messenger);
1336 } catch (RemoteException e) {
1337 }
1338 }
Wink Savilleab9321d2013-06-29 21:10:57 -07001339
1340 /**
1341 * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
1342 */
1343
1344 /**
1345 * No connection was possible to the network.
1346 * {@hide}
1347 */
1348 public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
1349
1350 /**
1351 * A connection was made to the internet, all is well.
1352 * {@hide}
1353 */
1354 public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
1355
1356 /**
1357 * A connection was made but there was a redirection, we appear to be in walled garden.
1358 * This is an indication of a warm sim on a mobile network.
1359 * {@hide}
1360 */
1361 public static final int CMP_RESULT_CODE_REDIRECTED = 2;
1362
1363 /**
1364 * A connection was made but no dns server was available to resolve a name to address.
1365 * This is an indication of a warm sim on a mobile network.
1366 *
1367 * {@hide}
1368 */
1369 public static final int CMP_RESULT_CODE_NO_DNS = 3;
1370
1371 /**
1372 * A connection was made but could not open a TCP connection.
1373 * This is an indication of a warm sim on a mobile network.
1374 * {@hide}
1375 */
1376 public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
1377
1378 /**
1379 * Check mobile provisioning. The resultCode passed to
1380 * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above.
1381 * This may take a minute or more to complete.
1382 *
1383 * @param sendNotificaiton, when true a notification will be sent to user.
1384 * @param suggestedTimeOutMs, timeout in milliseconds
1385 * @param resultReceiver needs to be supplied to receive the result
1386 *
1387 * @return time out that will be used, maybe less that suggestedTimeOutMs
1388 * -1 if an error.
1389 *
1390 * {@hide}
1391 */
1392 public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs,
1393 ResultReceiver resultReceiver) {
1394 int timeOutMs = -1;
1395 try {
1396 timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs,
1397 resultReceiver);
1398 } catch (RemoteException e) {
1399 }
1400 return timeOutMs;
1401 }
Robert Greenwalte182bfe2013-07-16 12:06:09 -07001402
1403 /**
1404 * Get the carrier provisioning url.
1405 * {@hide}
1406 */
1407 public String getMobileProvisioningUrl() {
1408 try {
1409 return mService.getMobileProvisioningUrl();
1410 } catch (RemoteException e) {
1411 }
1412 return null;
1413 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001414}