blob: b0cc38c2cf3ed59fabd5c6e2fc6c7ec3997b7fc9 [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 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080016package android.net;
17
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -070018import static com.android.internal.util.Preconditions.checkNotNull;
Jeremy Klein36c7aa02016-01-22 14:11:45 -080019
Felipe Leme1b103232016-01-22 09:44:57 -080020import android.annotation.IntDef;
Robin Lee244ce8e2016-01-05 18:03:46 +000021import android.annotation.Nullable;
Jeff Sharkey30e06bb2017-04-24 11:18:03 -060022import android.annotation.RequiresPermission;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023import android.annotation.SdkConstant;
24import android.annotation.SdkConstant.SdkConstantType;
Udam Sainib7c24872016-01-04 12:16:14 -080025import android.annotation.SystemApi;
Robert Greenwalt9258c642014-03-26 16:47:06 -070026import android.app.PendingIntent;
Jeff Sharkey8fc27e82012-04-04 20:40:58 -070027import android.content.Context;
Robert Greenwaltd19c41c2014-05-18 23:07:25 -070028import android.content.Intent;
Lorenzo Colittiffc42b02015-07-29 11:41:21 +090029import android.content.pm.PackageManager;
Robert Greenwalt42acef32009-08-12 16:08:25 -070030import android.os.Binder;
Jeff Sharkey3a844fc2011-08-16 14:37:57 -070031import android.os.Build.VERSION_CODES;
Jeremy Klein36c7aa02016-01-22 14:11:45 -080032import android.os.Bundle;
Robert Greenwalt9258c642014-03-26 16:47:06 -070033import android.os.Handler;
34import android.os.HandlerThread;
Dianne Hackborn77b987f2014-02-26 16:20:52 -080035import android.os.IBinder;
36import android.os.INetworkActivityListener;
37import android.os.INetworkManagementService;
Robert Greenwalt9258c642014-03-26 16:47:06 -070038import android.os.Looper;
39import android.os.Message;
Robert Greenwalt665e1ae2012-08-21 19:27:00 -070040import android.os.Messenger;
Lorenzo Colittiffc42b02015-07-29 11:41:21 +090041import android.os.Process;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042import android.os.RemoteException;
Jeremy Klein36c7aa02016-01-22 14:11:45 -080043import android.os.ResultReceiver;
Dianne Hackborn77b987f2014-02-26 16:20:52 -080044import android.os.ServiceManager;
Jeff Sharkey961e3042011-08-29 16:02:57 -070045import android.provider.Settings;
Wink Saville36ffb042014-12-05 11:10:30 -080046import android.telephony.SubscriptionManager;
Dianne Hackborn77b987f2014-02-26 16:20:52 -080047import android.util.ArrayMap;
Robert Greenwalt9258c642014-03-26 16:47:06 -070048import android.util.Log;
Lorenzo Colittifcfa7d92016-03-01 22:56:37 +090049import android.util.SparseArray;
Erik Kline35bf06c2017-01-26 18:08:28 +090050import android.util.SparseIntArray;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051
Robert Greenwaltafa05c02014-05-21 20:04:36 -070052import com.android.internal.telephony.ITelephony;
Robert Greenwalt562cc542014-05-15 18:07:26 -070053import com.android.internal.telephony.PhoneConstants;
Robert Greenwaltafa05c02014-05-21 20:04:36 -070054import com.android.internal.util.Protocol;
Lorenzo Colittifcfa7d92016-03-01 22:56:37 +090055import com.android.internal.util.MessageUtils;
Robert Greenwaltafa05c02014-05-21 20:04:36 -070056
Paul Jensenc91b5342014-08-27 12:38:45 -040057import libcore.net.event.NetworkEventDispatcher;
58
Felipe Leme1b103232016-01-22 09:44:57 -080059import java.lang.annotation.Retention;
60import java.lang.annotation.RetentionPolicy;
Jeremy Kleind42209d2015-12-28 15:11:58 -080061import java.net.InetAddress;
62import java.util.HashMap;
63import java.util.concurrent.atomic.AtomicInteger;
64
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065/**
66 * Class that answers queries about the state of network connectivity. It also
67 * notifies applications when network connectivity changes. Get an instance
68 * of this class by calling
69 * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
70 * <p>
71 * The primary responsibilities of this class are to:
72 * <ol>
73 * <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li>
74 * <li>Send broadcast intents when network connectivity changes</li>
75 * <li>Attempt to "fail over" to another network when connectivity to a network
76 * is lost</li>
77 * <li>Provide an API that allows applications to query the coarse-grained or fine-grained
78 * state of the available networks</li>
Robert Greenwaltd19c41c2014-05-18 23:07:25 -070079 * <li>Provide an API that allows applications to request and select networks for their data
80 * traffic</li>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081 * </ol>
82 */
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -070083public class ConnectivityManager {
84 private static final String TAG = "ConnectivityManager";
85
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080086 /**
Robert Greenwaltd19c41c2014-05-18 23:07:25 -070087 * A change in network connectivity has occurred. A default connection has either
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088 * been established or lost. The NetworkInfo for the affected network is
89 * sent as an extra; it should be consulted to see what kind of
90 * connectivity event occurred.
91 * <p/>
Mark Lu33ec1062016-12-05 10:57:55 -080092 * Apps targeting Android 7.0 (API level 24) and higher do not receive this
93 * broadcast if they declare the broadcast receiver in their manifest. Apps
94 * will still receive broadcasts if they register their
95 * {@link android.content.BroadcastReceiver} with
96 * {@link android.content.Context#registerReceiver Context.registerReceiver()}
97 * and that context is still valid.
98 * <p/>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 * If this is a connection that was the result of failing over from a
100 * disconnected network, then the FAILOVER_CONNECTION boolean extra is
101 * set to true.
102 * <p/>
103 * For a loss of connectivity, if the connectivity manager is attempting
104 * to connect (or has already connected) to another network, the
105 * NetworkInfo for the new network is also passed as an extra. This lets
106 * any receivers of the broadcast know that they should not necessarily
107 * tell the user that no data traffic will be possible. Instead, the
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800108 * receiver should expect another broadcast soon, indicating either that
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 * the failover attempt succeeded (and so there is still overall data
110 * connectivity), or that the failover attempt failed, meaning that all
111 * connectivity has been lost.
112 * <p/>
113 * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY
114 * is set to {@code true} if there are no connected networks at all.
115 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800116 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800117 public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700118
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800119 /**
Robert Greenwalte94a6ff2015-09-01 08:23:04 -0700120 * A temporary hack until SUPL system can get off the legacy APIS.
121 * They do too many network requests and the long list of apps listening
122 * and waking due to the CONNECTIVITY_ACTION bcast makes it expensive.
123 * Use this bcast intent instead for SUPL requests.
124 * @hide
125 */
126 public static final String CONNECTIVITY_ACTION_SUPL =
127 "android.net.conn.CONNECTIVITY_CHANGE_SUPL";
128
129 /**
Paul Jensen25a217c2015-02-27 22:55:47 -0500130 * The device has connected to a network that has presented a captive
131 * portal, which is blocking Internet connectivity. The user was presented
132 * with a notification that network sign in is required,
133 * and the user invoked the notification's action indicating they
Paul Jensen49e3edf2015-05-22 10:50:39 -0400134 * desire to sign in to the network. Apps handling this activity should
Paul Jensen25a217c2015-02-27 22:55:47 -0500135 * facilitate signing in to the network. This action includes a
136 * {@link Network} typed extra called {@link #EXTRA_NETWORK} that represents
137 * the network presenting the captive portal; all communication with the
138 * captive portal must be done using this {@code Network} object.
139 * <p/>
Paul Jensen49e3edf2015-05-22 10:50:39 -0400140 * This activity includes a {@link CaptivePortal} extra named
141 * {@link #EXTRA_CAPTIVE_PORTAL} that can be used to indicate different
142 * outcomes of the captive portal sign in to the system:
143 * <ul>
144 * <li> When the app handling this action believes the user has signed in to
145 * the network and the captive portal has been dismissed, the app should
146 * call {@link CaptivePortal#reportCaptivePortalDismissed} so the system can
147 * reevaluate the network. If reevaluation finds the network no longer
148 * subject to a captive portal, the network may become the default active
149 * data network. </li>
150 * <li> When the app handling this action believes the user explicitly wants
Paul Jensen25a217c2015-02-27 22:55:47 -0500151 * to ignore the captive portal and the network, the app should call
Paul Jensen49e3edf2015-05-22 10:50:39 -0400152 * {@link CaptivePortal#ignoreNetwork}. </li>
153 * </ul>
Paul Jensen25a217c2015-02-27 22:55:47 -0500154 */
155 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
156 public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
157
158 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800159 * The lookup key for a {@link NetworkInfo} object. Retrieve with
160 * {@link android.content.Intent#getParcelableExtra(String)}.
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700161 *
162 * @deprecated Since {@link NetworkInfo} can vary based on UID, applications
163 * should always obtain network information through
Paul Jensen3541e9f2015-03-18 12:23:02 -0400164 * {@link #getActiveNetworkInfo()}.
Jeff Sharkey75fbb4b2012-08-06 11:41:50 -0700165 * @see #EXTRA_NETWORK_TYPE
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800166 */
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700167 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800168 public static final String EXTRA_NETWORK_INFO = "networkInfo";
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -0700169
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800170 /**
Jeff Sharkey75fbb4b2012-08-06 11:41:50 -0700171 * Network type which triggered a {@link #CONNECTIVITY_ACTION} broadcast.
Jeff Sharkey75fbb4b2012-08-06 11:41:50 -0700172 *
173 * @see android.content.Intent#getIntExtra(String, int)
174 */
175 public static final String EXTRA_NETWORK_TYPE = "networkType";
176
177 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178 * The lookup key for a boolean that indicates whether a connect event
179 * is for a network to which the connectivity manager was failing over
180 * following a disconnect on another network.
181 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
182 */
183 public static final String EXTRA_IS_FAILOVER = "isFailover";
184 /**
185 * The lookup key for a {@link NetworkInfo} object. This is supplied when
186 * there is another network that it may be possible to connect to. Retrieve with
187 * {@link android.content.Intent#getParcelableExtra(String)}.
188 */
189 public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
190 /**
191 * The lookup key for a boolean that indicates whether there is a
192 * complete lack of connectivity, i.e., no network is available.
193 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
194 */
195 public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
196 /**
197 * The lookup key for a string that indicates why an attempt to connect
198 * to a network failed. The string has no particular structure. It is
199 * intended to be used in notifications presented to users. Retrieve
200 * it with {@link android.content.Intent#getStringExtra(String)}.
201 */
202 public static final String EXTRA_REASON = "reason";
203 /**
204 * The lookup key for a string that provides optionally supplied
205 * extra information about the network state. The information
206 * may be passed up from the lower networking layers, and its
207 * meaning may be specific to a particular network type. Retrieve
208 * it with {@link android.content.Intent#getStringExtra(String)}.
209 */
210 public static final String EXTRA_EXTRA_INFO = "extraInfo";
Robert Greenwaltd7085fc2010-09-08 15:24:47 -0700211 /**
212 * The lookup key for an int that provides information about
213 * our connection to the internet at large. 0 indicates no connection,
214 * 100 indicates a great connection. Retrieve it with
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700215 * {@link android.content.Intent#getIntExtra(String, int)}.
Robert Greenwaltd7085fc2010-09-08 15:24:47 -0700216 * {@hide}
217 */
218 public static final String EXTRA_INET_CONDITION = "inetCondition";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800219 /**
Paul Jensen49e3edf2015-05-22 10:50:39 -0400220 * The lookup key for a {@link CaptivePortal} object included with the
221 * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} intent. The {@code CaptivePortal}
222 * object can be used to either indicate to the system that the captive
223 * portal has been dismissed or that the user does not want to pursue
224 * signing in to captive portal. Retrieve it with
225 * {@link android.content.Intent#getParcelableExtra(String)}.
Paul Jensen25a217c2015-02-27 22:55:47 -0500226 */
Paul Jensen49e3edf2015-05-22 10:50:39 -0400227 public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
Jan Nordqvist52eb29f2015-09-22 15:54:32 -0700228
229 /**
230 * Key for passing a URL to the captive portal login activity.
231 */
232 public static final String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL";
233
Paul Jensen25a217c2015-02-27 22:55:47 -0500234 /**
Hugo Benichicdf3ba42016-12-14 08:23:40 +0900235 * Key for passing a user agent string to the captive portal login activity.
236 * {@hide}
237 */
238 public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT =
239 "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
240
241 /**
Haoyu Baidb3c8672012-06-20 14:29:57 -0700242 * Broadcast action to indicate the change of data activity status
243 * (idle or active) on a network in a recent period.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800244 * The network becomes active when data transmission is started, or
245 * idle if there is no data transmission for a period of time.
Haoyu Baidb3c8672012-06-20 14:29:57 -0700246 * {@hide}
247 */
248 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
249 public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE";
250 /**
251 * The lookup key for an enum that indicates the network device type on which this data activity
252 * change happens.
253 * {@hide}
254 */
255 public static final String EXTRA_DEVICE_TYPE = "deviceType";
256 /**
257 * The lookup key for a boolean that indicates the device is active or not. {@code true} means
258 * it is actively sending or receiving data and {@code false} means it is idle.
259 * {@hide}
260 */
261 public static final String EXTRA_IS_ACTIVE = "isActive";
Ashish Sharma0535a9f2014-03-12 18:42:23 -0700262 /**
263 * The lookup key for a long that contains the timestamp (nanos) of the radio state change.
264 * {@hide}
265 */
266 public static final String EXTRA_REALTIME_NS = "tsNanos";
Haoyu Baidb3c8672012-06-20 14:29:57 -0700267
268 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800269 * Broadcast Action: The setting for background data usage has changed
270 * values. Use {@link #getBackgroundDataSetting()} to get the current value.
271 * <p>
272 * If an application uses the network in the background, it should listen
273 * for this broadcast and stop using the background data if the value is
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700274 * {@code false}.
Jeff Sharkey54ee2ad2012-01-30 16:29:24 -0800275 * <p>
276 *
277 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability
278 * of background data depends on several combined factors, and
279 * this broadcast is no longer sent. Instead, when background
280 * data is unavailable, {@link #getActiveNetworkInfo()} will now
281 * appear disconnected. During first boot after a platform
282 * upgrade, this broadcast will be sent once if
283 * {@link #getBackgroundDataSetting()} was {@code false} before
284 * the upgrade.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800285 */
286 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Jeff Sharkey54ee2ad2012-01-30 16:29:24 -0800287 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800288 public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED =
289 "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
290
Robert Greenwalt1e9aac22010-09-15 17:36:33 -0700291 /**
292 * Broadcast Action: The network connection may not be good
293 * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and
294 * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify
295 * the network and it's condition.
296 * @hide
297 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800298 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Robert Greenwalt1e9aac22010-09-15 17:36:33 -0700299 public static final String INET_CONDITION_ACTION =
300 "android.net.conn.INET_CONDITION_ACTION";
301
Robert Greenwalt42acef32009-08-12 16:08:25 -0700302 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800303 * Broadcast Action: A tetherable connection has come or gone.
304 * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER},
Erik Kline668b7222017-04-17 16:47:23 +0900305 * {@code ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY},
306 * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER}, and
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800307 * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate
308 * the current state of tethering. Each include a list of
309 * interface names in that state (may be empty).
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800310 * @hide
311 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800312 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800313 public static final String ACTION_TETHER_STATE_CHANGED =
314 "android.net.conn.TETHER_STATE_CHANGED";
315
316 /**
317 * @hide
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800318 * gives a String[] listing all the interfaces configured for
319 * tethering and currently available for tethering.
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800320 */
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800321 public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800322
323 /**
324 * @hide
Erik Kline668b7222017-04-17 16:47:23 +0900325 * gives a String[] listing all the interfaces currently in local-only
326 * mode (ie, has DHCPv4+IPv6-ULA support and no packet forwarding)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800327 */
Erik Kline668b7222017-04-17 16:47:23 +0900328 public static final String EXTRA_ACTIVE_LOCAL_ONLY = "localOnlyArray";
329
330 /**
331 * @hide
332 * gives a String[] listing all the interfaces currently tethered
333 * (ie, has DHCPv4 support and packets potentially forwarded/NATed)
334 */
335 public static final String EXTRA_ACTIVE_TETHER = "tetherArray";
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800336
337 /**
338 * @hide
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800339 * gives a String[] listing all the interfaces we tried to tether and
340 * failed. Use {@link #getLastTetherError} to find the error code
341 * for any interfaces listed here.
Robert Greenwalt2a091d72010-02-11 18:18:40 -0800342 */
343 public static final String EXTRA_ERRORED_TETHER = "erroredArray";
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -0800344
345 /**
Russell Brenner108da0c2013-02-12 10:03:14 -0800346 * Broadcast Action: The captive portal tracker has finished its test.
347 * Sent only while running Setup Wizard, in lieu of showing a user
348 * notification.
349 * @hide
350 */
Jeff Sharkey4fa63b22013-02-20 18:21:19 -0800351 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
Russell Brenner108da0c2013-02-12 10:03:14 -0800352 public static final String ACTION_CAPTIVE_PORTAL_TEST_COMPLETED =
353 "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED";
354 /**
355 * The lookup key for a boolean that indicates whether a captive portal was detected.
356 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
357 * @hide
358 */
359 public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal";
360
361 /**
Lorenzo Colittie03c3c72015-04-03 16:38:52 +0900362 * Action used to display a dialog that asks the user whether to connect to a network that is
363 * not validated. This intent is used to start the dialog in settings via startActivity.
364 *
365 * @hide
366 */
367 public static final String ACTION_PROMPT_UNVALIDATED = "android.net.conn.PROMPT_UNVALIDATED";
368
369 /**
Lorenzo Colitti9be58c52016-09-15 14:02:29 +0900370 * Action used to display a dialog that asks the user whether to avoid a network that is no
371 * longer validated. This intent is used to start the dialog in settings via startActivity.
372 *
373 * @hide
374 */
375 public static final String ACTION_PROMPT_LOST_VALIDATION =
376 "android.net.conn.PROMPT_LOST_VALIDATION";
377
378 /**
Jeremy Klein36c7aa02016-01-22 14:11:45 -0800379 * Invalid tethering type.
380 * @see #startTethering(int, OnStartTetheringCallback, boolean)
381 * @hide
382 */
383 public static final int TETHERING_INVALID = -1;
384
385 /**
386 * Wifi tethering type.
387 * @see #startTethering(int, OnStartTetheringCallback, boolean)
388 * @hide
389 */
390 @SystemApi
391 public static final int TETHERING_WIFI = 0;
392
393 /**
394 * USB tethering type.
395 * @see #startTethering(int, OnStartTetheringCallback, boolean)
396 * @hide
397 */
398 @SystemApi
399 public static final int TETHERING_USB = 1;
400
401 /**
402 * Bluetooth tethering type.
403 * @see #startTethering(int, OnStartTetheringCallback, boolean)
404 * @hide
405 */
406 @SystemApi
407 public static final int TETHERING_BLUETOOTH = 2;
408
409 /**
410 * Extra used for communicating with the TetherService. Includes the type of tethering to
411 * enable if any.
412 * @hide
413 */
414 public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType";
415
416 /**
417 * Extra used for communicating with the TetherService. Includes the type of tethering for
418 * which to cancel provisioning.
419 * @hide
420 */
421 public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType";
422
423 /**
424 * Extra used for communicating with the TetherService. True to schedule a recheck of tether
425 * provisioning.
426 * @hide
427 */
428 public static final String EXTRA_SET_ALARM = "extraSetAlarm";
429
430 /**
431 * Tells the TetherService to run a provision check now.
432 * @hide
433 */
434 public static final String EXTRA_RUN_PROVISION = "extraRunProvision";
435
436 /**
437 * Extra used for communicating with the TetherService. Contains the {@link ResultReceiver}
438 * which will receive provisioning results. Can be left empty.
439 * @hide
440 */
441 public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback";
442
443 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800444 * The absence of a connection type.
Robert Greenwaltccf83af12011-06-02 17:30:47 -0700445 * @hide
446 */
447 public static final int TYPE_NONE = -1;
448
449 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800450 * The Mobile data connection. When active, all data traffic
451 * will use this network type's interface by default
452 * (it has a default route)
Robert Greenwalt42acef32009-08-12 16:08:25 -0700453 */
454 public static final int TYPE_MOBILE = 0;
455 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800456 * The WIFI data connection. When active, all data traffic
457 * will use this network type's interface by default
458 * (it has a default route).
Robert Greenwalt42acef32009-08-12 16:08:25 -0700459 */
460 public static final int TYPE_WIFI = 1;
461 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800462 * An MMS-specific Mobile data connection. This network type may use the
463 * same network interface as {@link #TYPE_MOBILE} or it may use a different
464 * one. This is used by applications needing to talk to the carrier's
465 * Multimedia Messaging Service servers.
Lorenzo Colittie285b432015-04-23 15:32:42 +0900466 *
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +0900467 * @deprecated Applications should instead use
468 * {@link #requestNetwork(NetworkRequest, NetworkCallback)} to request a network that
Lorenzo Colittie285b432015-04-23 15:32:42 +0900469 * provides the {@link NetworkCapabilities#NET_CAPABILITY_MMS} capability.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700470 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700471 @Deprecated
Robert Greenwalt42acef32009-08-12 16:08:25 -0700472 public static final int TYPE_MOBILE_MMS = 2;
473 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800474 * A SUPL-specific Mobile data connection. This network type may use the
475 * same network interface as {@link #TYPE_MOBILE} or it may use a different
476 * one. This is used by applications needing to talk to the carrier's
477 * Secure User Plane Location servers for help locating the device.
Lorenzo Colittie285b432015-04-23 15:32:42 +0900478 *
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +0900479 * @deprecated Applications should instead use
480 * {@link #requestNetwork(NetworkRequest, NetworkCallback)} to request a network that
Lorenzo Colittie285b432015-04-23 15:32:42 +0900481 * provides the {@link NetworkCapabilities#NET_CAPABILITY_SUPL} capability.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700482 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700483 @Deprecated
Robert Greenwalt42acef32009-08-12 16:08:25 -0700484 public static final int TYPE_MOBILE_SUPL = 3;
485 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800486 * A DUN-specific Mobile data connection. This network type may use the
487 * same network interface as {@link #TYPE_MOBILE} or it may use a different
488 * one. This is sometimes by the system when setting up an upstream connection
489 * for tethering so that the carrier is aware of DUN traffic.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700490 */
491 public static final int TYPE_MOBILE_DUN = 4;
492 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800493 * A High Priority Mobile data connection. This network type uses the
494 * same network interface as {@link #TYPE_MOBILE} but the routing setup
Lorenzo Colittie285b432015-04-23 15:32:42 +0900495 * is different.
496 *
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +0900497 * @deprecated Applications should instead use
498 * {@link #requestNetwork(NetworkRequest, NetworkCallback)} to request a network that
Lorenzo Colittie285b432015-04-23 15:32:42 +0900499 * uses the {@link NetworkCapabilities#TRANSPORT_CELLULAR} transport.
Robert Greenwalt42acef32009-08-12 16:08:25 -0700500 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700501 @Deprecated
Robert Greenwalt42acef32009-08-12 16:08:25 -0700502 public static final int TYPE_MOBILE_HIPRI = 5;
jsh8214deb2010-03-11 15:04:43 -0800503 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800504 * The WiMAX data connection. When active, all data traffic
505 * will use this network type's interface by default
506 * (it has a default route).
jsh8214deb2010-03-11 15:04:43 -0800507 */
508 public static final int TYPE_WIMAX = 6;
Robert Greenwaltda3d5e62010-12-06 13:56:24 -0800509
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800510 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800511 * The Bluetooth data connection. When active, all data traffic
512 * will use this network type's interface by default
513 * (it has a default route).
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800514 */
515 public static final int TYPE_BLUETOOTH = 7;
516
Robert Greenwalt60810842011-04-22 15:28:18 -0700517 /**
518 * Dummy data connection. This should not be used on shipping devices.
519 */
Jaikumar Ganesh15c74392010-12-21 22:31:44 -0800520 public static final int TYPE_DUMMY = 8;
Wink Saville9d7d6282011-03-12 14:52:01 -0800521
Robert Greenwalt60810842011-04-22 15:28:18 -0700522 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800523 * The Ethernet data connection. When active, all data traffic
524 * will use this network type's interface by default
525 * (it has a default route).
Robert Greenwalt60810842011-04-22 15:28:18 -0700526 */
Robert Greenwalte12aec92011-01-28 14:48:37 -0800527 public static final int TYPE_ETHERNET = 9;
Robert Greenwalt60810842011-04-22 15:28:18 -0700528
Wink Saville9d7d6282011-03-12 14:52:01 -0800529 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800530 * Over the air Administration.
Wink Saville9d7d6282011-03-12 14:52:01 -0800531 * {@hide}
532 */
533 public static final int TYPE_MOBILE_FOTA = 10;
534
535 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800536 * IP Multimedia Subsystem.
Wink Saville9d7d6282011-03-12 14:52:01 -0800537 * {@hide}
538 */
539 public static final int TYPE_MOBILE_IMS = 11;
540
541 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800542 * Carrier Branded Services.
Wink Saville9d7d6282011-03-12 14:52:01 -0800543 * {@hide}
544 */
545 public static final int TYPE_MOBILE_CBS = 12;
546
repo syncaea743a2011-07-29 23:55:49 -0700547 /**
548 * A Wi-Fi p2p connection. Only requesting processes will have access to
549 * the peers connected.
550 * {@hide}
551 */
552 public static final int TYPE_WIFI_P2P = 13;
Wink Saville9d7d6282011-03-12 14:52:01 -0800553
Wink Saville5e56bc52013-07-29 15:00:57 -0700554 /**
555 * The network to use for initially attaching to the network
556 * {@hide}
557 */
558 public static final int TYPE_MOBILE_IA = 14;
repo syncaea743a2011-07-29 23:55:49 -0700559
Lorenzo Colittie285b432015-04-23 15:32:42 +0900560 /**
Robert Greenwalt4bd43892015-07-09 14:49:35 -0700561 * Emergency PDN connection for emergency services. This
562 * may include IMS and MMS in emergency situations.
Ram3e0e3bc2014-06-26 11:03:44 -0700563 * {@hide}
564 */
565 public static final int TYPE_MOBILE_EMERGENCY = 15;
566
Hui Lu1c5624a2014-01-15 11:05:36 -0500567 /**
568 * The network that uses proxy to achieve connectivity.
569 * {@hide}
570 */
571 public static final int TYPE_PROXY = 16;
Wink Saville5e56bc52013-07-29 15:00:57 -0700572
Robert Greenwalt8283f882014-07-07 17:09:01 -0700573 /**
574 * A virtual network using one or more native bearers.
575 * It may or may not be providing security services.
576 */
577 public static final int TYPE_VPN = 17;
Hui Lu1c5624a2014-01-15 11:05:36 -0500578
579 /** {@hide} */
Robert Greenwalt8283f882014-07-07 17:09:01 -0700580 public static final int MAX_RADIO_TYPE = TYPE_VPN;
581
582 /** {@hide} */
583 public static final int MAX_NETWORK_TYPE = TYPE_VPN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800584
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800585 /**
586 * If you want to set the default network preference,you can directly
587 * change the networkAttributes array in framework's config.xml.
588 *
589 * @deprecated Since we support so many more networks now, the single
590 * network default network preference can't really express
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800591 * the hierarchy. Instead, the default is defined by the
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800592 * networkAttributes in config.xml. You can determine
Robert Greenwalt4c8b7482012-12-07 09:56:50 -0800593 * the current value by calling {@link #getNetworkPreference()}
Jianzheng Zhoudcf03f32012-11-16 13:45:20 +0800594 * from an App.
595 */
596 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800597 public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
598
Jeff Sharkey625239a2012-09-26 22:03:49 -0700599 /**
Robert Greenwalt9ba9c582014-03-19 17:56:12 -0700600 * @hide
601 */
Robert Greenwalt7569f182014-06-08 16:42:59 -0700602 public final static int REQUEST_ID_UNSET = 0;
603
Paul Jensen5d59e782014-07-11 12:28:19 -0400604 /**
605 * A NetID indicating no Network is selected.
606 * Keep in sync with bionic/libc/dns/include/resolv_netid.h
607 * @hide
608 */
609 public static final int NETID_UNSET = 0;
610
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700611 private final IConnectivityManager mService;
Paul Jensene0bef712014-12-10 15:12:18 -0500612 /**
613 * A kludge to facilitate static access where a Context pointer isn't available, like in the
614 * case of the static set/getProcessDefaultNetwork methods and from the Network class.
615 * TODO: Remove this after deprecating the static methods in favor of non-static methods or
616 * methods that take a Context argument.
617 */
618 private static ConnectivityManager sInstance;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800619
Lorenzo Colittiffc42b02015-07-29 11:41:21 +0900620 private final Context mContext;
621
Dianne Hackborn77b987f2014-02-26 16:20:52 -0800622 private INetworkManagementService mNMService;
Felipe Leme1b103232016-01-22 09:44:57 -0800623 private INetworkPolicyManager mNPManager;
Dianne Hackborn77b987f2014-02-26 16:20:52 -0800624
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800625 /**
626 * Tests if a given integer represents a valid network type.
627 * @param networkType the type to be tested
628 * @return a boolean. {@code true} if the type is valid, else {@code false}
Paul Jensen9e59e122015-05-06 10:42:25 -0400629 * @deprecated All APIs accepting a network type are deprecated. There should be no need to
630 * validate a network type.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800631 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700632 @Deprecated
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700633 public static boolean isNetworkTypeValid(int networkType) {
Robert Greenwalt42acef32009-08-12 16:08:25 -0700634 return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800635 }
636
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800637 /**
638 * Returns a non-localized string representing a given network type.
639 * ONLY used for debugging output.
640 * @param type the type needing naming
641 * @return a String for the given type, or a string version of the type ("87")
642 * if no name is known.
643 * {@hide}
644 */
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700645 public static String getNetworkTypeName(int type) {
646 switch (type) {
647 case TYPE_MOBILE:
648 return "MOBILE";
649 case TYPE_WIFI:
650 return "WIFI";
651 case TYPE_MOBILE_MMS:
652 return "MOBILE_MMS";
653 case TYPE_MOBILE_SUPL:
654 return "MOBILE_SUPL";
655 case TYPE_MOBILE_DUN:
656 return "MOBILE_DUN";
657 case TYPE_MOBILE_HIPRI:
658 return "MOBILE_HIPRI";
659 case TYPE_WIMAX:
660 return "WIMAX";
661 case TYPE_BLUETOOTH:
662 return "BLUETOOTH";
663 case TYPE_DUMMY:
664 return "DUMMY";
665 case TYPE_ETHERNET:
666 return "ETHERNET";
667 case TYPE_MOBILE_FOTA:
668 return "MOBILE_FOTA";
669 case TYPE_MOBILE_IMS:
670 return "MOBILE_IMS";
671 case TYPE_MOBILE_CBS:
672 return "MOBILE_CBS";
repo syncaea743a2011-07-29 23:55:49 -0700673 case TYPE_WIFI_P2P:
674 return "WIFI_P2P";
Wink Saville5e56bc52013-07-29 15:00:57 -0700675 case TYPE_MOBILE_IA:
676 return "MOBILE_IA";
Ram3e0e3bc2014-06-26 11:03:44 -0700677 case TYPE_MOBILE_EMERGENCY:
678 return "MOBILE_EMERGENCY";
Hui Lu1c5624a2014-01-15 11:05:36 -0500679 case TYPE_PROXY:
680 return "PROXY";
Erik Kline37fbfa12014-11-19 17:23:41 +0900681 case TYPE_VPN:
682 return "VPN";
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700683 default:
684 return Integer.toString(type);
685 }
686 }
687
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800688 /**
689 * Checks if a given type uses the cellular data connection.
690 * This should be replaced in the future by a network property.
691 * @param networkType the type to check
692 * @return a boolean - {@code true} if uses cellular network, else {@code false}
693 * {@hide}
694 */
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700695 public static boolean isNetworkTypeMobile(int networkType) {
696 switch (networkType) {
697 case TYPE_MOBILE:
698 case TYPE_MOBILE_MMS:
699 case TYPE_MOBILE_SUPL:
700 case TYPE_MOBILE_DUN:
701 case TYPE_MOBILE_HIPRI:
702 case TYPE_MOBILE_FOTA:
703 case TYPE_MOBILE_IMS:
704 case TYPE_MOBILE_CBS:
Wink Saville5e56bc52013-07-29 15:00:57 -0700705 case TYPE_MOBILE_IA:
Ram3e0e3bc2014-06-26 11:03:44 -0700706 case TYPE_MOBILE_EMERGENCY:
Jeff Sharkeyd2a45872011-05-28 20:56:34 -0700707 return true;
708 default:
709 return false;
710 }
711 }
712
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800713 /**
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700714 * Checks if the given network type is backed by a Wi-Fi radio.
715 *
716 * @hide
717 */
718 public static boolean isNetworkTypeWifi(int networkType) {
719 switch (networkType) {
720 case TYPE_WIFI:
721 case TYPE_WIFI_P2P:
722 return true;
723 default:
724 return false;
725 }
726 }
727
728 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800729 * Specifies the preferred network type. When the device has more
730 * than one type available the preferred network type will be used.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800731 *
732 * @param preference the network type to prefer over all others. It is
733 * unspecified what happens to the old preferred network in the
734 * overall ordering.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -0700735 * @deprecated Functionality has been removed as it no longer makes sense,
736 * with many more than two networks - we'd need an array to express
737 * preference. Instead we use dynamic network properties of
738 * the networks to describe their precedence.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800739 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700740 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800741 public void setNetworkPreference(int preference) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800742 }
743
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800744 /**
745 * Retrieves the current preferred network type.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800746 *
747 * @return an integer representing the preferred network type
748 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -0700749 * @deprecated Functionality has been removed as it no longer makes sense,
750 * with many more than two networks - we'd need an array to express
751 * preference. Instead we use dynamic network properties of
752 * the networks to describe their precedence.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800753 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700754 @Deprecated
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600755 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800756 public int getNetworkPreference() {
Robert Greenwaltd19c41c2014-05-18 23:07:25 -0700757 return TYPE_NONE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800758 }
759
Scott Main671644c2011-10-06 19:02:28 -0700760 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800761 * Returns details about the currently active default data network. When
762 * connected, this network is the default route for outgoing connections.
763 * You should always check {@link NetworkInfo#isConnected()} before initiating
764 * network traffic. This may return {@code null} when there is no default
765 * network.
766 *
767 * @return a {@link NetworkInfo} object for the current default network
Paul Jensen0d719ca2015-02-13 14:18:39 -0500768 * or {@code null} if no default network is currently active
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -0700769 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600770 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800771 public NetworkInfo getActiveNetworkInfo() {
772 try {
773 return mService.getActiveNetworkInfo();
774 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700775 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800776 }
777 }
778
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800779 /**
Paul Jensen31a94f42015-02-13 14:18:39 -0500780 * Returns a {@link Network} object corresponding to the currently active
781 * default data network. In the event that the current active default data
782 * network disconnects, the returned {@code Network} object will no longer
783 * be usable. This will return {@code null} when there is no default
784 * network.
785 *
786 * @return a {@link Network} object for the current default network or
787 * {@code null} if no default network is currently active
Paul Jensen31a94f42015-02-13 14:18:39 -0500788 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600789 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Paul Jensen31a94f42015-02-13 14:18:39 -0500790 public Network getActiveNetwork() {
791 try {
792 return mService.getActiveNetwork();
793 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700794 throw e.rethrowFromSystemServer();
Paul Jensen31a94f42015-02-13 14:18:39 -0500795 }
796 }
797
798 /**
Robin Leed2baf792016-03-24 12:07:00 +0000799 * Returns a {@link Network} object corresponding to the currently active
800 * default data network for a specific UID. In the event that the default data
801 * network disconnects, the returned {@code Network} object will no longer
802 * be usable. This will return {@code null} when there is no default
803 * network for the UID.
Robin Leed2baf792016-03-24 12:07:00 +0000804 *
805 * @return a {@link Network} object for the current default network for the
806 * given UID or {@code null} if no default network is currently active
807 *
808 * @hide
809 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600810 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Robin Leed2baf792016-03-24 12:07:00 +0000811 public Network getActiveNetworkForUid(int uid) {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600812 return getActiveNetworkForUid(uid, false);
813 }
814
815 /** {@hide} */
816 public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) {
Robin Leed2baf792016-03-24 12:07:00 +0000817 try {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600818 return mService.getActiveNetworkForUid(uid, ignoreBlocked);
Robin Leed2baf792016-03-24 12:07:00 +0000819 } catch (RemoteException e) {
820 throw e.rethrowFromSystemServer();
821 }
822 }
823
824 /**
Robin Lee244ce8e2016-01-05 18:03:46 +0000825 * Configures an always-on VPN connection through a specific application.
826 * This connection is automatically granted and persisted after a reboot.
827 *
828 * <p>The designated package should declare a {@link VpnService} in its
829 * manifest guarded by {@link android.Manifest.permission.BIND_VPN_SERVICE},
830 * otherwise the call will fail.
831 *
832 * @param userId The identifier of the user to set an always-on VPN for.
833 * @param vpnPackage The package name for an installed VPN app on the device, or {@code null}
834 * to remove an existing always-on VPN configuration.
Robin Leedc679712016-05-03 13:23:03 +0100835 * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
836 * {@code false} otherwise.
Robin Lee244ce8e2016-01-05 18:03:46 +0000837 * @return {@code true} if the package is set as always-on VPN controller;
838 * {@code false} otherwise.
839 * @hide
840 */
Robin Leedc679712016-05-03 13:23:03 +0100841 public boolean setAlwaysOnVpnPackageForUser(int userId, @Nullable String vpnPackage,
842 boolean lockdownEnabled) {
Robin Lee244ce8e2016-01-05 18:03:46 +0000843 try {
Robin Leedc679712016-05-03 13:23:03 +0100844 return mService.setAlwaysOnVpnPackage(userId, vpnPackage, lockdownEnabled);
Robin Lee244ce8e2016-01-05 18:03:46 +0000845 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700846 throw e.rethrowFromSystemServer();
Robin Lee244ce8e2016-01-05 18:03:46 +0000847 }
848 }
849
850 /**
851 * Returns the package name of the currently set always-on VPN application.
852 * If there is no always-on VPN set, or the VPN is provided by the system instead
853 * of by an app, {@code null} will be returned.
854 *
855 * @return Package name of VPN controller responsible for always-on VPN,
856 * or {@code null} if none is set.
857 * @hide
858 */
859 public String getAlwaysOnVpnPackageForUser(int userId) {
860 try {
861 return mService.getAlwaysOnVpnPackage(userId);
862 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700863 throw e.rethrowFromSystemServer();
Robin Lee244ce8e2016-01-05 18:03:46 +0000864 }
865 }
866
867 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800868 * Returns details about the currently active default data network
869 * for a given uid. This is for internal use only to avoid spying
870 * other apps.
871 *
872 * @return a {@link NetworkInfo} object for the current default network
873 * for the given uid or {@code null} if no default network is
874 * available for the specified uid.
875 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800876 * {@hide}
877 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600878 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700879 public NetworkInfo getActiveNetworkInfoForUid(int uid) {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600880 return getActiveNetworkInfoForUid(uid, false);
881 }
882
883 /** {@hide} */
884 public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700885 try {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600886 return mService.getActiveNetworkInfoForUid(uid, ignoreBlocked);
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700887 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700888 throw e.rethrowFromSystemServer();
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700889 }
890 }
891
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800892 /**
893 * Returns connection status information about a particular
894 * network type.
895 *
896 * @param networkType integer specifying which networkType in
897 * which you're interested.
898 * @return a {@link NetworkInfo} object for the requested
899 * network type or {@code null} if the type is not
900 * supported by the device.
901 *
Paul Jensen3541e9f2015-03-18 12:23:02 -0400902 * @deprecated This method does not support multiple connected networks
903 * of the same type. Use {@link #getAllNetworks} and
904 * {@link #getNetworkInfo(android.net.Network)} instead.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800905 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700906 @Deprecated
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600907 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800908 public NetworkInfo getNetworkInfo(int networkType) {
909 try {
910 return mService.getNetworkInfo(networkType);
911 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700912 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800913 }
914 }
915
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800916 /**
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700917 * Returns connection status information about a particular
918 * Network.
919 *
920 * @param network {@link Network} specifying which network
921 * in which you're interested.
922 * @return a {@link NetworkInfo} object for the requested
923 * network or {@code null} if the {@code Network}
924 * is not valid.
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700925 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600926 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700927 public NetworkInfo getNetworkInfo(Network network) {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600928 return getNetworkInfoForUid(network, Process.myUid(), false);
929 }
930
931 /** {@hide} */
932 public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) {
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700933 try {
Jeff Sharkey1b6519b2016-04-28 15:33:18 -0600934 return mService.getNetworkInfoForUid(network, uid, ignoreBlocked);
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700935 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700936 throw e.rethrowFromSystemServer();
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700937 }
938 }
939
940 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800941 * Returns connection status information about all network
942 * types supported by the device.
943 *
944 * @return an array of {@link NetworkInfo} objects. Check each
945 * {@link NetworkInfo#getType} for which type each applies.
946 *
Paul Jensen3541e9f2015-03-18 12:23:02 -0400947 * @deprecated This method does not support multiple connected networks
948 * of the same type. Use {@link #getAllNetworks} and
949 * {@link #getNetworkInfo(android.net.Network)} instead.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800950 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700951 @Deprecated
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600952 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800953 public NetworkInfo[] getAllNetworkInfo() {
954 try {
955 return mService.getAllNetworkInfo();
956 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700957 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800958 }
959 }
960
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -0800961 /**
Lorenzo Colittib57edc52014-08-22 17:10:50 -0700962 * Returns the {@link Network} object currently serving a given type, or
963 * null if the given type is not connected.
964 *
Lorenzo Colittib57edc52014-08-22 17:10:50 -0700965 * @hide
Paul Jensen3541e9f2015-03-18 12:23:02 -0400966 * @deprecated This method does not support multiple connected networks
967 * of the same type. Use {@link #getAllNetworks} and
968 * {@link #getNetworkInfo(android.net.Network)} instead.
Lorenzo Colittib57edc52014-08-22 17:10:50 -0700969 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700970 @Deprecated
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600971 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Lorenzo Colittib57edc52014-08-22 17:10:50 -0700972 public Network getNetworkForType(int networkType) {
973 try {
974 return mService.getNetworkForType(networkType);
975 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700976 throw e.rethrowFromSystemServer();
Lorenzo Colittib57edc52014-08-22 17:10:50 -0700977 }
978 }
979
980 /**
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700981 * Returns an array of all {@link Network} currently tracked by the
982 * framework.
Paul Jensenb2748922015-05-06 11:10:18 -0400983 *
984 * @return an array of {@link Network} objects.
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700985 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -0600986 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700987 public Network[] getAllNetworks() {
988 try {
989 return mService.getAllNetworks();
990 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -0700991 throw e.rethrowFromSystemServer();
Robert Greenwalt73b6cbae2014-06-23 11:40:00 -0700992 }
993 }
994
995 /**
Lorenzo Colittie285b432015-04-23 15:32:42 +0900996 * Returns an array of {@link android.net.NetworkCapabilities} objects, representing
Lorenzo Colitti403aa262014-11-28 11:21:30 +0900997 * the Networks that applications run by the given user will use by default.
998 * @hide
999 */
1000 public NetworkCapabilities[] getDefaultNetworkCapabilitiesForUser(int userId) {
1001 try {
1002 return mService.getDefaultNetworkCapabilitiesForUser(userId);
1003 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001004 throw e.rethrowFromSystemServer();
Lorenzo Colitti403aa262014-11-28 11:21:30 +09001005 }
1006 }
1007
1008 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001009 * Returns the IP information for the current default network.
1010 *
1011 * @return a {@link LinkProperties} object describing the IP info
1012 * for the current default network, or {@code null} if there
1013 * is no current default network.
1014 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001015 * {@hide}
1016 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001017 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwaltd192dad2010-09-14 09:18:02 -07001018 public LinkProperties getActiveLinkProperties() {
1019 try {
1020 return mService.getActiveLinkProperties();
1021 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001022 throw e.rethrowFromSystemServer();
Robert Greenwaltd192dad2010-09-14 09:18:02 -07001023 }
1024 }
1025
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001026 /**
1027 * Returns the IP information for a given network type.
1028 *
1029 * @param networkType the network type of interest.
1030 * @return a {@link LinkProperties} object describing the IP info
1031 * for the given networkType, or {@code null} if there is
1032 * no current default network.
1033 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001034 * {@hide}
Paul Jensen3541e9f2015-03-18 12:23:02 -04001035 * @deprecated This method does not support multiple connected networks
1036 * of the same type. Use {@link #getAllNetworks},
1037 * {@link #getNetworkInfo(android.net.Network)}, and
1038 * {@link #getLinkProperties(android.net.Network)} instead.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001039 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001040 @Deprecated
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001041 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwaltd192dad2010-09-14 09:18:02 -07001042 public LinkProperties getLinkProperties(int networkType) {
1043 try {
Robert Greenwalt9258c642014-03-26 16:47:06 -07001044 return mService.getLinkPropertiesForType(networkType);
1045 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001046 throw e.rethrowFromSystemServer();
Robert Greenwalt9258c642014-03-26 16:47:06 -07001047 }
1048 }
1049
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001050 /**
1051 * Get the {@link LinkProperties} for the given {@link Network}. This
1052 * will return {@code null} if the network is unknown.
1053 *
1054 * @param network The {@link Network} object identifying the network in question.
1055 * @return The {@link LinkProperties} for the network, or {@code null}.
Paul Jensenb2748922015-05-06 11:10:18 -04001056 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001057 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt9258c642014-03-26 16:47:06 -07001058 public LinkProperties getLinkProperties(Network network) {
1059 try {
1060 return mService.getLinkProperties(network);
1061 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001062 throw e.rethrowFromSystemServer();
Robert Greenwalt9258c642014-03-26 16:47:06 -07001063 }
1064 }
1065
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001066 /**
Lorenzo Colittie285b432015-04-23 15:32:42 +09001067 * Get the {@link android.net.NetworkCapabilities} for the given {@link Network}. This
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001068 * will return {@code null} if the network is unknown.
1069 *
1070 * @param network The {@link Network} object identifying the network in question.
Lorenzo Colittie285b432015-04-23 15:32:42 +09001071 * @return The {@link android.net.NetworkCapabilities} for the network, or {@code null}.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001072 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001073 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt9258c642014-03-26 16:47:06 -07001074 public NetworkCapabilities getNetworkCapabilities(Network network) {
1075 try {
1076 return mService.getNetworkCapabilities(network);
Robert Greenwaltd192dad2010-09-14 09:18:02 -07001077 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001078 throw e.rethrowFromSystemServer();
Robert Greenwaltd192dad2010-09-14 09:18:02 -07001079 }
1080 }
1081
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001082 /**
Udam Sainib7c24872016-01-04 12:16:14 -08001083 * Gets the URL that should be used for resolving whether a captive portal is present.
1084 * 1. This URL should respond with a 204 response to a GET request to indicate no captive
1085 * portal is present.
1086 * 2. This URL must be HTTP as redirect responses are used to find captive portal
1087 * sign-in pages. Captive portals cannot respond to HTTPS requests with redirects.
1088 *
1089 * @hide
1090 */
1091 @SystemApi
1092 public String getCaptivePortalServerUrl() {
1093 try {
1094 return mService.getCaptivePortalServerUrl();
1095 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001096 throw e.rethrowFromSystemServer();
Udam Sainib7c24872016-01-04 12:16:14 -08001097 }
1098 }
1099
1100 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001101 * Tells the underlying networking system that the caller wants to
1102 * begin using the named feature. The interpretation of {@code feature}
1103 * is completely up to each networking implementation.
Lorenzo Colittid5427052015-10-15 16:29:00 +09001104 *
1105 * <p>This method requires the caller to hold either the
1106 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
1107 * or the ability to modify system settings as determined by
1108 * {@link android.provider.Settings.System#canWrite}.</p>
1109 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001110 * @param networkType specifies which network the request pertains to
1111 * @param feature the name of the feature to be used
1112 * @return an integer value representing the outcome of the request.
1113 * The interpretation of this value is specific to each networking
1114 * implementation+feature combination, except that the value {@code -1}
1115 * always indicates failure.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001116 *
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +09001117 * @deprecated Deprecated in favor of the cleaner
1118 * {@link #requestNetwork(NetworkRequest, NetworkCallback)} API.
Dianne Hackborn692a2442015-07-31 10:35:34 -07001119 * In {@link VERSION_CODES#M}, and above, this method is unsupported and will
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001120 * throw {@code UnsupportedOperationException} if called.
Lorenzo Colitti2187df72016-12-09 18:39:30 +09001121 * @removed
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001122 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001123 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001124 public int startUsingNetworkFeature(int networkType, String feature) {
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001125 checkLegacyRoutingApiAccess();
Robert Greenwalt562cc542014-05-15 18:07:26 -07001126 NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature);
1127 if (netCap == null) {
1128 Log.d(TAG, "Can't satisfy startUsingNetworkFeature for " + networkType + ", " +
1129 feature);
1130 return PhoneConstants.APN_REQUEST_FAILED;
1131 }
1132
1133 NetworkRequest request = null;
1134 synchronized (sLegacyRequests) {
1135 LegacyRequest l = sLegacyRequests.get(netCap);
1136 if (l != null) {
1137 Log.d(TAG, "renewing startUsingNetworkFeature request " + l.networkRequest);
1138 renewRequestLocked(l);
1139 if (l.currentNetwork != null) {
1140 return PhoneConstants.APN_ALREADY_ACTIVE;
1141 } else {
1142 return PhoneConstants.APN_REQUEST_STARTED;
1143 }
1144 }
1145
1146 request = requestNetworkForFeatureLocked(netCap);
1147 }
1148 if (request != null) {
Robert Greenwalt257ee5f2014-06-20 10:58:45 -07001149 Log.d(TAG, "starting startUsingNetworkFeature for request " + request);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001150 return PhoneConstants.APN_REQUEST_STARTED;
1151 } else {
1152 Log.d(TAG, " request Failed");
1153 return PhoneConstants.APN_REQUEST_FAILED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001154 }
1155 }
1156
1157 /**
1158 * Tells the underlying networking system that the caller is finished
1159 * using the named feature. The interpretation of {@code feature}
1160 * is completely up to each networking implementation.
Lorenzo Colittid5427052015-10-15 16:29:00 +09001161 *
1162 * <p>This method requires the caller to hold either the
1163 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
1164 * or the ability to modify system settings as determined by
1165 * {@link android.provider.Settings.System#canWrite}.</p>
1166 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001167 * @param networkType specifies which network the request pertains to
1168 * @param feature the name of the feature that is no longer needed
1169 * @return an integer value representing the outcome of the request.
1170 * The interpretation of this value is specific to each networking
1171 * implementation+feature combination, except that the value {@code -1}
1172 * always indicates failure.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001173 *
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09001174 * @deprecated Deprecated in favor of the cleaner
1175 * {@link #unregisterNetworkCallback(NetworkCallback)} API.
Dianne Hackborn692a2442015-07-31 10:35:34 -07001176 * In {@link VERSION_CODES#M}, and above, this method is unsupported and will
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001177 * throw {@code UnsupportedOperationException} if called.
Lorenzo Colitti2187df72016-12-09 18:39:30 +09001178 * @removed
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001179 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001180 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001181 public int stopUsingNetworkFeature(int networkType, String feature) {
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001182 checkLegacyRoutingApiAccess();
Robert Greenwalt562cc542014-05-15 18:07:26 -07001183 NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature);
1184 if (netCap == null) {
1185 Log.d(TAG, "Can't satisfy stopUsingNetworkFeature for " + networkType + ", " +
1186 feature);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001187 return -1;
1188 }
Robert Greenwalt562cc542014-05-15 18:07:26 -07001189
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001190 if (removeRequestForFeature(netCap)) {
Robert Greenwalt562cc542014-05-15 18:07:26 -07001191 Log.d(TAG, "stopUsingNetworkFeature for " + networkType + ", " + feature);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001192 }
1193 return 1;
1194 }
1195
1196 private NetworkCapabilities networkCapabilitiesForFeature(int networkType, String feature) {
1197 if (networkType == TYPE_MOBILE) {
Erik Kline35bf06c2017-01-26 18:08:28 +09001198 switch (feature) {
1199 case "enableCBS":
1200 return networkCapabilitiesForType(TYPE_MOBILE_CBS);
1201 case "enableDUN":
1202 case "enableDUNAlways":
1203 return networkCapabilitiesForType(TYPE_MOBILE_DUN);
1204 case "enableFOTA":
1205 return networkCapabilitiesForType(TYPE_MOBILE_FOTA);
1206 case "enableHIPRI":
1207 return networkCapabilitiesForType(TYPE_MOBILE_HIPRI);
1208 case "enableIMS":
1209 return networkCapabilitiesForType(TYPE_MOBILE_IMS);
1210 case "enableMMS":
1211 return networkCapabilitiesForType(TYPE_MOBILE_MMS);
1212 case "enableSUPL":
1213 return networkCapabilitiesForType(TYPE_MOBILE_SUPL);
1214 default:
1215 return null;
Robert Greenwalt562cc542014-05-15 18:07:26 -07001216 }
Erik Kline35bf06c2017-01-26 18:08:28 +09001217 } else if (networkType == TYPE_WIFI && "p2p".equals(feature)) {
1218 return networkCapabilitiesForType(TYPE_WIFI_P2P);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001219 }
1220 return null;
1221 }
1222
Robert Greenwalt06314e42014-10-29 14:04:06 -07001223 /**
1224 * Guess what the network request was trying to say so that the resulting
1225 * network is accessible via the legacy (deprecated) API such as
1226 * requestRouteToHost.
Lorenzo Colittidef4cb02015-11-25 20:28:50 +09001227 *
1228 * This means we should try to be fairly precise about transport and
Robert Greenwalt06314e42014-10-29 14:04:06 -07001229 * capability but ignore things such as networkSpecifier.
1230 * If the request has more than one transport or capability it doesn't
1231 * match the old legacy requests (they selected only single transport/capability)
1232 * so this function cannot map the request to a single legacy type and
1233 * the resulting network will not be available to the legacy APIs.
1234 *
Lorenzo Colittidef4cb02015-11-25 20:28:50 +09001235 * This code is only called from the requestNetwork API (L and above).
1236 *
1237 * Setting a legacy type causes CONNECTIVITY_ACTION broadcasts, which are expensive
1238 * because they wake up lots of apps - see http://b/23350688 . So we currently only
1239 * do this for SUPL requests, which are the only ones that we know need it. If
1240 * omitting these broadcasts causes unacceptable app breakage, then for backwards
1241 * compatibility we can send them:
1242 *
1243 * if (targetSdkVersion < Build.VERSION_CODES.M) && // legacy API unsupported >= M
1244 * targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP)) // requestNetwork not present < L
1245 *
Robert Greenwalt06314e42014-10-29 14:04:06 -07001246 * TODO - This should be removed when the legacy APIs are removed.
1247 */
Ye Wenb87875e2014-07-21 14:19:01 -07001248 private int inferLegacyTypeForNetworkCapabilities(NetworkCapabilities netCap) {
1249 if (netCap == null) {
1250 return TYPE_NONE;
1251 }
Robert Greenwalt06314e42014-10-29 14:04:06 -07001252
Ye Wenb87875e2014-07-21 14:19:01 -07001253 if (!netCap.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
1254 return TYPE_NONE;
1255 }
Robert Greenwalt06314e42014-10-29 14:04:06 -07001256
Lifu Tang30f95a72016-01-07 23:20:38 -08001257 // Do this only for SUPL, until GnssLocationProvider is fixed. http://b/25876485 .
Lorenzo Colittidef4cb02015-11-25 20:28:50 +09001258 if (!netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) {
1259 // NOTE: if this causes app breakage, we should not just comment out this early return;
1260 // instead, we should make this early return conditional on the requesting app's target
1261 // SDK version, as described in the comment above.
1262 return TYPE_NONE;
1263 }
1264
Robert Greenwalt06314e42014-10-29 14:04:06 -07001265 String type = null;
1266 int result = TYPE_NONE;
1267
Ye Wenb87875e2014-07-21 14:19:01 -07001268 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) {
Robert Greenwalt06314e42014-10-29 14:04:06 -07001269 type = "enableCBS";
1270 result = TYPE_MOBILE_CBS;
1271 } else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
1272 type = "enableIMS";
1273 result = TYPE_MOBILE_IMS;
1274 } else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) {
1275 type = "enableFOTA";
1276 result = TYPE_MOBILE_FOTA;
1277 } else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
1278 type = "enableDUN";
1279 result = TYPE_MOBILE_DUN;
1280 } else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) {
Lorenzo Colittidef4cb02015-11-25 20:28:50 +09001281 type = "enableSUPL";
Robert Greenwalt06314e42014-10-29 14:04:06 -07001282 result = TYPE_MOBILE_SUPL;
Robert Greenwalt74ab4fa2015-08-28 12:37:54 -07001283 // back out this hack for mms as they no longer need this and it's causing
1284 // device slowdowns - b/23350688 (note, supl still needs this)
1285 //} else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) {
1286 // type = "enableMMS";
1287 // result = TYPE_MOBILE_MMS;
Robert Greenwalt06314e42014-10-29 14:04:06 -07001288 } else if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
1289 type = "enableHIPRI";
1290 result = TYPE_MOBILE_HIPRI;
Ye Wenb87875e2014-07-21 14:19:01 -07001291 }
Robert Greenwalt06314e42014-10-29 14:04:06 -07001292 if (type != null) {
1293 NetworkCapabilities testCap = networkCapabilitiesForFeature(TYPE_MOBILE, type);
1294 if (testCap.equalsNetCapabilities(netCap) && testCap.equalsTransportTypes(netCap)) {
1295 return result;
Ye Wenb87875e2014-07-21 14:19:01 -07001296 }
1297 }
1298 return TYPE_NONE;
1299 }
1300
Robert Greenwalt32aa65a2014-06-02 15:32:02 -07001301 private int legacyTypeForNetworkCapabilities(NetworkCapabilities netCap) {
Robert Greenwalt562cc542014-05-15 18:07:26 -07001302 if (netCap == null) return TYPE_NONE;
1303 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) {
1304 return TYPE_MOBILE_CBS;
1305 }
1306 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
1307 return TYPE_MOBILE_IMS;
1308 }
1309 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) {
1310 return TYPE_MOBILE_FOTA;
1311 }
1312 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
1313 return TYPE_MOBILE_DUN;
1314 }
1315 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) {
1316 return TYPE_MOBILE_SUPL;
1317 }
1318 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) {
1319 return TYPE_MOBILE_MMS;
1320 }
1321 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
1322 return TYPE_MOBILE_HIPRI;
1323 }
Robert Greenwalt32aa65a2014-06-02 15:32:02 -07001324 if (netCap.hasCapability(NetworkCapabilities.NET_CAPABILITY_WIFI_P2P)) {
1325 return TYPE_WIFI_P2P;
1326 }
Robert Greenwalt562cc542014-05-15 18:07:26 -07001327 return TYPE_NONE;
1328 }
1329
1330 private static class LegacyRequest {
1331 NetworkCapabilities networkCapabilities;
1332 NetworkRequest networkRequest;
1333 int expireSequenceNumber;
1334 Network currentNetwork;
1335 int delay = -1;
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001336
1337 private void clearDnsBinding() {
1338 if (currentNetwork != null) {
1339 currentNetwork = null;
1340 setProcessDefaultNetworkForHostResolution(null);
1341 }
1342 }
1343
Robert Greenwalt6078b502014-06-11 16:05:07 -07001344 NetworkCallback networkCallback = new NetworkCallback() {
Robert Greenwalt562cc542014-05-15 18:07:26 -07001345 @Override
Robert Greenwalt6078b502014-06-11 16:05:07 -07001346 public void onAvailable(Network network) {
Robert Greenwalt562cc542014-05-15 18:07:26 -07001347 currentNetwork = network;
1348 Log.d(TAG, "startUsingNetworkFeature got Network:" + network);
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04001349 setProcessDefaultNetworkForHostResolution(network);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001350 }
1351 @Override
Robert Greenwalt6078b502014-06-11 16:05:07 -07001352 public void onLost(Network network) {
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001353 if (network.equals(currentNetwork)) clearDnsBinding();
Robert Greenwalt562cc542014-05-15 18:07:26 -07001354 Log.d(TAG, "startUsingNetworkFeature lost Network:" + network);
1355 }
1356 };
1357 }
1358
Robert Greenwaltfab501672014-07-23 11:44:01 -07001359 private static HashMap<NetworkCapabilities, LegacyRequest> sLegacyRequests =
Robert Greenwalt562cc542014-05-15 18:07:26 -07001360 new HashMap<NetworkCapabilities, LegacyRequest>();
1361
1362 private NetworkRequest findRequestForFeature(NetworkCapabilities netCap) {
1363 synchronized (sLegacyRequests) {
1364 LegacyRequest l = sLegacyRequests.get(netCap);
1365 if (l != null) return l.networkRequest;
1366 }
1367 return null;
1368 }
1369
1370 private void renewRequestLocked(LegacyRequest l) {
1371 l.expireSequenceNumber++;
1372 Log.d(TAG, "renewing request to seqNum " + l.expireSequenceNumber);
1373 sendExpireMsgForFeature(l.networkCapabilities, l.expireSequenceNumber, l.delay);
1374 }
1375
1376 private void expireRequest(NetworkCapabilities netCap, int sequenceNum) {
1377 int ourSeqNum = -1;
1378 synchronized (sLegacyRequests) {
1379 LegacyRequest l = sLegacyRequests.get(netCap);
1380 if (l == null) return;
1381 ourSeqNum = l.expireSequenceNumber;
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001382 if (l.expireSequenceNumber == sequenceNum) removeRequestForFeature(netCap);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001383 }
1384 Log.d(TAG, "expireRequest with " + ourSeqNum + ", " + sequenceNum);
1385 }
1386
1387 private NetworkRequest requestNetworkForFeatureLocked(NetworkCapabilities netCap) {
1388 int delay = -1;
Robert Greenwalt32aa65a2014-06-02 15:32:02 -07001389 int type = legacyTypeForNetworkCapabilities(netCap);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001390 try {
1391 delay = mService.getRestoreDefaultNetworkDelay(type);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001392 } catch (RemoteException e) {
1393 throw e.rethrowFromSystemServer();
1394 }
Robert Greenwalt562cc542014-05-15 18:07:26 -07001395 LegacyRequest l = new LegacyRequest();
1396 l.networkCapabilities = netCap;
1397 l.delay = delay;
1398 l.expireSequenceNumber = 0;
Hugo Benichi2583ef02017-02-02 17:02:36 +09001399 l.networkRequest = sendRequestForNetwork(
1400 netCap, l.networkCallback, 0, REQUEST, type, getDefaultHandler());
Robert Greenwalt562cc542014-05-15 18:07:26 -07001401 if (l.networkRequest == null) return null;
1402 sLegacyRequests.put(netCap, l);
1403 sendExpireMsgForFeature(netCap, l.expireSequenceNumber, delay);
1404 return l.networkRequest;
1405 }
1406
1407 private void sendExpireMsgForFeature(NetworkCapabilities netCap, int seqNum, int delay) {
1408 if (delay >= 0) {
1409 Log.d(TAG, "sending expire msg with seqNum " + seqNum + " and delay " + delay);
Hugo Benichi2583ef02017-02-02 17:02:36 +09001410 CallbackHandler handler = getDefaultHandler();
Hugo Benichi6f260f32017-02-03 14:18:44 +09001411 Message msg = handler.obtainMessage(EXPIRE_LEGACY_REQUEST, seqNum, 0, netCap);
1412 handler.sendMessageDelayed(msg, delay);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001413 }
1414 }
1415
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001416 private boolean removeRequestForFeature(NetworkCapabilities netCap) {
1417 final LegacyRequest l;
Robert Greenwalt562cc542014-05-15 18:07:26 -07001418 synchronized (sLegacyRequests) {
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001419 l = sLegacyRequests.remove(netCap);
Robert Greenwalt562cc542014-05-15 18:07:26 -07001420 }
Paul Jensen9ffb53c2014-12-17 10:39:34 -05001421 if (l == null) return false;
1422 unregisterNetworkCallback(l.networkCallback);
1423 l.clearDnsBinding();
1424 return true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001425 }
1426
Erik Kline35bf06c2017-01-26 18:08:28 +09001427 private static final SparseIntArray sLegacyTypeToTransport = new SparseIntArray();
1428 static {
1429 sLegacyTypeToTransport.put(TYPE_MOBILE, NetworkCapabilities.TRANSPORT_CELLULAR);
1430 sLegacyTypeToTransport.put(TYPE_MOBILE_CBS, NetworkCapabilities.TRANSPORT_CELLULAR);
1431 sLegacyTypeToTransport.put(TYPE_MOBILE_DUN, NetworkCapabilities.TRANSPORT_CELLULAR);
1432 sLegacyTypeToTransport.put(TYPE_MOBILE_FOTA, NetworkCapabilities.TRANSPORT_CELLULAR);
1433 sLegacyTypeToTransport.put(TYPE_MOBILE_HIPRI, NetworkCapabilities.TRANSPORT_CELLULAR);
1434 sLegacyTypeToTransport.put(TYPE_MOBILE_IMS, NetworkCapabilities.TRANSPORT_CELLULAR);
1435 sLegacyTypeToTransport.put(TYPE_MOBILE_MMS, NetworkCapabilities.TRANSPORT_CELLULAR);
1436 sLegacyTypeToTransport.put(TYPE_MOBILE_SUPL, NetworkCapabilities.TRANSPORT_CELLULAR);
1437 sLegacyTypeToTransport.put(TYPE_WIFI, NetworkCapabilities.TRANSPORT_WIFI);
1438 sLegacyTypeToTransport.put(TYPE_WIFI_P2P, NetworkCapabilities.TRANSPORT_WIFI);
1439 sLegacyTypeToTransport.put(TYPE_BLUETOOTH, NetworkCapabilities.TRANSPORT_BLUETOOTH);
1440 sLegacyTypeToTransport.put(TYPE_ETHERNET, NetworkCapabilities.TRANSPORT_ETHERNET);
1441 }
1442
1443 private static final SparseIntArray sLegacyTypeToCapability = new SparseIntArray();
1444 static {
1445 sLegacyTypeToCapability.put(TYPE_MOBILE_CBS, NetworkCapabilities.NET_CAPABILITY_CBS);
1446 sLegacyTypeToCapability.put(TYPE_MOBILE_DUN, NetworkCapabilities.NET_CAPABILITY_DUN);
1447 sLegacyTypeToCapability.put(TYPE_MOBILE_FOTA, NetworkCapabilities.NET_CAPABILITY_FOTA);
1448 sLegacyTypeToCapability.put(TYPE_MOBILE_IMS, NetworkCapabilities.NET_CAPABILITY_IMS);
1449 sLegacyTypeToCapability.put(TYPE_MOBILE_MMS, NetworkCapabilities.NET_CAPABILITY_MMS);
1450 sLegacyTypeToCapability.put(TYPE_MOBILE_SUPL, NetworkCapabilities.NET_CAPABILITY_SUPL);
1451 sLegacyTypeToCapability.put(TYPE_WIFI_P2P, NetworkCapabilities.NET_CAPABILITY_WIFI_P2P);
1452 }
1453
1454 /**
1455 * Given a legacy type (TYPE_WIFI, ...) returns a NetworkCapabilities
1456 * instance suitable for registering a request or callback. Throws an
1457 * IllegalArgumentException if no mapping from the legacy type to
1458 * NetworkCapabilities is known.
1459 *
1460 * @hide
1461 */
1462 public static NetworkCapabilities networkCapabilitiesForType(int type) {
1463 final NetworkCapabilities nc = new NetworkCapabilities();
1464
1465 // Map from type to transports.
1466 final int NOT_FOUND = -1;
1467 final int transport = sLegacyTypeToTransport.get(type, NOT_FOUND);
1468 if (transport == NOT_FOUND) {
1469 throw new IllegalArgumentException("unknown legacy type: " + type);
1470 }
1471 nc.addTransportType(transport);
1472
1473 // Map from type to capabilities.
1474 nc.addCapability(sLegacyTypeToCapability.get(
1475 type, NetworkCapabilities.NET_CAPABILITY_INTERNET));
1476 nc.maybeMarkCapabilitiesRestricted();
1477 return nc;
1478 }
1479
Lorenzo Colitti8bf977d2015-06-15 14:29:22 +09001480 /** @hide */
1481 public static class PacketKeepaliveCallback {
1482 /** The requested keepalive was successfully started. */
1483 public void onStarted() {}
1484 /** The keepalive was successfully stopped. */
1485 public void onStopped() {}
1486 /** An error occurred. */
1487 public void onError(int error) {}
1488 }
1489
1490 /**
1491 * Allows applications to request that the system periodically send specific packets on their
1492 * behalf, using hardware offload to save battery power.
1493 *
1494 * To request that the system send keepalives, call one of the methods that return a
1495 * {@link ConnectivityManager.PacketKeepalive} object, such as {@link #startNattKeepalive},
1496 * passing in a non-null callback. If the callback is successfully started, the callback's
1497 * {@code onStarted} method will be called. If an error occurs, {@code onError} will be called,
1498 * specifying one of the {@code ERROR_*} constants in this class.
1499 *
1500 * To stop an existing keepalive, call {@link stop}. The system will call {@code onStopped} if
1501 * the operation was successfull or {@code onError} if an error occurred.
1502 *
1503 * @hide
1504 */
1505 public class PacketKeepalive {
1506
1507 private static final String TAG = "PacketKeepalive";
1508
1509 /** @hide */
1510 public static final int SUCCESS = 0;
1511
1512 /** @hide */
1513 public static final int NO_KEEPALIVE = -1;
1514
1515 /** @hide */
1516 public static final int BINDER_DIED = -10;
1517
1518 /** The specified {@code Network} is not connected. */
1519 public static final int ERROR_INVALID_NETWORK = -20;
1520 /** The specified IP addresses are invalid. For example, the specified source IP address is
1521 * not configured on the specified {@code Network}. */
1522 public static final int ERROR_INVALID_IP_ADDRESS = -21;
1523 /** The requested port is invalid. */
1524 public static final int ERROR_INVALID_PORT = -22;
1525 /** The packet length is invalid (e.g., too long). */
1526 public static final int ERROR_INVALID_LENGTH = -23;
1527 /** The packet transmission interval is invalid (e.g., too short). */
1528 public static final int ERROR_INVALID_INTERVAL = -24;
1529
1530 /** The hardware does not support this request. */
1531 public static final int ERROR_HARDWARE_UNSUPPORTED = -30;
Lorenzo Colitti9d1284e2015-09-08 16:46:36 +09001532 /** The hardware returned an error. */
1533 public static final int ERROR_HARDWARE_ERROR = -31;
Lorenzo Colitti8bf977d2015-06-15 14:29:22 +09001534
1535 public static final int NATT_PORT = 4500;
1536
1537 private final Network mNetwork;
1538 private final PacketKeepaliveCallback mCallback;
1539 private final Looper mLooper;
1540 private final Messenger mMessenger;
1541
1542 private volatile Integer mSlot;
1543
1544 void stopLooper() {
1545 mLooper.quit();
1546 }
1547
1548 public void stop() {
1549 try {
1550 mService.stopKeepalive(mNetwork, mSlot);
1551 } catch (RemoteException e) {
1552 Log.e(TAG, "Error stopping packet keepalive: ", e);
1553 stopLooper();
1554 }
1555 }
1556
1557 private PacketKeepalive(Network network, PacketKeepaliveCallback callback) {
1558 checkNotNull(network, "network cannot be null");
1559 checkNotNull(callback, "callback cannot be null");
1560 mNetwork = network;
1561 mCallback = callback;
1562 HandlerThread thread = new HandlerThread(TAG);
1563 thread.start();
1564 mLooper = thread.getLooper();
1565 mMessenger = new Messenger(new Handler(mLooper) {
1566 @Override
1567 public void handleMessage(Message message) {
1568 switch (message.what) {
1569 case NetworkAgent.EVENT_PACKET_KEEPALIVE:
1570 int error = message.arg2;
1571 try {
1572 if (error == SUCCESS) {
1573 if (mSlot == null) {
1574 mSlot = message.arg1;
1575 mCallback.onStarted();
1576 } else {
1577 mSlot = null;
1578 stopLooper();
1579 mCallback.onStopped();
1580 }
1581 } else {
1582 stopLooper();
1583 mCallback.onError(error);
1584 }
1585 } catch (Exception e) {
1586 Log.e(TAG, "Exception in keepalive callback(" + error + ")", e);
1587 }
1588 break;
1589 default:
1590 Log.e(TAG, "Unhandled message " + Integer.toHexString(message.what));
1591 break;
1592 }
1593 }
1594 });
1595 }
1596 }
1597
1598 /**
1599 * Starts an IPsec NAT-T keepalive packet with the specified parameters.
1600 *
1601 * @hide
1602 */
1603 public PacketKeepalive startNattKeepalive(
1604 Network network, int intervalSeconds, PacketKeepaliveCallback callback,
1605 InetAddress srcAddr, int srcPort, InetAddress dstAddr) {
1606 final PacketKeepalive k = new PacketKeepalive(network, callback);
1607 try {
1608 mService.startNattKeepalive(network, intervalSeconds, k.mMessenger, new Binder(),
1609 srcAddr.getHostAddress(), srcPort, dstAddr.getHostAddress());
1610 } catch (RemoteException e) {
1611 Log.e(TAG, "Error starting packet keepalive: ", e);
1612 k.stopLooper();
1613 return null;
1614 }
1615 return k;
1616 }
1617
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001618 /**
1619 * Ensure that a network route exists to deliver traffic to the specified
1620 * host via the specified network interface. An attempt to add a route that
1621 * already exists is ignored, but treated as successful.
Lorenzo Colittid5427052015-10-15 16:29:00 +09001622 *
1623 * <p>This method requires the caller to hold either the
1624 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
1625 * or the ability to modify system settings as determined by
1626 * {@link android.provider.Settings.System#canWrite}.</p>
1627 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001628 * @param networkType the type of the network over which traffic to the specified
1629 * host is to be routed
1630 * @param hostAddress the IP address of the host to which the route is desired
1631 * @return {@code true} on success, {@code false} on failure
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001632 *
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +09001633 * @deprecated Deprecated in favor of the
1634 * {@link #requestNetwork(NetworkRequest, NetworkCallback)},
1635 * {@link #bindProcessToNetwork} and {@link Network#getSocketFactory} API.
Dianne Hackborn692a2442015-07-31 10:35:34 -07001636 * In {@link VERSION_CODES#M}, and above, this method is unsupported and will
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001637 * throw {@code UnsupportedOperationException} if called.
Lorenzo Colitti2187df72016-12-09 18:39:30 +09001638 * @removed
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001639 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001640 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001641 public boolean requestRouteToHost(int networkType, int hostAddress) {
Sreeram Ramachandran03666c72014-07-19 23:21:46 -07001642 return requestRouteToHostAddress(networkType, NetworkUtils.intToInetAddress(hostAddress));
Robert Greenwalt585ac0f2010-08-27 09:24:29 -07001643 }
1644
1645 /**
1646 * Ensure that a network route exists to deliver traffic to the specified
1647 * host via the specified network interface. An attempt to add a route that
1648 * already exists is ignored, but treated as successful.
Lorenzo Colittid5427052015-10-15 16:29:00 +09001649 *
1650 * <p>This method requires the caller to hold either the
1651 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
1652 * or the ability to modify system settings as determined by
1653 * {@link android.provider.Settings.System#canWrite}.</p>
1654 *
Robert Greenwalt585ac0f2010-08-27 09:24:29 -07001655 * @param networkType the type of the network over which traffic to the specified
1656 * host is to be routed
1657 * @param hostAddress the IP address of the host to which the route is desired
1658 * @return {@code true} on success, {@code false} on failure
1659 * @hide
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07001660 * @deprecated Deprecated in favor of the {@link #requestNetwork} and
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +09001661 * {@link #bindProcessToNetwork} API.
Robert Greenwalt585ac0f2010-08-27 09:24:29 -07001662 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001663 @Deprecated
Robert Greenwalt585ac0f2010-08-27 09:24:29 -07001664 public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001665 checkLegacyRoutingApiAccess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001666 try {
Sreeram Ramachandran03666c72014-07-19 23:21:46 -07001667 return mService.requestRouteToHostAddress(networkType, hostAddress.getAddress());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001668 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001669 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001670 }
1671 }
1672
1673 /**
1674 * Returns the value of the setting for background data usage. If false,
1675 * applications should not use the network if the application is not in the
1676 * foreground. Developers should respect this setting, and check the value
1677 * of this before performing any background data operations.
1678 * <p>
1679 * All applications that have background services that use the network
1680 * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001681 * <p>
Scott Main4cc53332011-10-06 18:32:43 -07001682 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001683 * background data depends on several combined factors, and this method will
1684 * always return {@code true}. Instead, when background data is unavailable,
1685 * {@link #getActiveNetworkInfo()} will now appear disconnected.
Danica Chang6fdd0c62010-08-11 14:54:43 -07001686 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001687 * @return Whether background data usage is allowed.
1688 */
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001689 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001690 public boolean getBackgroundDataSetting() {
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001691 // assume that background data is allowed; final authority is
1692 // NetworkInfo which may be blocked.
1693 return true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001694 }
1695
1696 /**
1697 * Sets the value of the setting for background data usage.
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001698 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001699 * @param allowBackgroundData Whether an application should use data while
1700 * it is in the background.
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001701 *
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001702 * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
1703 * @see #getBackgroundDataSetting()
1704 * @hide
1705 */
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001706 @Deprecated
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001707 public void setBackgroundDataSetting(boolean allowBackgroundData) {
Jeff Sharkey3a844fc2011-08-16 14:37:57 -07001708 // ignored
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001709 }
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001710
1711 /**
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -07001712 * Return quota status for the current active network, or {@code null} if no
1713 * network is active. Quota status can change rapidly, so these values
1714 * shouldn't be cached.
Jeff Sharkey44a3e0d2011-10-06 10:50:09 -07001715 *
1716 * @hide
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -07001717 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001718 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -07001719 public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
1720 try {
1721 return mService.getActiveNetworkQuotaInfo();
1722 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001723 throw e.rethrowFromSystemServer();
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -07001724 }
1725 }
1726
1727 /**
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001728 * @hide
Robert Greenwaltafa05c02014-05-21 20:04:36 -07001729 * @deprecated Talk to TelephonyManager directly
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001730 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001731 @Deprecated
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001732 public boolean getMobileDataEnabled() {
Robert Greenwaltafa05c02014-05-21 20:04:36 -07001733 IBinder b = ServiceManager.getService(Context.TELEPHONY_SERVICE);
1734 if (b != null) {
1735 try {
1736 ITelephony it = ITelephony.Stub.asInterface(b);
Shishir Agrawal7ea3e8b2016-01-25 13:03:07 -08001737 int subId = SubscriptionManager.getDefaultDataSubscriptionId();
Wink Saville36ffb042014-12-05 11:10:30 -08001738 Log.d("ConnectivityManager", "getMobileDataEnabled()+ subId=" + subId);
1739 boolean retVal = it.getDataEnabled(subId);
1740 Log.d("ConnectivityManager", "getMobileDataEnabled()- subId=" + subId
1741 + " retVal=" + retVal);
1742 return retVal;
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001743 } catch (RemoteException e) {
1744 throw e.rethrowFromSystemServer();
1745 }
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001746 }
Wink Saville36ffb042014-12-05 11:10:30 -08001747 Log.d("ConnectivityManager", "getMobileDataEnabled()- remote exception retVal=false");
Robert Greenwaltafa05c02014-05-21 20:04:36 -07001748 return false;
Robert Greenwaltc03fa502010-02-23 18:58:05 -08001749 }
1750
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001751 /**
Robert Greenwaltb2489872014-09-04 16:44:35 -07001752 * Callback for use with {@link ConnectivityManager#addDefaultNetworkActiveListener}
Robert Greenwalt6078b502014-06-11 16:05:07 -07001753 * to find out when the system default network has gone in to a high power state.
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001754 */
1755 public interface OnNetworkActiveListener {
1756 /**
1757 * Called on the main thread of the process to report that the current data network
1758 * has become active, and it is now a good time to perform any pending network
1759 * operations. Note that this listener only tells you when the network becomes
1760 * active; if at any other time you want to know whether it is active (and thus okay
1761 * to initiate network traffic), you can retrieve its instantaneous state with
Robert Greenwalt6078b502014-06-11 16:05:07 -07001762 * {@link ConnectivityManager#isDefaultNetworkActive}.
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001763 */
1764 public void onNetworkActive();
1765 }
1766
1767 private INetworkManagementService getNetworkManagementService() {
1768 synchronized (this) {
1769 if (mNMService != null) {
1770 return mNMService;
1771 }
1772 IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
1773 mNMService = INetworkManagementService.Stub.asInterface(b);
1774 return mNMService;
1775 }
1776 }
1777
1778 private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
1779 mNetworkActivityListeners
1780 = new ArrayMap<OnNetworkActiveListener, INetworkActivityListener>();
1781
1782 /**
Robert Greenwalt6078b502014-06-11 16:05:07 -07001783 * Start listening to reports when the system's default data network is active, meaning it is
1784 * a good time to perform network traffic. Use {@link #isDefaultNetworkActive()}
1785 * to determine the current state of the system's default network after registering the
1786 * listener.
1787 * <p>
1788 * If the process default network has been set with
Paul Jensen72db88e2015-03-10 10:54:12 -04001789 * {@link ConnectivityManager#bindProcessToNetwork} this function will not
Robert Greenwalt6078b502014-06-11 16:05:07 -07001790 * reflect the process's default, but the system default.
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001791 *
1792 * @param l The listener to be told when the network is active.
1793 */
Robert Greenwaltb2489872014-09-04 16:44:35 -07001794 public void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) {
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001795 INetworkActivityListener rl = new INetworkActivityListener.Stub() {
1796 @Override
1797 public void onNetworkActive() throws RemoteException {
1798 l.onNetworkActive();
1799 }
1800 };
1801
1802 try {
1803 getNetworkManagementService().registerNetworkActivityListener(rl);
1804 mNetworkActivityListeners.put(l, rl);
1805 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001806 throw e.rethrowFromSystemServer();
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001807 }
1808 }
1809
1810 /**
1811 * Remove network active listener previously registered with
Robert Greenwaltb2489872014-09-04 16:44:35 -07001812 * {@link #addDefaultNetworkActiveListener}.
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001813 *
1814 * @param l Previously registered listener.
1815 */
Robert Greenwaltb2489872014-09-04 16:44:35 -07001816 public void removeDefaultNetworkActiveListener(OnNetworkActiveListener l) {
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001817 INetworkActivityListener rl = mNetworkActivityListeners.get(l);
1818 if (rl == null) {
1819 throw new IllegalArgumentException("Listener not registered: " + l);
1820 }
1821 try {
1822 getNetworkManagementService().unregisterNetworkActivityListener(rl);
1823 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001824 throw e.rethrowFromSystemServer();
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001825 }
1826 }
1827
1828 /**
1829 * Return whether the data network is currently active. An active network means that
1830 * it is currently in a high power state for performing data transmission. On some
1831 * types of networks, it may be expensive to move and stay in such a state, so it is
1832 * more power efficient to batch network traffic together when the radio is already in
1833 * this state. This method tells you whether right now is currently a good time to
1834 * initiate network traffic, as the network is already active.
1835 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07001836 public boolean isDefaultNetworkActive() {
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001837 try {
1838 return getNetworkManagementService().isNetworkActive();
1839 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001840 throw e.rethrowFromSystemServer();
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001841 }
Dianne Hackborn77b987f2014-02-26 16:20:52 -08001842 }
1843
1844 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001845 * {@hide}
1846 */
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09001847 public ConnectivityManager(Context context, IConnectivityManager service) {
1848 mContext = checkNotNull(context, "missing context");
Jeff Sharkeyf0ceede2011-08-02 17:22:34 -07001849 mService = checkNotNull(service, "missing IConnectivityManager");
Paul Jensene0bef712014-12-10 15:12:18 -05001850 sInstance = this;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001851 }
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001852
Jeff Sharkey8fc27e82012-04-04 20:40:58 -07001853 /** {@hide} */
1854 public static ConnectivityManager from(Context context) {
1855 return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
1856 }
1857
Lorenzo Colittifbe9b1a2016-07-28 17:14:11 +09001858 /* TODO: These permissions checks don't belong in client-side code. Move them to
1859 * services.jar, possibly in com.android.server.net. */
1860
1861 /** {@hide} */
1862 public static final boolean checkChangePermission(Context context) {
1863 int uid = Binder.getCallingUid();
1864 return Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings
1865 .getPackageNameForUid(context, uid), false /* throwException */);
1866 }
1867
Lorenzo Colittid5427052015-10-15 16:29:00 +09001868 /** {@hide} */
1869 public static final void enforceChangePermission(Context context) {
1870 int uid = Binder.getCallingUid();
1871 Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings
1872 .getPackageNameForUid(context, uid), true /* throwException */);
1873 }
1874
Robert Greenwaltedb47662014-09-16 17:54:19 -07001875 /** {@hide */
1876 public static final void enforceTetherChangePermission(Context context) {
1877 if (context.getResources().getStringArray(
1878 com.android.internal.R.array.config_mobile_hotspot_provision_app).length == 2) {
1879 // Have a provisioning app - must only let system apps (which check this app)
1880 // turn on tethering
1881 context.enforceCallingOrSelfPermission(
Jeremy Kleind42209d2015-12-28 15:11:58 -08001882 android.Manifest.permission.TETHER_PRIVILEGED, "ConnectivityService");
Robert Greenwaltedb47662014-09-16 17:54:19 -07001883 } else {
Billy Laua7238a32015-08-01 12:45:02 +01001884 int uid = Binder.getCallingUid();
Lorenzo Colittid5427052015-10-15 16:29:00 +09001885 Settings.checkAndNoteWriteSettingsOperation(context, uid, Settings
1886 .getPackageNameForUid(context, uid), true /* throwException */);
Robert Greenwaltedb47662014-09-16 17:54:19 -07001887 }
1888 }
1889
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001890 /**
Paul Jensene0bef712014-12-10 15:12:18 -05001891 * @deprecated - use getSystemService. This is a kludge to support static access in certain
1892 * situations where a Context pointer is unavailable.
1893 * @hide
1894 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001895 @Deprecated
Paul Jensen72db88e2015-03-10 10:54:12 -04001896 static ConnectivityManager getInstanceOrNull() {
1897 return sInstance;
1898 }
1899
1900 /**
1901 * @deprecated - use getSystemService. This is a kludge to support static access in certain
1902 * situations where a Context pointer is unavailable.
1903 * @hide
1904 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07001905 @Deprecated
Paul Jensen72db88e2015-03-10 10:54:12 -04001906 private static ConnectivityManager getInstance() {
1907 if (getInstanceOrNull() == null) {
Paul Jensene0bef712014-12-10 15:12:18 -05001908 throw new IllegalStateException("No ConnectivityManager yet constructed");
1909 }
Paul Jensen72db88e2015-03-10 10:54:12 -04001910 return getInstanceOrNull();
Paul Jensene0bef712014-12-10 15:12:18 -05001911 }
1912
1913 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001914 * Get the set of tetherable, available interfaces. This list is limited by
1915 * device configuration and current interface existence.
1916 *
1917 * @return an array of 0 or more Strings of tetherable interface names.
1918 *
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001919 * {@hide}
1920 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001921 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001922 public String[] getTetherableIfaces() {
1923 try {
1924 return mService.getTetherableIfaces();
1925 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001926 throw e.rethrowFromSystemServer();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001927 }
1928 }
1929
1930 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001931 * Get the set of tethered interfaces.
1932 *
1933 * @return an array of 0 or more String of currently tethered interface names.
1934 *
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001935 * {@hide}
1936 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001937 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001938 public String[] getTetheredIfaces() {
1939 try {
1940 return mService.getTetheredIfaces();
1941 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001942 throw e.rethrowFromSystemServer();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001943 }
1944 }
1945
1946 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001947 * Get the set of interface names which attempted to tether but
1948 * failed. Re-attempting to tether may cause them to reset to the Tethered
1949 * state. Alternatively, causing the interface to be destroyed and recreated
1950 * may cause them to reset to the available state.
1951 * {@link ConnectivityManager#getLastTetherError} can be used to get more
1952 * information on the cause of the errors.
1953 *
1954 * @return an array of 0 or more String indicating the interface names
1955 * which failed to tether.
1956 *
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001957 * {@hide}
1958 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06001959 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt5a735062010-03-02 17:25:02 -08001960 public String[] getTetheringErroredIfaces() {
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001961 try {
Robert Greenwalt5a735062010-03-02 17:25:02 -08001962 return mService.getTetheringErroredIfaces();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001963 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001964 throw e.rethrowFromSystemServer();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08001965 }
1966 }
1967
1968 /**
Robert Greenwalt9c7e2c22014-06-23 14:53:42 -07001969 * Get the set of tethered dhcp ranges.
1970 *
1971 * @return an array of 0 or more {@code String} of tethered dhcp ranges.
1972 * {@hide}
1973 */
1974 public String[] getTetheredDhcpRanges() {
1975 try {
1976 return mService.getTetheredDhcpRanges();
1977 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07001978 throw e.rethrowFromSystemServer();
Robert Greenwalt9c7e2c22014-06-23 14:53:42 -07001979 }
1980 }
1981
1982 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001983 * Attempt to tether the named interface. This will setup a dhcp server
1984 * on the interface, forward and NAT IP packets and forward DNS requests
1985 * to the best active upstream network interface. Note that if no upstream
1986 * IP network interface is available, dhcp will still run and traffic will be
1987 * allowed between the tethered devices and this device, though upstream net
1988 * access will of course fail until an upstream network interface becomes
1989 * active.
Lorenzo Colittid5427052015-10-15 16:29:00 +09001990 *
1991 * <p>This method requires the caller to hold either the
1992 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
1993 * or the ability to modify system settings as determined by
1994 * {@link android.provider.Settings.System#canWrite}.</p>
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08001995 *
Jeremy Klein36c7aa02016-01-22 14:11:45 -08001996 * <p>WARNING: New clients should not use this function. The only usages should be in PanService
1997 * and WifiStateMachine which need direct access. All other clients should use
1998 * {@link #startTethering} and {@link #stopTethering} which encapsulate proper provisioning
1999 * logic.</p>
2000 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002001 * @param iface the interface name to tether.
2002 * @return error a {@code TETHER_ERROR} value indicating success or failure type
2003 *
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08002004 * {@hide}
2005 */
Robert Greenwalt5a735062010-03-02 17:25:02 -08002006 public int tether(String iface) {
2007 try {
2008 return mService.tether(iface);
2009 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002010 throw e.rethrowFromSystemServer();
Robert Greenwalt5a735062010-03-02 17:25:02 -08002011 }
2012 }
2013
2014 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002015 * Stop tethering the named interface.
Lorenzo Colittid5427052015-10-15 16:29:00 +09002016 *
2017 * <p>This method requires the caller to hold either the
2018 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
2019 * or the ability to modify system settings as determined by
2020 * {@link android.provider.Settings.System#canWrite}.</p>
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002021 *
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002022 * <p>WARNING: New clients should not use this function. The only usages should be in PanService
2023 * and WifiStateMachine which need direct access. All other clients should use
2024 * {@link #startTethering} and {@link #stopTethering} which encapsulate proper provisioning
2025 * logic.</p>
2026 *
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002027 * @param iface the interface name to untether.
2028 * @return error a {@code TETHER_ERROR} value indicating success or failure type
2029 *
Robert Greenwalt5a735062010-03-02 17:25:02 -08002030 * {@hide}
2031 */
2032 public int untether(String iface) {
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08002033 try {
2034 return mService.untether(iface);
2035 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002036 throw e.rethrowFromSystemServer();
Robert Greenwaltd0e18ff2010-01-26 11:40:34 -08002037 }
2038 }
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002039
2040 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002041 * Check if the device allows for tethering. It may be disabled via
Dianne Hackborn77b987f2014-02-26 16:20:52 -08002042 * {@code ro.tether.denied} system property, Settings.TETHER_SUPPORTED or
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002043 * due to device configuration.
2044 *
2045 * @return a boolean - {@code true} indicating Tethering is supported.
2046 *
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002047 * {@hide}
2048 */
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002049 @SystemApi
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002050 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002051 public boolean isTetheringSupported() {
2052 try {
2053 return mService.isTetheringSupported();
2054 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002055 throw e.rethrowFromSystemServer();
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002056 }
2057 }
2058
2059 /**
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002060 * Callback for use with {@link #startTethering} to find out whether tethering succeeded.
2061 * @hide
2062 */
2063 @SystemApi
2064 public static abstract class OnStartTetheringCallback {
2065 /**
2066 * Called when tethering has been successfully started.
2067 */
2068 public void onTetheringStarted() {};
2069
2070 /**
2071 * Called when starting tethering failed.
2072 */
2073 public void onTetheringFailed() {};
2074 }
2075
2076 /**
2077 * Convenient overload for
2078 * {@link #startTethering(int, boolean, OnStartTetheringCallback, Handler)} which passes a null
2079 * handler to run on the current thread's {@link Looper}.
2080 * @hide
2081 */
2082 @SystemApi
2083 public void startTethering(int type, boolean showProvisioningUi,
2084 final OnStartTetheringCallback callback) {
2085 startTethering(type, showProvisioningUi, callback, null);
2086 }
2087
2088 /**
2089 * Runs tether provisioning for the given type if needed and then starts tethering if
2090 * the check succeeds. If no carrier provisioning is required for tethering, tethering is
2091 * enabled immediately. If provisioning fails, tethering will not be enabled. It also
2092 * schedules tether provisioning re-checks if appropriate.
2093 *
2094 * @param type The type of tethering to start. Must be one of
2095 * {@link ConnectivityManager.TETHERING_WIFI},
2096 * {@link ConnectivityManager.TETHERING_USB}, or
2097 * {@link ConnectivityManager.TETHERING_BLUETOOTH}.
2098 * @param showProvisioningUi a boolean indicating to show the provisioning app UI if there
2099 * is one. This should be true the first time this function is called and also any time
2100 * the user can see this UI. It gives users information from their carrier about the
2101 * check failing and how they can sign up for tethering if possible.
2102 * @param callback an {@link OnStartTetheringCallback} which will be called to notify the caller
2103 * of the result of trying to tether.
2104 * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
2105 * @hide
2106 */
2107 @SystemApi
2108 public void startTethering(int type, boolean showProvisioningUi,
2109 final OnStartTetheringCallback callback, Handler handler) {
Jeremy Klein5f277e12016-03-12 16:29:54 -08002110 checkNotNull(callback, "OnStartTetheringCallback cannot be null.");
2111
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002112 ResultReceiver wrappedCallback = new ResultReceiver(handler) {
2113 @Override
2114 protected void onReceiveResult(int resultCode, Bundle resultData) {
2115 if (resultCode == TETHER_ERROR_NO_ERROR) {
2116 callback.onTetheringStarted();
2117 } else {
2118 callback.onTetheringFailed();
2119 }
2120 }
2121 };
Jeremy Klein5f277e12016-03-12 16:29:54 -08002122
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002123 try {
2124 mService.startTethering(type, wrappedCallback, showProvisioningUi);
2125 } catch (RemoteException e) {
2126 Log.e(TAG, "Exception trying to start tethering.", e);
2127 wrappedCallback.send(TETHER_ERROR_SERVICE_UNAVAIL, null);
2128 }
2129 }
2130
2131 /**
2132 * Stops tethering for the given type. Also cancels any provisioning rechecks for that type if
2133 * applicable.
2134 *
2135 * @param type The type of tethering to stop. Must be one of
2136 * {@link ConnectivityManager.TETHERING_WIFI},
2137 * {@link ConnectivityManager.TETHERING_USB}, or
2138 * {@link ConnectivityManager.TETHERING_BLUETOOTH}.
2139 * @hide
2140 */
2141 @SystemApi
2142 public void stopTethering(int type) {
2143 try {
2144 mService.stopTethering(type);
2145 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002146 throw e.rethrowFromSystemServer();
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002147 }
2148 }
2149
2150 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002151 * Get the list of regular expressions that define any tetherable
2152 * USB network interfaces. If USB tethering is not supported by the
2153 * device, this list should be empty.
2154 *
2155 * @return an array of 0 or more regular expression Strings defining
2156 * what interfaces are considered tetherable usb interfaces.
2157 *
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002158 * {@hide}
2159 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002160 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002161 public String[] getTetherableUsbRegexs() {
2162 try {
2163 return mService.getTetherableUsbRegexs();
2164 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002165 throw e.rethrowFromSystemServer();
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002166 }
2167 }
2168
2169 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002170 * Get the list of regular expressions that define any tetherable
2171 * Wifi network interfaces. If Wifi tethering is not supported by the
2172 * device, this list should be empty.
2173 *
2174 * @return an array of 0 or more regular expression Strings defining
2175 * what interfaces are considered tetherable wifi interfaces.
2176 *
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002177 * {@hide}
2178 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002179 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002180 public String[] getTetherableWifiRegexs() {
2181 try {
2182 return mService.getTetherableWifiRegexs();
2183 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002184 throw e.rethrowFromSystemServer();
Robert Greenwalt2a091d72010-02-11 18:18:40 -08002185 }
2186 }
Robert Greenwalt5a735062010-03-02 17:25:02 -08002187
Danica Chang6fdd0c62010-08-11 14:54:43 -07002188 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002189 * Get the list of regular expressions that define any tetherable
2190 * Bluetooth network interfaces. If Bluetooth tethering is not supported by the
2191 * device, this list should be empty.
2192 *
2193 * @return an array of 0 or more regular expression Strings defining
2194 * what interfaces are considered tetherable bluetooth interfaces.
2195 *
Danica Chang6fdd0c62010-08-11 14:54:43 -07002196 * {@hide}
2197 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002198 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Danica Chang6fdd0c62010-08-11 14:54:43 -07002199 public String[] getTetherableBluetoothRegexs() {
2200 try {
2201 return mService.getTetherableBluetoothRegexs();
2202 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002203 throw e.rethrowFromSystemServer();
Danica Chang6fdd0c62010-08-11 14:54:43 -07002204 }
2205 }
2206
Mike Lockwood6c2260b2011-07-19 13:04:47 -07002207 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002208 * Attempt to both alter the mode of USB and Tethering of USB. A
2209 * utility method to deal with some of the complexity of USB - will
2210 * attempt to switch to Rndis and subsequently tether the resulting
2211 * interface on {@code true} or turn off tethering and switch off
2212 * Rndis on {@code false}.
Lorenzo Colittid5427052015-10-15 16:29:00 +09002213 *
2214 * <p>This method requires the caller to hold either the
2215 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
2216 * or the ability to modify system settings as determined by
2217 * {@link android.provider.Settings.System#canWrite}.</p>
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002218 *
2219 * @param enable a boolean - {@code true} to enable tethering
2220 * @return error a {@code TETHER_ERROR} value indicating success or failure type
2221 *
Mike Lockwood6c2260b2011-07-19 13:04:47 -07002222 * {@hide}
2223 */
2224 public int setUsbTethering(boolean enable) {
2225 try {
2226 return mService.setUsbTethering(enable);
2227 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002228 throw e.rethrowFromSystemServer();
Mike Lockwood6c2260b2011-07-19 13:04:47 -07002229 }
2230 }
2231
Robert Greenwalt5a735062010-03-02 17:25:02 -08002232 /** {@hide} */
2233 public static final int TETHER_ERROR_NO_ERROR = 0;
2234 /** {@hide} */
2235 public static final int TETHER_ERROR_UNKNOWN_IFACE = 1;
2236 /** {@hide} */
2237 public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2;
2238 /** {@hide} */
2239 public static final int TETHER_ERROR_UNSUPPORTED = 3;
2240 /** {@hide} */
2241 public static final int TETHER_ERROR_UNAVAIL_IFACE = 4;
2242 /** {@hide} */
2243 public static final int TETHER_ERROR_MASTER_ERROR = 5;
2244 /** {@hide} */
2245 public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
2246 /** {@hide} */
2247 public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
2248 /** {@hide} */
2249 public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8;
2250 /** {@hide} */
2251 public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9;
2252 /** {@hide} */
2253 public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10;
Jeremy Klein36c7aa02016-01-22 14:11:45 -08002254 /** {@hide} */
2255 public static final int TETHER_ERROR_PROVISION_FAILED = 11;
Robert Greenwalt5a735062010-03-02 17:25:02 -08002256
2257 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002258 * Get a more detailed error code after a Tethering or Untethering
2259 * request asynchronously failed.
2260 *
2261 * @param iface The name of the interface of interest
Robert Greenwalt5a735062010-03-02 17:25:02 -08002262 * @return error The error code of the last error tethering or untethering the named
2263 * interface
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002264 *
Robert Greenwalt5a735062010-03-02 17:25:02 -08002265 * {@hide}
2266 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002267 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt5a735062010-03-02 17:25:02 -08002268 public int getLastTetherError(String iface) {
2269 try {
2270 return mService.getLastTetherError(iface);
2271 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002272 throw e.rethrowFromSystemServer();
Robert Greenwalt5a735062010-03-02 17:25:02 -08002273 }
Robert Greenwalt14f2ef42010-06-15 12:19:37 -07002274 }
2275
2276 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002277 * Report network connectivity status. This is currently used only
2278 * to alter status bar UI.
Paul Jensenb2748922015-05-06 11:10:18 -04002279 * <p>This method requires the caller to hold the permission
2280 * {@link android.Manifest.permission#STATUS_BAR}.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002281 *
Robert Greenwaltd7085fc2010-09-08 15:24:47 -07002282 * @param networkType The type of network you want to report on
2283 * @param percentage The quality of the connection 0 is bad, 100 is good
2284 * {@hide}
2285 */
2286 public void reportInetCondition(int networkType, int percentage) {
2287 try {
2288 mService.reportInetCondition(networkType, percentage);
2289 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002290 throw e.rethrowFromSystemServer();
Robert Greenwaltd7085fc2010-09-08 15:24:47 -07002291 }
2292 }
Robert Greenwalt434203a2010-10-11 16:00:27 -07002293
2294 /**
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002295 * Report a problem network to the framework. This provides a hint to the system
Ye Wenb87875e2014-07-21 14:19:01 -07002296 * that there might be connectivity problems on this network and may cause
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002297 * the framework to re-evaluate network connectivity and/or switch to another
2298 * network.
Robert Greenwalt9258c642014-03-26 16:47:06 -07002299 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002300 * @param network The {@link Network} the application was attempting to use
2301 * or {@code null} to indicate the current default network.
Paul Jensenbfd17b72015-04-07 12:43:13 -04002302 * @deprecated Use {@link #reportNetworkConnectivity} which allows reporting both
2303 * working and non-working connectivity.
Robert Greenwalt9258c642014-03-26 16:47:06 -07002304 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07002305 @Deprecated
Robert Greenwalt9258c642014-03-26 16:47:06 -07002306 public void reportBadNetwork(Network network) {
2307 try {
Paul Jensenbfd17b72015-04-07 12:43:13 -04002308 // One of these will be ignored because it matches system's current state.
2309 // The other will trigger the necessary reevaluation.
2310 mService.reportNetworkConnectivity(network, true);
2311 mService.reportNetworkConnectivity(network, false);
2312 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002313 throw e.rethrowFromSystemServer();
Paul Jensenbfd17b72015-04-07 12:43:13 -04002314 }
2315 }
2316
2317 /**
2318 * Report to the framework whether a network has working connectivity.
2319 * This provides a hint to the system that a particular network is providing
2320 * working connectivity or not. In response the framework may re-evaluate
2321 * the network's connectivity and might take further action thereafter.
2322 *
2323 * @param network The {@link Network} the application was attempting to use
2324 * or {@code null} to indicate the current default network.
2325 * @param hasConnectivity {@code true} if the application was able to successfully access the
2326 * Internet using {@code network} or {@code false} if not.
2327 */
2328 public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
2329 try {
2330 mService.reportNetworkConnectivity(network, hasConnectivity);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002331 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002332 throw e.rethrowFromSystemServer();
Robert Greenwalt9258c642014-03-26 16:47:06 -07002333 }
2334 }
2335
2336 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002337 * Set a network-independent global http proxy. This is not normally what you want
2338 * for typical HTTP proxies - they are general network dependent. However if you're
2339 * doing something unusual like general internal filtering this may be useful. On
2340 * a private network where the proxy is not accessible, you may break HTTP using this.
Paul Jensenb2748922015-05-06 11:10:18 -04002341 *
2342 * @param p A {@link ProxyInfo} object defining the new global
2343 * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002344 * @hide
Robert Greenwalt434203a2010-10-11 16:00:27 -07002345 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002346 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Jason Monk207900c2014-04-25 15:00:09 -04002347 public void setGlobalProxy(ProxyInfo p) {
Robert Greenwalt434203a2010-10-11 16:00:27 -07002348 try {
2349 mService.setGlobalProxy(p);
2350 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002351 throw e.rethrowFromSystemServer();
Robert Greenwalt434203a2010-10-11 16:00:27 -07002352 }
2353 }
2354
2355 /**
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002356 * Retrieve any network-independent global HTTP proxy.
2357 *
Jason Monk207900c2014-04-25 15:00:09 -04002358 * @return {@link ProxyInfo} for the current global HTTP proxy or {@code null}
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002359 * if no global HTTP proxy is set.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002360 * @hide
Robert Greenwalt434203a2010-10-11 16:00:27 -07002361 */
Jason Monk207900c2014-04-25 15:00:09 -04002362 public ProxyInfo getGlobalProxy() {
Robert Greenwalt434203a2010-10-11 16:00:27 -07002363 try {
2364 return mService.getGlobalProxy();
2365 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002366 throw e.rethrowFromSystemServer();
Robert Greenwalt434203a2010-10-11 16:00:27 -07002367 }
2368 }
2369
2370 /**
Paul Jensencee9b512015-05-06 07:32:40 -04002371 * Retrieve the global HTTP proxy, or if no global HTTP proxy is set, a
2372 * network-specific HTTP proxy. If {@code network} is null, the
2373 * network-specific proxy returned is the proxy of the default active
2374 * network.
2375 *
2376 * @return {@link ProxyInfo} for the current global HTTP proxy, or if no
2377 * global HTTP proxy is set, {@code ProxyInfo} for {@code network},
2378 * or when {@code network} is {@code null},
2379 * the {@code ProxyInfo} for the default active network. Returns
2380 * {@code null} when no proxy applies or the caller doesn't have
2381 * permission to use {@code network}.
2382 * @hide
2383 */
2384 public ProxyInfo getProxyForNetwork(Network network) {
2385 try {
2386 return mService.getProxyForNetwork(network);
2387 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002388 throw e.rethrowFromSystemServer();
Paul Jensencee9b512015-05-06 07:32:40 -04002389 }
2390 }
2391
2392 /**
Paul Jensene0bef712014-12-10 15:12:18 -05002393 * Get the current default HTTP proxy settings. If a global proxy is set it will be returned,
2394 * otherwise if this process is bound to a {@link Network} using
Paul Jensen72db88e2015-03-10 10:54:12 -04002395 * {@link #bindProcessToNetwork} then that {@code Network}'s proxy is returned, otherwise
Paul Jensene0bef712014-12-10 15:12:18 -05002396 * the default network's proxy is returned.
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002397 *
Jason Monk207900c2014-04-25 15:00:09 -04002398 * @return the {@link ProxyInfo} for the current HTTP proxy, or {@code null} if no
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002399 * HTTP proxy is active.
Robert Greenwalt434203a2010-10-11 16:00:27 -07002400 */
Paul Jensene0bef712014-12-10 15:12:18 -05002401 public ProxyInfo getDefaultProxy() {
Paul Jensencee9b512015-05-06 07:32:40 -04002402 return getProxyForNetwork(getBoundNetworkForProcess());
Robert Greenwalt434203a2010-10-11 16:00:27 -07002403 }
Robert Greenwaltd55a6b42011-03-25 13:09:25 -07002404
2405 /**
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07002406 * Returns true if the hardware supports the given network type
2407 * else it returns false. This doesn't indicate we have coverage
2408 * or are authorized onto a network, just whether or not the
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002409 * hardware supports it. For example a GSM phone without a SIM
2410 * should still return {@code true} for mobile data, but a wifi only
2411 * tablet would return {@code false}.
2412 *
2413 * @param networkType The network type we'd like to check
2414 * @return {@code true} if supported, else {@code false}
2415 *
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07002416 * @hide
2417 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002418 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07002419 public boolean isNetworkSupported(int networkType) {
2420 try {
2421 return mService.isNetworkSupported(networkType);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002422 } catch (RemoteException e) {
2423 throw e.rethrowFromSystemServer();
2424 }
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07002425 }
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07002426
2427 /**
2428 * Returns if the currently active data network is metered. A network is
2429 * classified as metered when the user is sensitive to heavy data usage on
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002430 * that connection due to monetary costs, data limitations or
2431 * battery/performance issues. You should check this before doing large
2432 * data transfers, and warn the user or delay the operation until another
2433 * network is available.
2434 *
2435 * @return {@code true} if large transfers should be avoided, otherwise
2436 * {@code false}.
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07002437 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002438 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07002439 public boolean isActiveNetworkMetered() {
2440 try {
2441 return mService.isActiveNetworkMetered();
2442 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002443 throw e.rethrowFromSystemServer();
Jeff Sharkey9f7cbf02012-04-12 18:34:54 -07002444 }
2445 }
Jeff Sharkey69ddab42012-08-25 00:05:46 -07002446
Robert Greenwalt5a6bdc42013-02-15 10:56:35 -08002447 /**
2448 * If the LockdownVpn mechanism is enabled, updates the vpn
2449 * with a reload of its profile.
2450 *
2451 * @return a boolean with {@code} indicating success
2452 *
2453 * <p>This method can only be called by the system UID
2454 * {@hide}
2455 */
Jeff Sharkey69ddab42012-08-25 00:05:46 -07002456 public boolean updateLockdownVpn() {
2457 try {
2458 return mService.updateLockdownVpn();
2459 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002460 throw e.rethrowFromSystemServer();
Jeff Sharkey69ddab42012-08-25 00:05:46 -07002461 }
2462 }
Irfan Sheriffda6da092012-08-16 12:49:23 -07002463
2464 /**
Wink Saville948282b2013-08-29 08:55:16 -07002465 * Check mobile provisioning.
Wink Savilleab9321d2013-06-29 21:10:57 -07002466 *
Wink Savilleab9321d2013-06-29 21:10:57 -07002467 * @param suggestedTimeOutMs, timeout in milliseconds
Wink Savilleab9321d2013-06-29 21:10:57 -07002468 *
2469 * @return time out that will be used, maybe less that suggestedTimeOutMs
2470 * -1 if an error.
2471 *
2472 * {@hide}
2473 */
Wink Saville948282b2013-08-29 08:55:16 -07002474 public int checkMobileProvisioning(int suggestedTimeOutMs) {
Wink Savilleab9321d2013-06-29 21:10:57 -07002475 int timeOutMs = -1;
2476 try {
Wink Saville948282b2013-08-29 08:55:16 -07002477 timeOutMs = mService.checkMobileProvisioning(suggestedTimeOutMs);
Wink Savilleab9321d2013-06-29 21:10:57 -07002478 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002479 throw e.rethrowFromSystemServer();
Wink Savilleab9321d2013-06-29 21:10:57 -07002480 }
2481 return timeOutMs;
2482 }
Robert Greenwalte182bfe2013-07-16 12:06:09 -07002483
2484 /**
Wink Saville42d4f082013-07-20 20:31:59 -07002485 * Get the mobile provisioning url.
Robert Greenwalte182bfe2013-07-16 12:06:09 -07002486 * {@hide}
2487 */
2488 public String getMobileProvisioningUrl() {
2489 try {
2490 return mService.getMobileProvisioningUrl();
2491 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002492 throw e.rethrowFromSystemServer();
Robert Greenwalte182bfe2013-07-16 12:06:09 -07002493 }
Robert Greenwalte182bfe2013-07-16 12:06:09 -07002494 }
Wink Saville42d4f082013-07-20 20:31:59 -07002495
2496 /**
Wink Saville948282b2013-08-29 08:55:16 -07002497 * Set sign in error notification to visible or in visible
2498 *
2499 * @param visible
2500 * @param networkType
2501 *
2502 * {@hide}
Paul Jensen3541e9f2015-03-18 12:23:02 -04002503 * @deprecated Doesn't properly deal with multiple connected networks of the same type.
Wink Saville948282b2013-08-29 08:55:16 -07002504 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07002505 @Deprecated
Wink Saville948282b2013-08-29 08:55:16 -07002506 public void setProvisioningNotificationVisible(boolean visible, int networkType,
Paul Jensen89e0f092014-09-15 15:59:36 -04002507 String action) {
Wink Saville948282b2013-08-29 08:55:16 -07002508 try {
Paul Jensen89e0f092014-09-15 15:59:36 -04002509 mService.setProvisioningNotificationVisible(visible, networkType, action);
Wink Saville948282b2013-08-29 08:55:16 -07002510 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002511 throw e.rethrowFromSystemServer();
Wink Saville948282b2013-08-29 08:55:16 -07002512 }
2513 }
Yuhao Zheng5cd1a0e2013-09-09 17:00:04 -07002514
2515 /**
2516 * Set the value for enabling/disabling airplane mode
2517 *
2518 * @param enable whether to enable airplane mode or not
2519 *
Yuhao Zheng5cd1a0e2013-09-09 17:00:04 -07002520 * @hide
2521 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06002522 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Yuhao Zheng5cd1a0e2013-09-09 17:00:04 -07002523 public void setAirplaneMode(boolean enable) {
2524 try {
2525 mService.setAirplaneMode(enable);
2526 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002527 throw e.rethrowFromSystemServer();
Yuhao Zheng5cd1a0e2013-09-09 17:00:04 -07002528 }
2529 }
Robert Greenwalte049c232014-04-11 15:53:27 -07002530
2531 /** {@hide} */
Robert Greenwalta67be032014-05-16 15:49:14 -07002532 public void registerNetworkFactory(Messenger messenger, String name) {
Robert Greenwalte049c232014-04-11 15:53:27 -07002533 try {
Robert Greenwalta67be032014-05-16 15:49:14 -07002534 mService.registerNetworkFactory(messenger, name);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002535 } catch (RemoteException e) {
2536 throw e.rethrowFromSystemServer();
2537 }
Robert Greenwalta67be032014-05-16 15:49:14 -07002538 }
2539
2540 /** {@hide} */
2541 public void unregisterNetworkFactory(Messenger messenger) {
2542 try {
2543 mService.unregisterNetworkFactory(messenger);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002544 } catch (RemoteException e) {
2545 throw e.rethrowFromSystemServer();
2546 }
Robert Greenwalte049c232014-04-11 15:53:27 -07002547 }
Robert Greenwalt7b816022014-04-18 15:25:25 -07002548
Paul Jensen31a94f42015-02-13 14:18:39 -05002549 /**
2550 * @hide
2551 * Register a NetworkAgent with ConnectivityService.
2552 * @return NetID corresponding to NetworkAgent.
2553 */
2554 public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
Sreeram Ramachandran8cd33ed2014-07-23 15:23:15 -07002555 NetworkCapabilities nc, int score, NetworkMisc misc) {
Robert Greenwalt7b816022014-04-18 15:25:25 -07002556 try {
Paul Jensen31a94f42015-02-13 14:18:39 -05002557 return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
2558 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002559 throw e.rethrowFromSystemServer();
Paul Jensen31a94f42015-02-13 14:18:39 -05002560 }
Robert Greenwalt7b816022014-04-18 15:25:25 -07002561 }
2562
Robert Greenwalt9258c642014-03-26 16:47:06 -07002563 /**
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002564 * Base class for NetworkRequest callbacks. Used for notifications about network
2565 * changes. Should be extended by applications wanting notifications.
Robert Greenwalt9258c642014-03-26 16:47:06 -07002566 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002567 public static class NetworkCallback {
Robert Greenwalt7b816022014-04-18 15:25:25 -07002568 /**
Lorenzo Colitti07086932015-04-24 12:23:24 +09002569 * Called when the framework connects to a new network to evaluate whether it satisfies this
2570 * request. If evaluation succeeds, this callback may be followed by an {@link #onAvailable}
2571 * callback. There is no guarantee that this new network will satisfy any requests, or that
2572 * the network will stay connected for longer than the time necessary to evaluate it.
2573 * <p>
2574 * Most applications <b>should not</b> act on this callback, and should instead use
2575 * {@link #onAvailable}. This callback is intended for use by applications that can assist
2576 * the framework in properly evaluating the network &mdash; for example, an application that
2577 * can automatically log in to a captive portal without user intervention.
2578 *
2579 * @param network The {@link Network} of the network that is being evaluated.
Lorenzo Colitti66276122015-06-11 14:27:17 +09002580 *
2581 * @hide
Robert Greenwalt7b816022014-04-18 15:25:25 -07002582 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002583 public void onPreCheck(Network network) {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002584
2585 /**
Lorenzo Colitti07086932015-04-24 12:23:24 +09002586 * Called when the framework connects and has declared a new network ready for use.
Robert Greenwalt6078b502014-06-11 16:05:07 -07002587 * This callback may be called more than once if the {@link Network} that is
2588 * satisfying the request changes.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002589 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002590 * @param network The {@link Network} of the satisfying network.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002591 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002592 public void onAvailable(Network network) {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002593
2594 /**
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002595 * Called when the network is about to be disconnected. Often paired with an
Robert Greenwalt6078b502014-06-11 16:05:07 -07002596 * {@link NetworkCallback#onAvailable} call with the new replacement network
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002597 * for graceful handover. This may not be called if we have a hard loss
2598 * (loss without warning). This may be followed by either a
Robert Greenwalt6078b502014-06-11 16:05:07 -07002599 * {@link NetworkCallback#onLost} call or a
2600 * {@link NetworkCallback#onAvailable} call for this network depending
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002601 * on whether we lose or regain it.
2602 *
Robert Greenwalt6078b502014-06-11 16:05:07 -07002603 * @param network The {@link Network} that is about to be disconnected.
2604 * @param maxMsToLive The time in ms the framework will attempt to keep the
2605 * network connected. Note that the network may suffer a
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002606 * hard loss at any time.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002607 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002608 public void onLosing(Network network, int maxMsToLive) {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002609
2610 /**
2611 * Called when the framework has a hard loss of the network or when the
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002612 * graceful failure ends.
2613 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002614 * @param network The {@link Network} lost.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002615 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002616 public void onLost(Network network) {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002617
2618 /**
Etan Cohenaebf17e2017-03-01 12:47:28 -08002619 * Called if no network is found in the timeout time specified in
2620 * {@link #requestNetwork(NetworkRequest, int, NetworkCallback)} call. This callback is not
2621 * called for the version of {@link #requestNetwork(NetworkRequest, NetworkCallback)}
2622 * without timeout. When this callback is invoked the associated
2623 * {@link NetworkRequest} will have already been removed and released, as if
2624 * {@link #unregisterNetworkCallback(NetworkCallback)} had been called.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002625 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002626 public void onUnavailable() {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002627
2628 /**
2629 * Called when the network the framework connected to for this request
2630 * changes capabilities but still satisfies the stated need.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002631 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002632 * @param network The {@link Network} whose capabilities have changed.
Lorenzo Colittie285b432015-04-23 15:32:42 +09002633 * @param networkCapabilities The new {@link android.net.NetworkCapabilities} for this network.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002634 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002635 public void onCapabilitiesChanged(Network network,
Robert Greenwalt7b816022014-04-18 15:25:25 -07002636 NetworkCapabilities networkCapabilities) {}
2637
2638 /**
2639 * Called when the network the framework connected to for this request
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002640 * changes {@link LinkProperties}.
2641 *
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002642 * @param network The {@link Network} whose link properties have changed.
2643 * @param linkProperties The new {@link LinkProperties} for this network.
Robert Greenwalt7b816022014-04-18 15:25:25 -07002644 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002645 public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {}
Robert Greenwalt7b816022014-04-18 15:25:25 -07002646
Robert Greenwalt8d482522015-06-24 13:23:42 -07002647 /**
2648 * Called when the network the framework connected to for this request
2649 * goes into {@link NetworkInfo.DetailedState.SUSPENDED}.
2650 * This generally means that while the TCP connections are still live,
2651 * temporarily network data fails to transfer. Specifically this is used
2652 * on cellular networks to mask temporary outages when driving through
2653 * a tunnel, etc.
2654 * @hide
2655 */
2656 public void onNetworkSuspended(Network network) {}
2657
2658 /**
2659 * Called when the network the framework connected to for this request
2660 * returns from a {@link NetworkInfo.DetailedState.SUSPENDED} state.
2661 * This should always be preceeded by a matching {@code onNetworkSuspended}
2662 * call.
2663 * @hide
2664 */
2665 public void onNetworkResumed(Network network) {}
2666
Robert Greenwalt6078b502014-06-11 16:05:07 -07002667 private NetworkRequest networkRequest;
Robert Greenwalt7b816022014-04-18 15:25:25 -07002668 }
2669
Robert Greenwalt9258c642014-03-26 16:47:06 -07002670 private static final int BASE = Protocol.BASE_CONNECTIVITY_MANAGER;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002671 /** @hide */
Robert Greenwalt8d482522015-06-24 13:23:42 -07002672 public static final int CALLBACK_PRECHECK = BASE + 1;
2673 /** @hide */
2674 public static final int CALLBACK_AVAILABLE = BASE + 2;
2675 /** @hide arg1 = TTL */
2676 public static final int CALLBACK_LOSING = BASE + 3;
2677 /** @hide */
2678 public static final int CALLBACK_LOST = BASE + 4;
2679 /** @hide */
2680 public static final int CALLBACK_UNAVAIL = BASE + 5;
2681 /** @hide */
2682 public static final int CALLBACK_CAP_CHANGED = BASE + 6;
2683 /** @hide */
2684 public static final int CALLBACK_IP_CHANGED = BASE + 7;
2685 /** @hide */
2686 public static final int CALLBACK_RELEASED = BASE + 8;
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002687 // TODO: consider deleting CALLBACK_EXIT and shifting following enum codes down by 1.
Robert Greenwalt8d482522015-06-24 13:23:42 -07002688 /** @hide */
2689 public static final int CALLBACK_EXIT = BASE + 9;
Robert Greenwalt562cc542014-05-15 18:07:26 -07002690 /** @hide obj = NetworkCapabilities, arg1 = seq number */
Robert Greenwalt8d482522015-06-24 13:23:42 -07002691 private static final int EXPIRE_LEGACY_REQUEST = BASE + 10;
2692 /** @hide */
2693 public static final int CALLBACK_SUSPENDED = BASE + 11;
2694 /** @hide */
2695 public static final int CALLBACK_RESUMED = BASE + 12;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002696
Erik Kline57faba92015-11-25 12:49:38 +09002697 /** @hide */
2698 public static String getCallbackName(int whichCallback) {
2699 switch (whichCallback) {
2700 case CALLBACK_PRECHECK: return "CALLBACK_PRECHECK";
2701 case CALLBACK_AVAILABLE: return "CALLBACK_AVAILABLE";
2702 case CALLBACK_LOSING: return "CALLBACK_LOSING";
2703 case CALLBACK_LOST: return "CALLBACK_LOST";
2704 case CALLBACK_UNAVAIL: return "CALLBACK_UNAVAIL";
2705 case CALLBACK_CAP_CHANGED: return "CALLBACK_CAP_CHANGED";
2706 case CALLBACK_IP_CHANGED: return "CALLBACK_IP_CHANGED";
2707 case CALLBACK_RELEASED: return "CALLBACK_RELEASED";
2708 case CALLBACK_EXIT: return "CALLBACK_EXIT";
2709 case EXPIRE_LEGACY_REQUEST: return "EXPIRE_LEGACY_REQUEST";
2710 case CALLBACK_SUSPENDED: return "CALLBACK_SUSPENDED";
2711 case CALLBACK_RESUMED: return "CALLBACK_RESUMED";
2712 default:
2713 return Integer.toString(whichCallback);
2714 }
2715 }
2716
Robert Greenwalt562cc542014-05-15 18:07:26 -07002717 private class CallbackHandler extends Handler {
Robert Greenwalt9258c642014-03-26 16:47:06 -07002718 private static final String TAG = "ConnectivityManager.CallbackHandler";
Robert Greenwalta9ebeef2015-09-03 16:41:45 -07002719 private static final boolean DBG = false;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002720
Hugo Benichid42650f2016-07-06 22:53:17 +09002721 CallbackHandler(Looper looper) {
Robert Greenwalt9258c642014-03-26 16:47:06 -07002722 super(looper);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002723 }
2724
Hugo Benichi2583ef02017-02-02 17:02:36 +09002725 CallbackHandler(Handler handler) {
2726 this(handler.getLooper());
2727 }
2728
Robert Greenwalt9258c642014-03-26 16:47:06 -07002729 @Override
2730 public void handleMessage(Message message) {
Hugo Benichid42650f2016-07-06 22:53:17 +09002731 NetworkRequest request = getObject(message, NetworkRequest.class);
2732 Network network = getObject(message, Network.class);
Lorenzo Colittifcfa7d92016-03-01 22:56:37 +09002733 if (DBG) {
2734 Log.d(TAG, whatToString(message.what) + " for network " + network);
2735 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07002736 switch (message.what) {
2737 case CALLBACK_PRECHECK: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002738 NetworkCallback callback = getCallback(request, "PRECHECK");
2739 if (callback != null) {
2740 callback.onPreCheck(network);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002741 }
2742 break;
2743 }
2744 case CALLBACK_AVAILABLE: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002745 NetworkCallback callback = getCallback(request, "AVAILABLE");
2746 if (callback != null) {
2747 callback.onAvailable(network);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002748 }
2749 break;
2750 }
2751 case CALLBACK_LOSING: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002752 NetworkCallback callback = getCallback(request, "LOSING");
2753 if (callback != null) {
2754 callback.onLosing(network, message.arg1);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002755 }
2756 break;
2757 }
2758 case CALLBACK_LOST: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002759 NetworkCallback callback = getCallback(request, "LOST");
2760 if (callback != null) {
2761 callback.onLost(network);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002762 }
2763 break;
2764 }
2765 case CALLBACK_UNAVAIL: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002766 NetworkCallback callback = getCallback(request, "UNAVAIL");
2767 if (callback != null) {
2768 callback.onUnavailable();
Robert Greenwalt9258c642014-03-26 16:47:06 -07002769 }
2770 break;
2771 }
2772 case CALLBACK_CAP_CHANGED: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002773 NetworkCallback callback = getCallback(request, "CAP_CHANGED");
2774 if (callback != null) {
Hugo Benichid42650f2016-07-06 22:53:17 +09002775 NetworkCapabilities cap = getObject(message, NetworkCapabilities.class);
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002776 callback.onCapabilitiesChanged(network, cap);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002777 }
2778 break;
2779 }
2780 case CALLBACK_IP_CHANGED: {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002781 NetworkCallback callback = getCallback(request, "IP_CHANGED");
2782 if (callback != null) {
Hugo Benichid42650f2016-07-06 22:53:17 +09002783 LinkProperties lp = getObject(message, LinkProperties.class);
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002784 callback.onLinkPropertiesChanged(network, lp);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002785 }
2786 break;
2787 }
Robert Greenwalt8d482522015-06-24 13:23:42 -07002788 case CALLBACK_SUSPENDED: {
2789 NetworkCallback callback = getCallback(request, "SUSPENDED");
2790 if (callback != null) {
2791 callback.onNetworkSuspended(network);
2792 }
2793 break;
2794 }
2795 case CALLBACK_RESUMED: {
2796 NetworkCallback callback = getCallback(request, "RESUMED");
2797 if (callback != null) {
2798 callback.onNetworkResumed(network);
2799 }
2800 break;
2801 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07002802 case CALLBACK_RELEASED: {
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002803 final NetworkCallback callback;
Hugo Benichid42650f2016-07-06 22:53:17 +09002804 synchronized(sCallbacks) {
2805 callback = sCallbacks.remove(request);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002806 }
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002807 if (callback == null) {
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002808 Log.e(TAG, "callback not found for RELEASED message");
Robert Greenwalt9258c642014-03-26 16:47:06 -07002809 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07002810 break;
2811 }
2812 case CALLBACK_EXIT: {
Robert Greenwalt9258c642014-03-26 16:47:06 -07002813 break;
2814 }
Robert Greenwalt562cc542014-05-15 18:07:26 -07002815 case EXPIRE_LEGACY_REQUEST: {
2816 expireRequest((NetworkCapabilities)message.obj, message.arg1);
2817 break;
2818 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07002819 }
2820 }
2821
Hugo Benichid42650f2016-07-06 22:53:17 +09002822 private <T> T getObject(Message msg, Class<T> c) {
2823 return (T) msg.getData().getParcelable(c.getSimpleName());
Robert Greenwalt9258c642014-03-26 16:47:06 -07002824 }
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002825
2826 private NetworkCallback getCallback(NetworkRequest req, String name) {
2827 NetworkCallback callback;
Hugo Benichid42650f2016-07-06 22:53:17 +09002828 synchronized(sCallbacks) {
2829 callback = sCallbacks.get(req);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002830 }
Lorenzo Colittidb95a602015-04-24 15:21:21 +09002831 if (callback == null) {
2832 Log.e(TAG, "callback not found for " + name + " message");
2833 }
2834 return callback;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002835 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07002836 }
2837
Hugo Benichi2583ef02017-02-02 17:02:36 +09002838 private CallbackHandler getDefaultHandler() {
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002839 synchronized (sCallbacks) {
2840 if (sCallbackHandler == null) {
2841 sCallbackHandler = new CallbackHandler(ConnectivityThread.getInstanceLooper());
Robert Greenwalt9258c642014-03-26 16:47:06 -07002842 }
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002843 return sCallbackHandler;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002844 }
2845 }
2846
Hugo Benichi6f260f32017-02-03 14:18:44 +09002847 private static final HashMap<NetworkRequest, NetworkCallback> sCallbacks = new HashMap<>();
2848 private static CallbackHandler sCallbackHandler;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002849
Hugo Benichi6f260f32017-02-03 14:18:44 +09002850 private static final int LISTEN = 1;
2851 private static final int REQUEST = 2;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002852
Hugo Benichi6f260f32017-02-03 14:18:44 +09002853 private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, NetworkCallback callback,
2854 int timeoutMs, int action, int legacyType, CallbackHandler handler) {
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002855 if (callback == null) {
Robert Greenwalt6078b502014-06-11 16:05:07 -07002856 throw new IllegalArgumentException("null NetworkCallback");
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002857 }
Hugo Benichi649e3242017-03-06 06:16:51 +00002858 if (need == null && action != REQUEST) {
Erik Klinea2d29402016-03-16 15:31:39 +09002859 throw new IllegalArgumentException("null NetworkCapabilities");
2860 }
Hugo Benichi649e3242017-03-06 06:16:51 +00002861 // TODO: throw an exception if callback.networkRequest is not null.
2862 // http://b/20701525
Hugo Benichid42650f2016-07-06 22:53:17 +09002863 final NetworkRequest request;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002864 try {
Hugo Benichid42650f2016-07-06 22:53:17 +09002865 synchronized(sCallbacks) {
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002866 Messenger messenger = new Messenger(handler);
Hugo Benichid42650f2016-07-06 22:53:17 +09002867 Binder binder = new Binder();
Paul Jensen7221cc32014-06-27 11:05:32 -04002868 if (action == LISTEN) {
Hugo Benichid42650f2016-07-06 22:53:17 +09002869 request = mService.listenForNetwork(need, messenger, binder);
Paul Jensen7221cc32014-06-27 11:05:32 -04002870 } else {
Hugo Benichid42650f2016-07-06 22:53:17 +09002871 request = mService.requestNetwork(
2872 need, messenger, timeoutMs, binder, legacyType);
Paul Jensen7221cc32014-06-27 11:05:32 -04002873 }
Hugo Benichid42650f2016-07-06 22:53:17 +09002874 if (request != null) {
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002875 sCallbacks.put(request, callback);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002876 }
Hugo Benichi7724cdd2016-07-07 10:15:56 +09002877 callback.networkRequest = request;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002878 }
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07002879 } catch (RemoteException e) {
2880 throw e.rethrowFromSystemServer();
2881 }
Hugo Benichid42650f2016-07-06 22:53:17 +09002882 return request;
Robert Greenwalt9258c642014-03-26 16:47:06 -07002883 }
2884
2885 /**
Erik Klinea2d29402016-03-16 15:31:39 +09002886 * Helper function to request a network with a particular legacy type.
Lorenzo Colitti7de289f2015-11-25 12:00:52 +09002887 *
2888 * This is temporarily public @hide so it can be called by system code that uses the
2889 * NetworkRequest API to request networks but relies on CONNECTIVITY_ACTION broadcasts for
2890 * instead network notifications.
2891 *
2892 * TODO: update said system code to rely on NetworkCallbacks and make this method private.
2893 *
2894 * @hide
2895 */
Lorenzo Colittid1179462015-11-25 15:47:14 +09002896 public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
Hugo Benichi2583ef02017-02-02 17:02:36 +09002897 int timeoutMs, int legacyType, Handler handler) {
2898 CallbackHandler cbHandler = new CallbackHandler(handler);
2899 NetworkCapabilities nc = request.networkCapabilities;
2900 sendRequestForNetwork(nc, networkCallback, timeoutMs, REQUEST, legacyType, cbHandler);
Lorenzo Colitti7de289f2015-11-25 12:00:52 +09002901 }
2902
2903 /**
Lorenzo Colittie285b432015-04-23 15:32:42 +09002904 * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}.
Robert Greenwalt9258c642014-03-26 16:47:06 -07002905 *
2906 * This {@link NetworkRequest} will live until released via
Etan Cohenaebf17e2017-03-01 12:47:28 -08002907 * {@link #unregisterNetworkCallback(NetworkCallback)} or the calling application exits. A
2908 * version of the method which takes a timeout is
2909 * {@link #requestNetwork(NetworkRequest, int, NetworkCallback)}.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002910 * Status of the request can be followed by listening to the various
Robert Greenwalt6078b502014-06-11 16:05:07 -07002911 * callbacks described in {@link NetworkCallback}. The {@link Network}
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07002912 * can be used to direct traffic to the network.
Paul Jensenbb2e0e92015-06-16 15:11:58 -04002913 * <p>It is presently unsupported to request a network with mutable
2914 * {@link NetworkCapabilities} such as
2915 * {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
2916 * {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}
2917 * as these {@code NetworkCapabilities} represent states that a particular
2918 * network may never attain, and whether a network will attain these states
2919 * is unknown prior to bringing up the network so the framework does not
2920 * know how to go about satisfing a request with these capabilities.
Lorenzo Colittid5427052015-10-15 16:29:00 +09002921 *
2922 * <p>This method requires the caller to hold either the
2923 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
2924 * or the ability to modify system settings as determined by
2925 * {@link android.provider.Settings.System#canWrite}.</p>
Robert Greenwalt9258c642014-03-26 16:47:06 -07002926 *
Robert Greenwalt6078b502014-06-11 16:05:07 -07002927 * @param request {@link NetworkRequest} describing this request.
Hugo Benichi2583ef02017-02-02 17:02:36 +09002928 * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
2929 * the callback must not be shared - it uniquely specifies this request.
2930 * The callback is invoked on the default internal Handler.
Paul Jensenbb2e0e92015-06-16 15:11:58 -04002931 * @throws IllegalArgumentException if {@code request} specifies any mutable
2932 * {@code NetworkCapabilities}.
Robert Greenwalt9258c642014-03-26 16:47:06 -07002933 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07002934 public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback) {
Hugo Benichi2583ef02017-02-02 17:02:36 +09002935 requestNetwork(request, networkCallback, getDefaultHandler());
2936 }
2937
2938 /**
2939 * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}.
2940 *
2941 * This {@link NetworkRequest} will live until released via
Etan Cohenaebf17e2017-03-01 12:47:28 -08002942 * {@link #unregisterNetworkCallback(NetworkCallback)} or the calling application exits. A
2943 * version of the method which takes a timeout is
2944 * {@link #requestNetwork(NetworkRequest, int, NetworkCallback)}.
Hugo Benichi2583ef02017-02-02 17:02:36 +09002945 * Status of the request can be followed by listening to the various
2946 * callbacks described in {@link NetworkCallback}. The {@link Network}
2947 * can be used to direct traffic to the network.
2948 * <p>It is presently unsupported to request a network with mutable
2949 * {@link NetworkCapabilities} such as
2950 * {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
2951 * {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}
2952 * as these {@code NetworkCapabilities} represent states that a particular
2953 * network may never attain, and whether a network will attain these states
2954 * is unknown prior to bringing up the network so the framework does not
2955 * know how to go about satisfing a request with these capabilities.
2956 *
2957 * <p>This method requires the caller to hold either the
2958 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
2959 * or the ability to modify system settings as determined by
2960 * {@link android.provider.Settings.System#canWrite}.</p>
2961 *
2962 * @param request {@link NetworkRequest} describing this request.
2963 * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
2964 * the callback must not be shared - it uniquely specifies this request.
2965 * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
2966 * @throws IllegalArgumentException if {@code request} specifies any mutable
2967 * {@code NetworkCapabilities}.
Hugo Benichi2583ef02017-02-02 17:02:36 +09002968 */
2969 public void requestNetwork(
2970 NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
2971 int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
2972 CallbackHandler cbHandler = new CallbackHandler(handler);
2973 requestNetwork(request, networkCallback, 0, legacyType, cbHandler);
Robert Greenwalt9258c642014-03-26 16:47:06 -07002974 }
2975
2976 /**
Etan Cohenaebf17e2017-03-01 12:47:28 -08002977 * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
2978 * by a timeout.
2979 *
2980 * This function behaves identically to the non-timed-out version
2981 * {@link #requestNetwork(NetworkRequest, NetworkCallback)}, but if a suitable network
2982 * is not found within the given time (in milliseconds) the
2983 * {@link NetworkCallback#onUnavailable()} callback is called. The request can still be
2984 * released normally by calling {@link #unregisterNetworkCallback(NetworkCallback)} but does
2985 * not have to be released if timed-out (it is automatically released). Unregistering a
2986 * request that timed out is not an error.
2987 *
2988 * <p>Do not use this method to poll for the existence of specific networks (e.g. with a small
2989 * timeout) - {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} is provided
2990 * for that purpose. Calling this method will attempt to bring up the requested network.
2991 *
2992 * <p>This method requires the caller to hold either the
2993 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
2994 * or the ability to modify system settings as determined by
2995 * {@link android.provider.Settings.System#canWrite}.</p>
2996 *
2997 * @param request {@link NetworkRequest} describing this request.
Lorenzo Colitti15fd4392017-04-28 00:56:30 +09002998 * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
2999 * the callback must not be shared - it uniquely specifies this request.
Etan Cohenaebf17e2017-03-01 12:47:28 -08003000 * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
3001 * before {@link NetworkCallback#onUnavailable()} is called. The timeout must
3002 * be a positive value (i.e. >0).
Etan Cohenaebf17e2017-03-01 12:47:28 -08003003 */
Lorenzo Colitti15fd4392017-04-28 00:56:30 +09003004 public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
3005 int timeoutMs) {
Etan Cohenaebf17e2017-03-01 12:47:28 -08003006 if (timeoutMs <= 0) {
3007 throw new IllegalArgumentException("Non-positive timeoutMs: " + timeoutMs);
3008 }
Hugo Benichi2583ef02017-02-02 17:02:36 +09003009 int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
Erik Klineb583b032017-02-22 12:58:24 +09003010 requestNetwork(request, networkCallback, timeoutMs, legacyType, getDefaultHandler());
Hugo Benichi2583ef02017-02-02 17:02:36 +09003011 }
3012
3013
3014 /**
3015 * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
3016 * by a timeout.
3017 *
3018 * This function behaves identically to the non-timedout version, but if a suitable
3019 * network is not found within the given time (in milliseconds) the
Etan Cohenaebf17e2017-03-01 12:47:28 -08003020 * {@link NetworkCallback#onUnavailable} callback is called. The request can still be
3021 * released normally by calling {@link #unregisterNetworkCallback(NetworkCallback)} but does
3022 * not have to be released if timed-out (it is automatically released). Unregistering a
3023 * request that timed out is not an error.
3024 *
3025 * <p>Do not use this method to poll for the existence of specific networks (e.g. with a small
3026 * timeout) - {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} is provided
3027 * for that purpose. Calling this method will attempt to bring up the requested network.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003028 *
3029 * <p>This method requires the caller to hold either the
3030 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
3031 * or the ability to modify system settings as determined by
3032 * {@link android.provider.Settings.System#canWrite}.</p>
3033 *
3034 * @param request {@link NetworkRequest} describing this request.
Etan Cohenaebf17e2017-03-01 12:47:28 -08003035 * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
3036 * the callback must not be shared - it uniquely specifies this request.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003037 * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
Lorenzo Colitti15fd4392017-04-28 00:56:30 +09003038 * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
3039 * before {@link NetworkCallback#onUnavailable} is called.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003040 */
Lorenzo Colitti15fd4392017-04-28 00:56:30 +09003041 public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
3042 Handler handler, int timeoutMs) {
Etan Cohenaebf17e2017-03-01 12:47:28 -08003043 if (timeoutMs <= 0) {
3044 throw new IllegalArgumentException("Non-positive timeoutMs");
3045 }
Hugo Benichi2583ef02017-02-02 17:02:36 +09003046 int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
3047 CallbackHandler cbHandler = new CallbackHandler(handler);
3048 requestNetwork(request, networkCallback, timeoutMs, legacyType, cbHandler);
Robert Greenwalt9258c642014-03-26 16:47:06 -07003049 }
3050
3051 /**
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003052 * The lookup key for a {@link Network} object included with the intent after
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003053 * successfully finding a network for the applications request. Retrieve it with
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003054 * {@link android.content.Intent#getParcelableExtra(String)}.
Jeremy Joslinfcde58f2015-02-11 16:51:13 -08003055 * <p>
Paul Jensen72db88e2015-03-10 10:54:12 -04003056 * Note that if you intend to invoke {@link Network#openConnection(java.net.URL)}
3057 * then you must get a ConnectivityManager instance before doing so.
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003058 */
Erik Kline90e93072014-11-19 12:12:24 +09003059 public static final String EXTRA_NETWORK = "android.net.extra.NETWORK";
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003060
3061 /**
Robert Greenwalt6078b502014-06-11 16:05:07 -07003062 * The lookup key for a {@link NetworkRequest} object included with the intent after
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003063 * successfully finding a network for the applications request. Retrieve it with
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003064 * {@link android.content.Intent#getParcelableExtra(String)}.
3065 */
Erik Kline90e93072014-11-19 12:12:24 +09003066 public static final String EXTRA_NETWORK_REQUEST = "android.net.extra.NETWORK_REQUEST";
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003067
3068
3069 /**
Lorenzo Colittie285b432015-04-23 15:32:42 +09003070 * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003071 *
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003072 * This function behaves identically to the version that takes a NetworkCallback, but instead
Robert Greenwalt6078b502014-06-11 16:05:07 -07003073 * of {@link NetworkCallback} a {@link PendingIntent} is used. This means
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003074 * the request may outlive the calling application and get called back when a suitable
3075 * network is found.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003076 * <p>
3077 * The operation is an Intent broadcast that goes to a broadcast receiver that
3078 * you registered with {@link Context#registerReceiver} or through the
3079 * &lt;receiver&gt; tag in an AndroidManifest.xml file
3080 * <p>
3081 * The operation Intent is delivered with two extras, a {@link Network} typed
Erik Kline90e93072014-11-19 12:12:24 +09003082 * extra called {@link #EXTRA_NETWORK} and a {@link NetworkRequest}
3083 * typed extra called {@link #EXTRA_NETWORK_REQUEST} containing
Robert Greenwalt9258c642014-03-26 16:47:06 -07003084 * the original requests parameters. It is important to create a new,
Robert Greenwalt6078b502014-06-11 16:05:07 -07003085 * {@link NetworkCallback} based request before completing the processing of the
Robert Greenwalt9258c642014-03-26 16:47:06 -07003086 * Intent to reserve the network or it will be released shortly after the Intent
3087 * is processed.
3088 * <p>
Paul Jensen694f2b82015-06-17 14:15:39 -04003089 * If there is already a request for this Intent registered (with the equality of
Robert Greenwalt9258c642014-03-26 16:47:06 -07003090 * two Intents defined by {@link Intent#filterEquals}), then it will be removed and
Robert Greenwaltd19c41c2014-05-18 23:07:25 -07003091 * replaced by this one, effectively releasing the previous {@link NetworkRequest}.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003092 * <p>
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003093 * The request may be released normally by calling
3094 * {@link #releaseNetworkRequest(android.app.PendingIntent)}.
Paul Jensenbb2e0e92015-06-16 15:11:58 -04003095 * <p>It is presently unsupported to request a network with either
3096 * {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
3097 * {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}
3098 * as these {@code NetworkCapabilities} represent states that a particular
3099 * network may never attain, and whether a network will attain these states
3100 * is unknown prior to bringing up the network so the framework does not
3101 * know how to go about satisfing a request with these capabilities.
Lorenzo Colittid5427052015-10-15 16:29:00 +09003102 *
3103 * <p>This method requires the caller to hold either the
3104 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
3105 * or the ability to modify system settings as determined by
3106 * {@link android.provider.Settings.System#canWrite}.</p>
3107 *
Robert Greenwalt6078b502014-06-11 16:05:07 -07003108 * @param request {@link NetworkRequest} describing this request.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003109 * @param operation Action to perform when the network is available (corresponds
Robert Greenwalt6078b502014-06-11 16:05:07 -07003110 * to the {@link NetworkCallback#onAvailable} call. Typically
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003111 * comes from {@link PendingIntent#getBroadcast}. Cannot be null.
Paul Jensenbb2e0e92015-06-16 15:11:58 -04003112 * @throws IllegalArgumentException if {@code request} contains either
3113 * {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} or
3114 * {@link NetworkCapabilities#NET_CAPABILITY_CAPTIVE_PORTAL}.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003115 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07003116 public void requestNetwork(NetworkRequest request, PendingIntent operation) {
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003117 checkPendingIntent(operation);
Robert Greenwalt9258c642014-03-26 16:47:06 -07003118 try {
Robert Greenwalt6078b502014-06-11 16:05:07 -07003119 mService.pendingRequestForNetwork(request.networkCapabilities, operation);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003120 } catch (RemoteException e) {
3121 throw e.rethrowFromSystemServer();
3122 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07003123 }
3124
3125 /**
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003126 * Removes a request made via {@link #requestNetwork(NetworkRequest, android.app.PendingIntent)}
3127 * <p>
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09003128 * This method has the same behavior as
3129 * {@link #unregisterNetworkCallback(android.app.PendingIntent)} with respect to
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003130 * releasing network resources and disconnecting.
3131 *
3132 * @param operation A PendingIntent equal (as defined by {@link Intent#filterEquals}) to the
3133 * PendingIntent passed to
3134 * {@link #requestNetwork(NetworkRequest, android.app.PendingIntent)} with the
3135 * corresponding NetworkRequest you'd like to remove. Cannot be null.
3136 */
3137 public void releaseNetworkRequest(PendingIntent operation) {
3138 checkPendingIntent(operation);
3139 try {
3140 mService.releasePendingNetworkRequest(operation);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003141 } catch (RemoteException e) {
3142 throw e.rethrowFromSystemServer();
3143 }
Jeremy Joslin46e3ac82014-11-05 10:32:09 -08003144 }
3145
3146 private void checkPendingIntent(PendingIntent intent) {
3147 if (intent == null) {
3148 throw new IllegalArgumentException("PendingIntent cannot be null.");
3149 }
3150 }
3151
3152 /**
Robert Greenwalt9258c642014-03-26 16:47:06 -07003153 * Registers to receive notifications about all networks which satisfy the given
Robert Greenwalt6078b502014-06-11 16:05:07 -07003154 * {@link NetworkRequest}. The callbacks will continue to be called until
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09003155 * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003156 *
Robert Greenwalt6078b502014-06-11 16:05:07 -07003157 * @param request {@link NetworkRequest} describing this request.
3158 * @param networkCallback The {@link NetworkCallback} that the system will call as suitable
3159 * networks change state.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003160 * The callback is invoked on the default internal Handler.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003161 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003162 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Robert Greenwalt6078b502014-06-11 16:05:07 -07003163 public void registerNetworkCallback(NetworkRequest request, NetworkCallback networkCallback) {
Hugo Benichi2583ef02017-02-02 17:02:36 +09003164 registerNetworkCallback(request, networkCallback, getDefaultHandler());
3165 }
3166
3167 /**
3168 * Registers to receive notifications about all networks which satisfy the given
3169 * {@link NetworkRequest}. The callbacks will continue to be called until
3170 * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003171 *
3172 * @param request {@link NetworkRequest} describing this request.
3173 * @param networkCallback The {@link NetworkCallback} that the system will call as suitable
3174 * networks change state.
3175 * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003176 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003177 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Hugo Benichi2583ef02017-02-02 17:02:36 +09003178 public void registerNetworkCallback(
3179 NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
3180 CallbackHandler cbHandler = new CallbackHandler(handler);
3181 NetworkCapabilities nc = request.networkCapabilities;
3182 sendRequestForNetwork(nc, networkCallback, 0, LISTEN, TYPE_NONE, cbHandler);
Robert Greenwalt9258c642014-03-26 16:47:06 -07003183 }
3184
3185 /**
Paul Jensen694f2b82015-06-17 14:15:39 -04003186 * Registers a PendingIntent to be sent when a network is available which satisfies the given
3187 * {@link NetworkRequest}.
3188 *
3189 * This function behaves identically to the version that takes a NetworkCallback, but instead
3190 * of {@link NetworkCallback} a {@link PendingIntent} is used. This means
3191 * the request may outlive the calling application and get called back when a suitable
3192 * network is found.
3193 * <p>
3194 * The operation is an Intent broadcast that goes to a broadcast receiver that
3195 * you registered with {@link Context#registerReceiver} or through the
3196 * &lt;receiver&gt; tag in an AndroidManifest.xml file
3197 * <p>
3198 * The operation Intent is delivered with two extras, a {@link Network} typed
3199 * extra called {@link #EXTRA_NETWORK} and a {@link NetworkRequest}
3200 * typed extra called {@link #EXTRA_NETWORK_REQUEST} containing
3201 * the original requests parameters.
3202 * <p>
3203 * If there is already a request for this Intent registered (with the equality of
3204 * two Intents defined by {@link Intent#filterEquals}), then it will be removed and
3205 * replaced by this one, effectively releasing the previous {@link NetworkRequest}.
3206 * <p>
3207 * The request may be released normally by calling
Paul Jensenf2c1cfe2015-06-30 14:29:18 -04003208 * {@link #unregisterNetworkCallback(android.app.PendingIntent)}.
Paul Jensen694f2b82015-06-17 14:15:39 -04003209 * @param request {@link NetworkRequest} describing this request.
3210 * @param operation Action to perform when the network is available (corresponds
3211 * to the {@link NetworkCallback#onAvailable} call. Typically
3212 * comes from {@link PendingIntent#getBroadcast}. Cannot be null.
3213 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003214 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Paul Jensen694f2b82015-06-17 14:15:39 -04003215 public void registerNetworkCallback(NetworkRequest request, PendingIntent operation) {
3216 checkPendingIntent(operation);
3217 try {
3218 mService.pendingListenForNetwork(request.networkCapabilities, operation);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003219 } catch (RemoteException e) {
3220 throw e.rethrowFromSystemServer();
3221 }
Paul Jensen694f2b82015-06-17 14:15:39 -04003222 }
3223
3224 /**
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09003225 * Registers to receive notifications about changes in the system default network. The callbacks
3226 * will continue to be called until either the application exits or
3227 * {@link #unregisterNetworkCallback(NetworkCallback)} is called.
Erik Klinea2d29402016-03-16 15:31:39 +09003228 *
3229 * @param networkCallback The {@link NetworkCallback} that the system will call as the
3230 * system default network changes.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003231 * The callback is invoked on the default internal Handler.
Erik Klinea2d29402016-03-16 15:31:39 +09003232 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003233 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Erik Klinea2d29402016-03-16 15:31:39 +09003234 public void registerDefaultNetworkCallback(NetworkCallback networkCallback) {
Hugo Benichi2583ef02017-02-02 17:02:36 +09003235 registerDefaultNetworkCallback(networkCallback, getDefaultHandler());
3236 }
3237
3238 /**
3239 * Registers to receive notifications about changes in the system default network. The callbacks
3240 * will continue to be called until either the application exits or
3241 * {@link #unregisterNetworkCallback(NetworkCallback)} is called.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003242 *
3243 * @param networkCallback The {@link NetworkCallback} that the system will call as the
3244 * system default network changes.
3245 * @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003246 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003247 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Hugo Benichi2583ef02017-02-02 17:02:36 +09003248 public void registerDefaultNetworkCallback(NetworkCallback networkCallback, Handler handler) {
Erik Klinea2d29402016-03-16 15:31:39 +09003249 // This works because if the NetworkCapabilities are null,
3250 // ConnectivityService takes them from the default request.
3251 //
3252 // Since the capabilities are exactly the same as the default request's
3253 // capabilities, this request is guaranteed, at all times, to be
3254 // satisfied by the same network, if any, that satisfies the default
3255 // request, i.e., the system default network.
Hugo Benichi2583ef02017-02-02 17:02:36 +09003256 CallbackHandler cbHandler = new CallbackHandler(handler);
3257 sendRequestForNetwork(null, networkCallback, 0, REQUEST, TYPE_NONE, cbHandler);
Erik Klinea2d29402016-03-16 15:31:39 +09003258 }
3259
3260 /**
fengludb571472015-04-21 17:12:05 -07003261 * Requests bandwidth update for a given {@link Network} and returns whether the update request
3262 * is accepted by ConnectivityService. Once accepted, ConnectivityService will poll underlying
3263 * network connection for updated bandwidth information. The caller will be notified via
3264 * {@link ConnectivityManager.NetworkCallback} if there is an update. Notice that this
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09003265 * method assumes that the caller has previously called
3266 * {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} to listen for network
3267 * changes.
fenglub15e72b2015-03-20 11:29:56 -07003268 *
fengluae519192015-04-27 14:28:04 -07003269 * @param network {@link Network} specifying which network you're interested.
fengludb571472015-04-21 17:12:05 -07003270 * @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
fenglub15e72b2015-03-20 11:29:56 -07003271 */
fengludb571472015-04-21 17:12:05 -07003272 public boolean requestBandwidthUpdate(Network network) {
fenglub15e72b2015-03-20 11:29:56 -07003273 try {
fengludb571472015-04-21 17:12:05 -07003274 return mService.requestBandwidthUpdate(network);
fenglub15e72b2015-03-20 11:29:56 -07003275 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003276 throw e.rethrowFromSystemServer();
fenglub15e72b2015-03-20 11:29:56 -07003277 }
3278 }
3279
3280 /**
Robert Greenwalt6078b502014-06-11 16:05:07 -07003281 * Unregisters callbacks about and possibly releases networks originating from
Lorenzo Colitti88bc0bb2016-04-13 22:00:02 +09003282 * {@link #requestNetwork(NetworkRequest, NetworkCallback)} and
3283 * {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} calls.
3284 * If the given {@code NetworkCallback} had previously been used with
Lorenzo Colitti2ea89e52015-04-24 17:03:31 +09003285 * {@code #requestNetwork}, any networks that had been connected to only to satisfy that request
3286 * will be disconnected.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003287 *
Robert Greenwalt6078b502014-06-11 16:05:07 -07003288 * @param networkCallback The {@link NetworkCallback} used when making the request.
Robert Greenwalt9258c642014-03-26 16:47:06 -07003289 */
Robert Greenwalt6078b502014-06-11 16:05:07 -07003290 public void unregisterNetworkCallback(NetworkCallback networkCallback) {
3291 if (networkCallback == null || networkCallback.networkRequest == null ||
3292 networkCallback.networkRequest.requestId == REQUEST_ID_UNSET) {
3293 throw new IllegalArgumentException("Invalid NetworkCallback");
3294 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07003295 try {
Hugo Benichi39e10e82016-07-07 09:36:12 +09003296 // CallbackHandler will release callback when receiving CALLBACK_RELEASED.
Robert Greenwalt6078b502014-06-11 16:05:07 -07003297 mService.releaseNetworkRequest(networkCallback.networkRequest);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003298 } catch (RemoteException e) {
3299 throw e.rethrowFromSystemServer();
3300 }
Robert Greenwalt9258c642014-03-26 16:47:06 -07003301 }
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003302
3303 /**
Paul Jensenf2c1cfe2015-06-30 14:29:18 -04003304 * Unregisters a callback previously registered via
3305 * {@link #registerNetworkCallback(NetworkRequest, android.app.PendingIntent)}.
3306 *
3307 * @param operation A PendingIntent equal (as defined by {@link Intent#filterEquals}) to the
3308 * PendingIntent passed to
3309 * {@link #registerNetworkCallback(NetworkRequest, android.app.PendingIntent)}.
3310 * Cannot be null.
3311 */
3312 public void unregisterNetworkCallback(PendingIntent operation) {
3313 releaseNetworkRequest(operation);
3314 }
3315
3316 /**
Lorenzo Colittie03c3c72015-04-03 16:38:52 +09003317 * Informs the system whether it should switch to {@code network} regardless of whether it is
3318 * validated or not. If {@code accept} is true, and the network was explicitly selected by the
3319 * user (e.g., by selecting a Wi-Fi network in the Settings app), then the network will become
3320 * the system default network regardless of any other network that's currently connected. If
3321 * {@code always} is true, then the choice is remembered, so that the next time the user
3322 * connects to this network, the system will switch to it.
3323 *
Lorenzo Colittie03c3c72015-04-03 16:38:52 +09003324 * @param network The network to accept.
3325 * @param accept Whether to accept the network even if unvalidated.
3326 * @param always Whether to remember this choice in the future.
3327 *
3328 * @hide
3329 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003330 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Lorenzo Colittie03c3c72015-04-03 16:38:52 +09003331 public void setAcceptUnvalidated(Network network, boolean accept, boolean always) {
3332 try {
3333 mService.setAcceptUnvalidated(network, accept, always);
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003334 } catch (RemoteException e) {
3335 throw e.rethrowFromSystemServer();
3336 }
Lorenzo Colittie03c3c72015-04-03 16:38:52 +09003337 }
3338
3339 /**
Lorenzo Colitti165c51c2016-09-19 01:00:19 +09003340 * Informs the system to penalize {@code network}'s score when it becomes unvalidated. This is
3341 * only meaningful if the system is configured not to penalize such networks, e.g., if the
3342 * {@code config_networkAvoidBadWifi} configuration variable is set to 0 and the {@code
3343 * NETWORK_AVOID_BAD_WIFI setting is unset}.
3344 *
Lorenzo Colitti165c51c2016-09-19 01:00:19 +09003345 * @param network The network to accept.
3346 *
3347 * @hide
3348 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003349 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
Lorenzo Colitti165c51c2016-09-19 01:00:19 +09003350 public void setAvoidUnvalidated(Network network) {
3351 try {
3352 mService.setAvoidUnvalidated(network);
3353 } catch (RemoteException e) {
3354 throw e.rethrowFromSystemServer();
3355 }
3356 }
3357
3358 /**
Lorenzo Colitti4734cdb2017-04-27 14:30:21 +09003359 * Requests that the system open the captive portal app on the specified network.
3360 *
3361 * @param network The network to log into.
3362 *
3363 * @hide
3364 */
3365 @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
3366 public void startCaptivePortalApp(Network network) {
3367 try {
3368 mService.startCaptivePortalApp(network);
3369 } catch (RemoteException e) {
3370 throw e.rethrowFromSystemServer();
3371 }
3372 }
3373
3374 /**
Lorenzo Colitti2de49252017-01-24 18:08:41 +09003375 * It is acceptable to briefly use multipath data to provide seamless connectivity for
3376 * time-sensitive user-facing operations when the system default network is temporarily
Lorenzo Colitti15fd4392017-04-28 00:56:30 +09003377 * unresponsive. The amount of data should be limited (less than one megabyte for every call to
3378 * this method), and the operation should be infrequent to ensure that data usage is limited.
Lorenzo Colitti2de49252017-01-24 18:08:41 +09003379 *
3380 * An example of such an operation might be a time-sensitive foreground activity, such as a
3381 * voice command, that the user is performing while walking out of range of a Wi-Fi network.
3382 */
3383 public static final int MULTIPATH_PREFERENCE_HANDOVER = 1 << 0;
3384
3385 /**
3386 * It is acceptable to use small amounts of multipath data on an ongoing basis to provide
3387 * a backup channel for traffic that is primarily going over another network.
3388 *
3389 * An example might be maintaining backup connections to peers or servers for the purpose of
3390 * fast fallback if the default network is temporarily unresponsive or disconnects. The traffic
3391 * on backup paths should be negligible compared to the traffic on the main path.
3392 */
3393 public static final int MULTIPATH_PREFERENCE_RELIABILITY = 1 << 1;
3394
3395 /**
3396 * It is acceptable to use metered data to improve network latency and performance.
3397 */
3398 public static final int MULTIPATH_PREFERENCE_PERFORMANCE = 1 << 2;
3399
3400 /**
3401 * Return value to use for unmetered networks. On such networks we currently set all the flags
3402 * to true.
3403 * @hide
3404 */
3405 public static final int MULTIPATH_PREFERENCE_UNMETERED =
3406 MULTIPATH_PREFERENCE_HANDOVER |
3407 MULTIPATH_PREFERENCE_RELIABILITY |
3408 MULTIPATH_PREFERENCE_PERFORMANCE;
3409
3410 /** @hide */
3411 @Retention(RetentionPolicy.SOURCE)
3412 @IntDef(flag = true, value = {
3413 MULTIPATH_PREFERENCE_HANDOVER,
3414 MULTIPATH_PREFERENCE_RELIABILITY,
3415 MULTIPATH_PREFERENCE_PERFORMANCE,
3416 })
3417 public @interface MultipathPreference {
3418 }
3419
3420 /**
3421 * Provides a hint to the calling application on whether it is desirable to use the
3422 * multinetwork APIs (e.g., {@link Network#openConnection}, {@link Network#bindSocket}, etc.)
3423 * for multipath data transfer on this network when it is not the system default network.
3424 * Applications desiring to use multipath network protocols should call this method before
3425 * each such operation.
Lorenzo Colitti2de49252017-01-24 18:08:41 +09003426 *
3427 * @param network The network on which the application desires to use multipath data.
3428 * If {@code null}, this method will return the a preference that will generally
3429 * apply to metered networks.
3430 * @return a bitwise OR of zero or more of the {@code MULTIPATH_PREFERENCE_*} constants.
3431 */
Jeff Sharkey30e06bb2017-04-24 11:18:03 -06003432 @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
Lorenzo Colitti2de49252017-01-24 18:08:41 +09003433 public @MultipathPreference int getMultipathPreference(Network network) {
3434 try {
3435 return mService.getMultipathPreference(network);
3436 } catch (RemoteException e) {
3437 throw e.rethrowFromSystemServer();
3438 }
3439 }
3440
3441 /**
Stuart Scott984dc852015-03-30 13:17:11 -07003442 * Resets all connectivity manager settings back to factory defaults.
3443 * @hide
3444 */
3445 public void factoryReset() {
Stuart Scott984dc852015-03-30 13:17:11 -07003446 try {
Stuart Scottf1fb3972015-04-02 18:00:02 -07003447 mService.factoryReset();
Stuart Scott984dc852015-03-30 13:17:11 -07003448 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003449 throw e.rethrowFromSystemServer();
Stuart Scott984dc852015-03-30 13:17:11 -07003450 }
3451 }
3452
3453 /**
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003454 * Binds the current process to {@code network}. All Sockets created in the future
3455 * (and not explicitly bound via a bound SocketFactory from
3456 * {@link Network#getSocketFactory() Network.getSocketFactory()}) will be bound to
3457 * {@code network}. All host name resolutions will be limited to {@code network} as well.
3458 * Note that if {@code network} ever disconnects, all Sockets created in this way will cease to
3459 * work and all host name resolutions will fail. This is by design so an application doesn't
3460 * accidentally use Sockets it thinks are still bound to a particular {@link Network}.
3461 * To clear binding pass {@code null} for {@code network}. Using individually bound
3462 * Sockets created by Network.getSocketFactory().createSocket() and
3463 * performing network-specific host name resolutions via
3464 * {@link Network#getAllByName Network.getAllByName} is preferred to calling
Paul Jensen72db88e2015-03-10 10:54:12 -04003465 * {@code bindProcessToNetwork}.
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003466 *
3467 * @param network The {@link Network} to bind the current process to, or {@code null} to clear
3468 * the current binding.
3469 * @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
3470 */
Paul Jensen72db88e2015-03-10 10:54:12 -04003471 public boolean bindProcessToNetwork(Network network) {
3472 // Forcing callers to call thru non-static function ensures ConnectivityManager
3473 // instantiated.
3474 return setProcessDefaultNetwork(network);
3475 }
3476
3477 /**
3478 * Binds the current process to {@code network}. All Sockets created in the future
3479 * (and not explicitly bound via a bound SocketFactory from
3480 * {@link Network#getSocketFactory() Network.getSocketFactory()}) will be bound to
3481 * {@code network}. All host name resolutions will be limited to {@code network} as well.
3482 * Note that if {@code network} ever disconnects, all Sockets created in this way will cease to
3483 * work and all host name resolutions will fail. This is by design so an application doesn't
3484 * accidentally use Sockets it thinks are still bound to a particular {@link Network}.
3485 * To clear binding pass {@code null} for {@code network}. Using individually bound
3486 * Sockets created by Network.getSocketFactory().createSocket() and
3487 * performing network-specific host name resolutions via
3488 * {@link Network#getAllByName Network.getAllByName} is preferred to calling
3489 * {@code setProcessDefaultNetwork}.
3490 *
3491 * @param network The {@link Network} to bind the current process to, or {@code null} to clear
3492 * the current binding.
3493 * @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
3494 * @deprecated This function can throw {@link IllegalStateException}. Use
3495 * {@link #bindProcessToNetwork} instead. {@code bindProcessToNetwork}
3496 * is a direct replacement.
3497 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07003498 @Deprecated
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003499 public static boolean setProcessDefaultNetwork(Network network) {
Paul Jensenc91b5342014-08-27 12:38:45 -04003500 int netId = (network == null) ? NETID_UNSET : network.netId;
Paul Jensen72db88e2015-03-10 10:54:12 -04003501 if (netId == NetworkUtils.getBoundNetworkForProcess()) {
Paul Jensenc91b5342014-08-27 12:38:45 -04003502 return true;
3503 }
3504 if (NetworkUtils.bindProcessToNetwork(netId)) {
Paul Jensene0bef712014-12-10 15:12:18 -05003505 // Set HTTP proxy system properties to match network.
3506 // TODO: Deprecate this static method and replace it with a non-static version.
Lorenzo Colittiec4c5552015-04-22 11:52:48 +09003507 try {
3508 Proxy.setHttpProxySystemProperty(getInstance().getDefaultProxy());
3509 } catch (SecurityException e) {
3510 // The process doesn't have ACCESS_NETWORK_STATE, so we can't fetch the proxy.
3511 Log.e(TAG, "Can't set proxy properties", e);
3512 }
Paul Jensenc91b5342014-08-27 12:38:45 -04003513 // Must flush DNS cache as new network may have different DNS resolutions.
3514 InetAddress.clearDnsCache();
3515 // Must flush socket pool as idle sockets will be bound to previous network and may
3516 // cause subsequent fetches to be performed on old network.
3517 NetworkEventDispatcher.getInstance().onNetworkConfigurationChanged();
3518 return true;
3519 } else {
3520 return false;
3521 }
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003522 }
3523
3524 /**
3525 * Returns the {@link Network} currently bound to this process via
Paul Jensen72db88e2015-03-10 10:54:12 -04003526 * {@link #bindProcessToNetwork}, or {@code null} if no {@link Network} is explicitly bound.
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003527 *
3528 * @return {@code Network} to which this process is bound, or {@code null}.
3529 */
Paul Jensen72db88e2015-03-10 10:54:12 -04003530 public Network getBoundNetworkForProcess() {
3531 // Forcing callers to call thru non-static function ensures ConnectivityManager
3532 // instantiated.
3533 return getProcessDefaultNetwork();
3534 }
3535
3536 /**
3537 * Returns the {@link Network} currently bound to this process via
3538 * {@link #bindProcessToNetwork}, or {@code null} if no {@link Network} is explicitly bound.
3539 *
3540 * @return {@code Network} to which this process is bound, or {@code null}.
3541 * @deprecated Using this function can lead to other functions throwing
3542 * {@link IllegalStateException}. Use {@link #getBoundNetworkForProcess} instead.
3543 * {@code getBoundNetworkForProcess} is a direct replacement.
3544 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07003545 @Deprecated
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003546 public static Network getProcessDefaultNetwork() {
Paul Jensen72db88e2015-03-10 10:54:12 -04003547 int netId = NetworkUtils.getBoundNetworkForProcess();
Paul Jensenbcc76d32014-07-11 08:17:29 -04003548 if (netId == NETID_UNSET) return null;
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003549 return new Network(netId);
3550 }
3551
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09003552 private void unsupportedStartingFrom(int version) {
3553 if (Process.myUid() == Process.SYSTEM_UID) {
3554 // The getApplicationInfo() call we make below is not supported in system context, and
3555 // we want to allow the system to use these APIs anyway.
3556 return;
3557 }
3558
3559 if (mContext.getApplicationInfo().targetSdkVersion >= version) {
3560 throw new UnsupportedOperationException(
3561 "This method is not supported in target SDK version " + version + " and above");
3562 }
3563 }
3564
3565 // Checks whether the calling app can use the legacy routing API (startUsingNetworkFeature,
3566 // stopUsingNetworkFeature, requestRouteToHost), and if not throw UnsupportedOperationException.
Lifu Tang30f95a72016-01-07 23:20:38 -08003567 // TODO: convert the existing system users (Tethering, GnssLocationProvider) to the new APIs and
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09003568 // remove these exemptions. Note that this check is not secure, and apps can still access these
3569 // functions by accessing ConnectivityService directly. However, it should be clear that doing
3570 // so is unsupported and may break in the future. http://b/22728205
3571 private void checkLegacyRoutingApiAccess() {
3572 if (mContext.checkCallingOrSelfPermission("com.android.permission.INJECT_OMADM_SETTINGS")
3573 == PackageManager.PERMISSION_GRANTED) {
3574 return;
3575 }
3576
Dianne Hackborn692a2442015-07-31 10:35:34 -07003577 unsupportedStartingFrom(VERSION_CODES.M);
Lorenzo Colittiffc42b02015-07-29 11:41:21 +09003578 }
3579
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003580 /**
3581 * Binds host resolutions performed by this process to {@code network}.
Paul Jensen72db88e2015-03-10 10:54:12 -04003582 * {@link #bindProcessToNetwork} takes precedence over this setting.
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003583 *
3584 * @param network The {@link Network} to bind host resolutions from the current process to, or
3585 * {@code null} to clear the current binding.
3586 * @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
3587 * @hide
3588 * @deprecated This is strictly for legacy usage to support {@link #startUsingNetworkFeature}.
3589 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -07003590 @Deprecated
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003591 public static boolean setProcessDefaultNetworkForHostResolution(Network network) {
Paul Jensenbcc76d32014-07-11 08:17:29 -04003592 return NetworkUtils.bindProcessToNetworkForHostResolution(
3593 network == null ? NETID_UNSET : network.netId);
Paul Jensen6d3ff9e2014-05-29 10:12:39 -04003594 }
Felipe Leme1b103232016-01-22 09:44:57 -08003595
3596 /**
3597 * Device is not restricting metered network activity while application is running on
3598 * background.
3599 */
3600 public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1;
3601
3602 /**
3603 * Device is restricting metered network activity while application is running on background,
3604 * but application is allowed to bypass it.
3605 * <p>
3606 * In this state, application should take action to mitigate metered network access.
3607 * For example, a music streaming application should switch to a low-bandwidth bitrate.
3608 */
3609 public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2;
3610
3611 /**
3612 * Device is restricting metered network activity while application is running on background.
Felipe Leme9778f762016-01-27 14:46:39 -08003613 * <p>
Felipe Leme1b103232016-01-22 09:44:57 -08003614 * In this state, application should not try to use the network while running on background,
3615 * because it would be denied.
3616 */
3617 public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3;
3618
Felipe Leme9778f762016-01-27 14:46:39 -08003619 /**
3620 * A change in the background metered network activity restriction has occurred.
3621 * <p>
3622 * Applications should call {@link #getRestrictBackgroundStatus()} to check if the restriction
3623 * applies to them.
3624 * <p>
3625 * This is only sent to registered receivers, not manifest receivers.
3626 */
3627 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3628 public static final String ACTION_RESTRICT_BACKGROUND_CHANGED =
3629 "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
3630
Felipe Lemeecfccea2016-01-25 11:48:04 -08003631 /** @hide */
3632 @Retention(RetentionPolicy.SOURCE)
Felipe Leme1b103232016-01-22 09:44:57 -08003633 @IntDef(flag = false, value = {
3634 RESTRICT_BACKGROUND_STATUS_DISABLED,
3635 RESTRICT_BACKGROUND_STATUS_WHITELISTED,
3636 RESTRICT_BACKGROUND_STATUS_ENABLED,
3637 })
Felipe Leme1b103232016-01-22 09:44:57 -08003638 public @interface RestrictBackgroundStatus {
3639 }
3640
3641 private INetworkPolicyManager getNetworkPolicyManager() {
3642 synchronized (this) {
3643 if (mNPManager != null) {
3644 return mNPManager;
3645 }
3646 mNPManager = INetworkPolicyManager.Stub.asInterface(ServiceManager
3647 .getService(Context.NETWORK_POLICY_SERVICE));
3648 return mNPManager;
3649 }
3650 }
3651
3652 /**
3653 * Determines if the calling application is subject to metered network restrictions while
3654 * running on background.
Felipe Lemec9c7be52016-05-16 13:57:19 -07003655 *
3656 * @return {@link #RESTRICT_BACKGROUND_STATUS_DISABLED},
3657 * {@link #RESTRICT_BACKGROUND_STATUS_ENABLED},
3658 * or {@link #RESTRICT_BACKGROUND_STATUS_WHITELISTED}
Felipe Leme1b103232016-01-22 09:44:57 -08003659 */
3660 public @RestrictBackgroundStatus int getRestrictBackgroundStatus() {
3661 try {
3662 return getNetworkPolicyManager().getRestrictBackgroundByCaller();
3663 } catch (RemoteException e) {
Jeff Sharkeyc53962d2016-03-01 19:27:23 -07003664 throw e.rethrowFromSystemServer();
Felipe Leme1b103232016-01-22 09:44:57 -08003665 }
3666 }
Andreas Gampe34802132016-04-20 14:33:51 -07003667
3668 /**
3669 * A holder class for debug info (mapping CALLBACK values to field names). This is stored
3670 * in a holder for two reasons:
3671 * 1) The reflection necessary to establish the map can't be run at compile-time. Thus, this
3672 * code will make the enclosing class not compile-time initializeable, deferring its
3673 * initialization to zygote startup. This leads to dirty (but shared) memory.
3674 * As this is debug info, use a holder that isn't initialized by default. This way the map
3675 * will be created on demand, while ConnectivityManager can be compile-time initialized.
3676 * 2) Static initialization is still preferred for its strong thread safety guarantees without
3677 * requiring a lock.
3678 */
3679 private static class NoPreloadHolder {
3680 public static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames(
3681 new Class[]{ConnectivityManager.class}, new String[]{"CALLBACK_"});
3682 }
3683
3684 static {
3685 // When debug is enabled, aggressively initialize the holder by touching the field (which
3686 // will guarantee static initialization).
3687 if (CallbackHandler.DBG) {
3688 Object dummy = NoPreloadHolder.sMagicDecoderRing;
3689 }
3690 }
3691
3692 private static final String whatToString(int what) {
3693 return NoPreloadHolder.sMagicDecoderRing.get(what, Integer.toString(what));
3694 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003695}