blob: 7664c959f6e386b4fcea19c008f0dfa4395e37a7 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
19import android.os.Parcelable;
20import android.os.Parcel;
21
Jeff Sharkey836ecb52013-01-03 11:21:24 -080022import com.android.internal.annotations.VisibleForTesting;
23
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080024import java.util.EnumMap;
25
26/**
Scott Main671644c2011-10-06 19:02:28 -070027 * Describes the status of a network interface.
28 * <p>Use {@link ConnectivityManager#getActiveNetworkInfo()} to get an instance that represents
29 * the current network connection.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030 */
31public class NetworkInfo implements Parcelable {
32
33 /**
34 * Coarse-grained network state. This is probably what most applications should
35 * use, rather than {@link android.net.NetworkInfo.DetailedState DetailedState}.
36 * The mapping between the two is as follows:
37 * <br/><br/>
38 * <table>
39 * <tr><td><b>Detailed state</b></td><td><b>Coarse-grained state</b></td></tr>
40 * <tr><td><code>IDLE</code></td><td><code>DISCONNECTED</code></td></tr>
41 * <tr><td><code>SCANNING</code></td><td><code>CONNECTING</code></td></tr>
42 * <tr><td><code>CONNECTING</code></td><td><code>CONNECTING</code></td></tr>
43 * <tr><td><code>AUTHENTICATING</code></td><td><code>CONNECTING</code></td></tr>
Scott Main671644c2011-10-06 19:02:28 -070044 * <tr><td><code>CONNECTED</code></td><td><code>CONNECTED</code></td></tr>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 * <tr><td><code>DISCONNECTING</code></td><td><code>DISCONNECTING</code></td></tr>
46 * <tr><td><code>DISCONNECTED</code></td><td><code>DISCONNECTED</code></td></tr>
47 * <tr><td><code>UNAVAILABLE</code></td><td><code>DISCONNECTED</code></td></tr>
48 * <tr><td><code>FAILED</code></td><td><code>DISCONNECTED</code></td></tr>
49 * </table>
50 */
51 public enum State {
52 CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN
53 }
54
55 /**
56 * The fine-grained state of a network connection. This level of detail
57 * is probably of interest to few applications. Most should use
58 * {@link android.net.NetworkInfo.State State} instead.
59 */
60 public enum DetailedState {
61 /** Ready to start data connection setup. */
62 IDLE,
63 /** Searching for an available access point. */
64 SCANNING,
65 /** Currently setting up data connection. */
66 CONNECTING,
67 /** Network link established, performing authentication. */
68 AUTHENTICATING,
69 /** Awaiting response from DHCP server in order to assign IP address information. */
70 OBTAINING_IPADDR,
71 /** IP traffic should be available. */
72 CONNECTED,
73 /** IP traffic is suspended */
74 SUSPENDED,
75 /** Currently tearing down data connection. */
76 DISCONNECTING,
77 /** IP traffic not available. */
78 DISCONNECTED,
79 /** Attempt to connect failed. */
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -070080 FAILED,
81 /** Access to this network is blocked. */
Irfan Sheriff07573b32012-01-27 21:00:19 -080082 BLOCKED,
83 /** Link has poor connectivity. */
Irfan Sheriffda6da092012-08-16 12:49:23 -070084 VERIFYING_POOR_LINK,
85 /** Checking if network is a captive portal */
Wink Saville67c38212013-09-05 12:02:25 -070086 CAPTIVE_PORTAL_CHECK
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080087 }
88
89 /**
90 * This is the map described in the Javadoc comment above. The positions
91 * of the elements of the array must correspond to the ordinal values
92 * of <code>DetailedState</code>.
93 */
94 private static final EnumMap<DetailedState, State> stateMap =
95 new EnumMap<DetailedState, State>(DetailedState.class);
96
97 static {
98 stateMap.put(DetailedState.IDLE, State.DISCONNECTED);
99 stateMap.put(DetailedState.SCANNING, State.DISCONNECTED);
100 stateMap.put(DetailedState.CONNECTING, State.CONNECTING);
101 stateMap.put(DetailedState.AUTHENTICATING, State.CONNECTING);
102 stateMap.put(DetailedState.OBTAINING_IPADDR, State.CONNECTING);
Irfan Sheriff07573b32012-01-27 21:00:19 -0800103 stateMap.put(DetailedState.VERIFYING_POOR_LINK, State.CONNECTING);
Irfan Sheriffda6da092012-08-16 12:49:23 -0700104 stateMap.put(DetailedState.CAPTIVE_PORTAL_CHECK, State.CONNECTING);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800105 stateMap.put(DetailedState.CONNECTED, State.CONNECTED);
106 stateMap.put(DetailedState.SUSPENDED, State.SUSPENDED);
107 stateMap.put(DetailedState.DISCONNECTING, State.DISCONNECTING);
108 stateMap.put(DetailedState.DISCONNECTED, State.DISCONNECTED);
109 stateMap.put(DetailedState.FAILED, State.DISCONNECTED);
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700110 stateMap.put(DetailedState.BLOCKED, State.DISCONNECTED);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111 }
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700112
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800113 private int mNetworkType;
114 private int mSubtype;
115 private String mTypeName;
116 private String mSubtypeName;
117 private State mState;
118 private DetailedState mDetailedState;
119 private String mReason;
120 private String mExtraInfo;
121 private boolean mIsFailover;
122 private boolean mIsRoaming;
Wink Saville67c38212013-09-05 12:02:25 -0700123 private boolean mIsConnectedToProvisioningNetwork;
124
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800125 /**
126 * Indicates whether network connectivity is possible:
127 */
128 private boolean mIsAvailable;
129
130 /**
Irfan Sheriffd649c122010-06-09 15:39:36 -0700131 * @hide
132 */
133 public NetworkInfo(int type, int subtype, String typeName, String subtypeName) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800134 if (!ConnectivityManager.isNetworkTypeValid(type)) {
135 throw new IllegalArgumentException("Invalid network type: " + type);
136 }
137 mNetworkType = type;
138 mSubtype = subtype;
139 mTypeName = typeName;
140 mSubtypeName = subtypeName;
141 setDetailedState(DetailedState.IDLE, null, null);
142 mState = State.UNKNOWN;
Robert Greenwalt8206ff32009-09-10 15:06:20 -0700143 mIsAvailable = false; // until we're told otherwise, assume unavailable
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800144 mIsRoaming = false;
Wink Saville67c38212013-09-05 12:02:25 -0700145 mIsConnectedToProvisioningNetwork = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800146 }
147
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700148 /** {@hide} */
149 public NetworkInfo(NetworkInfo source) {
150 if (source != null) {
Narayan Kamath12b28ce2013-10-11 13:43:30 +0100151 synchronized (source) {
152 mNetworkType = source.mNetworkType;
153 mSubtype = source.mSubtype;
154 mTypeName = source.mTypeName;
155 mSubtypeName = source.mSubtypeName;
156 mState = source.mState;
157 mDetailedState = source.mDetailedState;
158 mReason = source.mReason;
159 mExtraInfo = source.mExtraInfo;
160 mIsFailover = source.mIsFailover;
161 mIsRoaming = source.mIsRoaming;
162 mIsAvailable = source.mIsAvailable;
163 mIsConnectedToProvisioningNetwork = source.mIsConnectedToProvisioningNetwork;
164 }
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -0700165 }
166 }
167
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800168 /**
Scott Main671644c2011-10-06 19:02:28 -0700169 * Reports the type of network to which the
170 * info in this {@code NetworkInfo} pertains.
171 * @return one of {@link ConnectivityManager#TYPE_MOBILE}, {@link
172 * ConnectivityManager#TYPE_WIFI}, {@link ConnectivityManager#TYPE_WIMAX}, {@link
173 * ConnectivityManager#TYPE_ETHERNET}, {@link ConnectivityManager#TYPE_BLUETOOTH}, or other
174 * types defined by {@link ConnectivityManager}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800175 */
176 public int getType() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700177 synchronized (this) {
178 return mNetworkType;
179 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 }
181
182 /**
Robert Greenwaltb90b20b2014-06-02 15:32:02 -0700183 * @hide
184 */
185 public void setType(int type) {
186 synchronized (this) {
187 mNetworkType = type;
188 }
189 }
190
191 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 * Return a network-type-specific integer describing the subtype
193 * of the network.
194 * @return the network subtype
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800195 */
196 public int getSubtype() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700197 synchronized (this) {
198 return mSubtype;
199 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 }
201
Robert Greenwalt3192dec2014-05-27 13:20:24 -0700202 /**
203 * @hide
204 */
205 public void setSubtype(int subtype, String subtypeName) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700206 synchronized (this) {
207 mSubtype = subtype;
208 mSubtypeName = subtypeName;
209 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800210 }
211
212 /**
213 * Return a human-readable name describe the type of the network,
214 * for example "WIFI" or "MOBILE".
215 * @return the name of the network type
216 */
217 public String getTypeName() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700218 synchronized (this) {
219 return mTypeName;
220 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800221 }
222
223 /**
224 * Return a human-readable name describing the subtype of the network.
225 * @return the name of the network subtype
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800226 */
227 public String getSubtypeName() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700228 synchronized (this) {
229 return mSubtypeName;
230 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231 }
232
233 /**
234 * Indicates whether network connectivity exists or is in the process
235 * of being established. This is good for applications that need to
236 * do anything related to the network other than read or write data.
237 * For the latter, call {@link #isConnected()} instead, which guarantees
238 * that the network is fully usable.
239 * @return {@code true} if network connectivity exists or is in the process
240 * of being established, {@code false} otherwise.
241 */
242 public boolean isConnectedOrConnecting() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700243 synchronized (this) {
244 return mState == State.CONNECTED || mState == State.CONNECTING;
245 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800246 }
247
248 /**
249 * Indicates whether network connectivity exists and it is possible to establish
250 * connections and pass data.
Scott Main671644c2011-10-06 19:02:28 -0700251 * <p>Always call this before attempting to perform data transactions.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252 * @return {@code true} if network connectivity exists, {@code false} otherwise.
253 */
254 public boolean isConnected() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700255 synchronized (this) {
256 return mState == State.CONNECTED;
257 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800258 }
259
260 /**
261 * Indicates whether network connectivity is possible. A network is unavailable
262 * when a persistent or semi-persistent condition prevents the possibility
263 * of connecting to that network. Examples include
264 * <ul>
265 * <li>The device is out of the coverage area for any network of this type.</li>
266 * <li>The device is on a network other than the home network (i.e., roaming), and
267 * data roaming has been disabled.</li>
268 * <li>The device's radio is turned off, e.g., because airplane mode is enabled.</li>
269 * </ul>
270 * @return {@code true} if the network is available, {@code false} otherwise
271 */
272 public boolean isAvailable() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700273 synchronized (this) {
274 return mIsAvailable;
275 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800276 }
277
278 /**
279 * Sets if the network is available, ie, if the connectivity is possible.
280 * @param isAvailable the new availability value.
281 *
282 * @hide
283 */
284 public void setIsAvailable(boolean isAvailable) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700285 synchronized (this) {
286 mIsAvailable = isAvailable;
287 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800288 }
289
290 /**
291 * Indicates whether the current attempt to connect to the network
292 * resulted from the ConnectivityManager trying to fail over to this
293 * network following a disconnect from another network.
294 * @return {@code true} if this is a failover attempt, {@code false}
295 * otherwise.
296 */
297 public boolean isFailover() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700298 synchronized (this) {
299 return mIsFailover;
300 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301 }
302
303 /**
304 * Set the failover boolean.
305 * @param isFailover {@code true} to mark the current connection attempt
306 * as a failover.
307 * @hide
308 */
309 public void setFailover(boolean isFailover) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700310 synchronized (this) {
311 mIsFailover = isFailover;
312 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800313 }
314
315 /**
316 * Indicates whether the device is currently roaming on this network.
317 * When {@code true}, it suggests that use of data on this network
318 * may incur extra costs.
319 * @return {@code true} if roaming is in effect, {@code false} otherwise.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800320 */
321 public boolean isRoaming() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700322 synchronized (this) {
323 return mIsRoaming;
324 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800325 }
326
Jeff Sharkey836ecb52013-01-03 11:21:24 -0800327 /** {@hide} */
328 @VisibleForTesting
329 public void setRoaming(boolean isRoaming) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700330 synchronized (this) {
331 mIsRoaming = isRoaming;
332 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800333 }
334
Wink Saville67c38212013-09-05 12:02:25 -0700335 /** {@hide} */
336 @VisibleForTesting
337 public boolean isConnectedToProvisioningNetwork() {
338 synchronized (this) {
339 return mIsConnectedToProvisioningNetwork;
340 }
341 }
342
343 /** {@hide} */
344 @VisibleForTesting
345 public void setIsConnectedToProvisioningNetwork(boolean val) {
346 synchronized (this) {
347 mIsConnectedToProvisioningNetwork = val;
348 }
349 }
350
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351 /**
352 * Reports the current coarse-grained state of the network.
353 * @return the coarse-grained state
354 */
355 public State getState() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700356 synchronized (this) {
357 return mState;
358 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800359 }
360
361 /**
362 * Reports the current fine-grained state of the network.
363 * @return the fine-grained state
364 */
365 public DetailedState getDetailedState() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700366 synchronized (this) {
367 return mDetailedState;
368 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800369 }
370
371 /**
372 * Sets the fine-grained state of the network.
373 * @param detailedState the {@link DetailedState}.
374 * @param reason a {@code String} indicating the reason for the state change,
375 * if one was supplied. May be {@code null}.
376 * @param extraInfo an optional {@code String} providing addditional network state
377 * information passed up from the lower networking layers.
Irfan Sheriffd649c122010-06-09 15:39:36 -0700378 * @hide
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800379 */
Irfan Sheriffd649c122010-06-09 15:39:36 -0700380 public void setDetailedState(DetailedState detailedState, String reason, String extraInfo) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700381 synchronized (this) {
382 this.mDetailedState = detailedState;
383 this.mState = stateMap.get(detailedState);
384 this.mReason = reason;
385 this.mExtraInfo = extraInfo;
386 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800387 }
388
389 /**
Doug Zongkerd60ae7f2011-11-03 12:45:42 -0700390 * Set the extraInfo field.
391 * @param extraInfo an optional {@code String} providing addditional network state
392 * information passed up from the lower networking layers.
393 * @hide
394 */
395 public void setExtraInfo(String extraInfo) {
396 synchronized (this) {
397 this.mExtraInfo = extraInfo;
398 }
399 }
400
401 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800402 * Report the reason an attempt to establish connectivity failed,
403 * if one is available.
404 * @return the reason for failure, or null if not available
405 */
406 public String getReason() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700407 synchronized (this) {
408 return mReason;
409 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800410 }
411
412 /**
413 * Report the extra information about the network state, if any was
414 * provided by the lower networking layers.,
415 * if one is available.
416 * @return the extra information, or null if not available
417 */
418 public String getExtraInfo() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700419 synchronized (this) {
420 return mExtraInfo;
421 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800422 }
423
424 @Override
425 public String toString() {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700426 synchronized (this) {
Robert Greenwaltc9c90c72014-05-13 15:36:27 -0700427 StringBuilder builder = new StringBuilder("[");
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700428 builder.append("type: ").append(getTypeName()).append("[").append(getSubtypeName()).
429 append("], state: ").append(mState).append("/").append(mDetailedState).
430 append(", reason: ").append(mReason == null ? "(unspecified)" : mReason).
431 append(", extra: ").append(mExtraInfo == null ? "(none)" : mExtraInfo).
432 append(", roaming: ").append(mIsRoaming).
433 append(", failover: ").append(mIsFailover).
Wink Saville67c38212013-09-05 12:02:25 -0700434 append(", isAvailable: ").append(mIsAvailable).
435 append(", isConnectedToProvisioningNetwork: ").
Robert Greenwaltc9c90c72014-05-13 15:36:27 -0700436 append(mIsConnectedToProvisioningNetwork).
437 append("]");
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700438 return builder.toString();
439 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800440 }
441
442 /**
443 * Implement the Parcelable interface
444 * @hide
445 */
446 public int describeContents() {
447 return 0;
448 }
449
450 /**
451 * Implement the Parcelable interface.
452 * @hide
453 */
454 public void writeToParcel(Parcel dest, int flags) {
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700455 synchronized (this) {
456 dest.writeInt(mNetworkType);
457 dest.writeInt(mSubtype);
458 dest.writeString(mTypeName);
459 dest.writeString(mSubtypeName);
460 dest.writeString(mState.name());
461 dest.writeString(mDetailedState.name());
462 dest.writeInt(mIsFailover ? 1 : 0);
463 dest.writeInt(mIsAvailable ? 1 : 0);
464 dest.writeInt(mIsRoaming ? 1 : 0);
Wink Saville67c38212013-09-05 12:02:25 -0700465 dest.writeInt(mIsConnectedToProvisioningNetwork ? 1 : 0);
Irfan Sheriffa2a1b912010-06-07 09:03:04 -0700466 dest.writeString(mReason);
467 dest.writeString(mExtraInfo);
468 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800469 }
470
471 /**
472 * Implement the Parcelable interface.
473 * @hide
474 */
475 public static final Creator<NetworkInfo> CREATOR =
476 new Creator<NetworkInfo>() {
477 public NetworkInfo createFromParcel(Parcel in) {
478 int netType = in.readInt();
479 int subtype = in.readInt();
480 String typeName = in.readString();
481 String subtypeName = in.readString();
482 NetworkInfo netInfo = new NetworkInfo(netType, subtype, typeName, subtypeName);
483 netInfo.mState = State.valueOf(in.readString());
484 netInfo.mDetailedState = DetailedState.valueOf(in.readString());
485 netInfo.mIsFailover = in.readInt() != 0;
486 netInfo.mIsAvailable = in.readInt() != 0;
487 netInfo.mIsRoaming = in.readInt() != 0;
Wink Saville67c38212013-09-05 12:02:25 -0700488 netInfo.mIsConnectedToProvisioningNetwork = in.readInt() != 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800489 netInfo.mReason = in.readString();
490 netInfo.mExtraInfo = in.readString();
491 return netInfo;
492 }
493
494 public NetworkInfo[] newArray(int size) {
495 return new NetworkInfo[size];
496 }
497 };
498}