NetworkInfo.java revision da6da0907b28d4704aabbdb1bbeb4300954670d1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.EnumMap;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
25671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main * Describes the status of a network interface.
26671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main * <p>Use {@link ConnectivityManager#getActiveNetworkInfo()} to get an instance that represents
27671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main * the current network connection.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NetworkInfo implements Parcelable {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Coarse-grained network state. This is probably what most applications should
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use, rather than {@link android.net.NetworkInfo.DetailedState DetailedState}.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The mapping between the two is as follows:
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <br/><br/>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <table>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><b>Detailed state</b></td><td><b>Coarse-grained state</b></td></tr>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>IDLE</code></td><td><code>DISCONNECTED</code></td></tr>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>SCANNING</code></td><td><code>CONNECTING</code></td></tr>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>CONNECTING</code></td><td><code>CONNECTING</code></td></tr>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>AUTHENTICATING</code></td><td><code>CONNECTING</code></td></tr>
42671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * <tr><td><code>CONNECTED</code></td><td><code>CONNECTED</code></td></tr>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>DISCONNECTING</code></td><td><code>DISCONNECTING</code></td></tr>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>DISCONNECTED</code></td><td><code>DISCONNECTED</code></td></tr>
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>UNAVAILABLE</code></td><td><code>DISCONNECTED</code></td></tr>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <tr><td><code>FAILED</code></td><td><code>DISCONNECTED</code></td></tr>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </table>
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum State {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The fine-grained state of a network connection. This level of detail
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is probably of interest to few applications. Most should use
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.net.NetworkInfo.State State} instead.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum DetailedState {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Ready to start data connection setup. */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IDLE,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Searching for an available access point. */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SCANNING,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Currently setting up data connection. */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONNECTING,
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Network link established, performing authentication. */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUTHENTICATING,
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Awaiting response from DHCP server in order to assign IP address information. */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OBTAINING_IPADDR,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IP traffic should be available. */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONNECTED,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IP traffic is suspended */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SUSPENDED,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Currently tearing down data connection. */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DISCONNECTING,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IP traffic not available. */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DISCONNECTED,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Attempt to connect failed. */
78c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey        FAILED,
79c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey        /** Access to this network is blocked. */
8007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff        BLOCKED,
8107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff        /** Link has poor connectivity. */
82da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff        VERIFYING_POOR_LINK,
83da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff        /** Checking if network is a captive portal */
84da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff        CAPTIVE_PORTAL_CHECK,
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the map described in the Javadoc comment above. The positions
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the elements of the array must correspond to the ordinal values
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of <code>DetailedState</code>.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final EnumMap<DetailedState, State> stateMap =
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new EnumMap<DetailedState, State>(DetailedState.class);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.IDLE, State.DISCONNECTED);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.SCANNING, State.DISCONNECTED);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.CONNECTING, State.CONNECTING);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.AUTHENTICATING, State.CONNECTING);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.OBTAINING_IPADDR, State.CONNECTING);
10107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff        stateMap.put(DetailedState.VERIFYING_POOR_LINK, State.CONNECTING);
102da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff        stateMap.put(DetailedState.CAPTIVE_PORTAL_CHECK, State.CONNECTING);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.CONNECTED, State.CONNECTED);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.SUSPENDED, State.SUSPENDED);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.DISCONNECTING, State.DISCONNECTING);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.DISCONNECTED, State.DISCONNECTED);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(DetailedState.FAILED, State.DISCONNECTED);
108c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey        stateMap.put(DetailedState.BLOCKED, State.DISCONNECTED);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
110a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNetworkType;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSubtype;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mTypeName;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mSubtypeName;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private State mState;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DetailedState mDetailedState;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mReason;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mExtraInfo;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsFailover;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsRoaming;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether network connectivity is possible:
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsAvailable;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type network type
1282ecc74f330959be0a3bde10e55110a8218c0887cEric Shienbrood     * @deprecated
1292ecc74f330959be0a3bde10e55110a8218c0887cEric Shienbrood     * @hide because this constructor was only meant for internal use (and
1302ecc74f330959be0a3bde10e55110a8218c0887cEric Shienbrood     * has now been superseded by the package-private constructor below).
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public NetworkInfo(int type) {}
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
134d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff    /**
135d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff     * @hide
136d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff     */
137d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff    public NetworkInfo(int type, int subtype, String typeName, String subtypeName) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!ConnectivityManager.isNetworkTypeValid(type)) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("Invalid network type: " + type);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNetworkType = type;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSubtype = subtype;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTypeName = typeName;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSubtypeName = subtypeName;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setDetailedState(DetailedState.IDLE, null, null);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mState = State.UNKNOWN;
1478206ff30c23c76851bebc8d72a65e65b0f7f9a29Robert Greenwalt        mIsAvailable = false; // until we're told otherwise, assume unavailable
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIsRoaming = false;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
151c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    /** {@hide} */
152c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    public NetworkInfo(NetworkInfo source) {
153c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey        if (source != null) {
154c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mNetworkType = source.mNetworkType;
155c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mSubtype = source.mSubtype;
156c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mTypeName = source.mTypeName;
157c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mSubtypeName = source.mSubtypeName;
158c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mState = source.mState;
159c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mDetailedState = source.mDetailedState;
160c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mReason = source.mReason;
161c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mExtraInfo = source.mExtraInfo;
162c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mIsFailover = source.mIsFailover;
163c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mIsRoaming = source.mIsRoaming;
164c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey            mIsAvailable = source.mIsAvailable;
165c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey        }
166c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    }
167c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
169671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * Reports the type of network to which the
170671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * info in this {@code NetworkInfo} pertains.
171671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * @return one of {@link ConnectivityManager#TYPE_MOBILE}, {@link
172671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * ConnectivityManager#TYPE_WIFI}, {@link ConnectivityManager#TYPE_WIMAX}, {@link
173671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * ConnectivityManager#TYPE_ETHERNET},  {@link ConnectivityManager#TYPE_BLUETOOTH}, or other
174671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * types defined by {@link ConnectivityManager}
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getType() {
177a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
178a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mNetworkType;
179a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a network-type-specific integer describing the subtype
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the network.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the network subtype
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSubtype() {
188a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
189a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mSubtype;
190a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setSubtype(int subtype, String subtypeName) {
194a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
195a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            mSubtype = subtype;
196a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            mSubtypeName = subtypeName;
197a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a human-readable name describe the type of the network,
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for example "WIFI" or "MOBILE".
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the name of the network type
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getTypeName() {
206a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
207a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mTypeName;
208a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a human-readable name describing the subtype of the network.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the name of the network subtype
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getSubtypeName() {
216a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
217a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mSubtypeName;
218a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether network connectivity exists or is in the process
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of being established. This is good for applications that need to
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * do anything related to the network other than read or write data.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For the latter, call {@link #isConnected()} instead, which guarantees
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the network is fully usable.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if network connectivity exists or is in the process
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of being established, {@code false} otherwise.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isConnectedOrConnecting() {
231a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
232a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mState == State.CONNECTED || mState == State.CONNECTING;
233a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether network connectivity exists and it is possible to establish
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connections and pass data.
239671644c3ef92a9153ea5bd495e132d5fe6674234Scott Main     * <p>Always call this before attempting to perform data transactions.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if network connectivity exists, {@code false} otherwise.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isConnected() {
243a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
244a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mState == State.CONNECTED;
245a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether network connectivity is possible. A network is unavailable
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when a persistent or semi-persistent condition prevents the possibility
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of connecting to that network. Examples include
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The device is out of the coverage area for any network of this type.</li>
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The device is on a network other than the home network (i.e., roaming), and
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * data roaming has been disabled.</li>
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The device's radio is turned off, e.g., because airplane mode is enabled.</li>
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the network is available, {@code false} otherwise
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isAvailable() {
261a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
262a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mIsAvailable;
263a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets if the network is available, ie, if the connectivity is possible.
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isAvailable the new availability value.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIsAvailable(boolean isAvailable) {
273a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
274a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            mIsAvailable = isAvailable;
275a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the current attempt to connect to the network
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resulted from the ConnectivityManager trying to fail over to this
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network following a disconnect from another network.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if this is a failover attempt, {@code false}
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * otherwise.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFailover() {
286a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
287a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mIsFailover;
288a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the failover boolean.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isFailover {@code true} to mark the current connection attempt
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as a failover.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFailover(boolean isFailover) {
298a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
299a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            mIsFailover = isFailover;
300a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the device is currently roaming on this network.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When {@code true}, it suggests that use of data on this network
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may incur extra costs.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if roaming is in effect, {@code false} otherwise.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isRoaming() {
310a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
311a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mIsRoaming;
312a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setRoaming(boolean isRoaming) {
316a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
317a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            mIsRoaming = isRoaming;
318a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reports the current coarse-grained state of the network.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the coarse-grained state
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public State getState() {
326a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
327a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mState;
328a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reports the current fine-grained state of the network.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the fine-grained state
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DetailedState getDetailedState() {
336a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
337a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mDetailedState;
338a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the fine-grained state of the network.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param detailedState the {@link DetailedState}.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param reason a {@code String} indicating the reason for the state change,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if one was supplied. May be {@code null}.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraInfo an optional {@code String} providing addditional network state
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * information passed up from the lower networking layers.
348d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff     * @hide
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
350d649c12815bcf944b2c97371f3f60716a42a1557Irfan Sheriff    public void setDetailedState(DetailedState detailedState, String reason, String extraInfo) {
351a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
352a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            this.mDetailedState = detailedState;
353a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            this.mState = stateMap.get(detailedState);
354a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            this.mReason = reason;
355a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            this.mExtraInfo = extraInfo;
356a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
360d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker     * Set the extraInfo field.
361d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker     * @param extraInfo an optional {@code String} providing addditional network state
362d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker     * information passed up from the lower networking layers.
363d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker     * @hide
364d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker     */
365d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker    public void setExtraInfo(String extraInfo) {
366d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker        synchronized (this) {
367d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker            this.mExtraInfo = extraInfo;
368d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker        }
369d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker    }
370d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker
371d60ae7f6688ea83df536c2eb1101a74ae1914ac6Doug Zongker    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Report the reason an attempt to establish connectivity failed,
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if one is available.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the reason for failure, or null if not available
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getReason() {
377a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
378a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mReason;
379a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Report the extra information about the network state, if any was
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provided by the lower networking layers.,
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if one is available.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the extra information, or null if not available
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getExtraInfo() {
389a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
390a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return mExtraInfo;
391a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
396a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
397a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            StringBuilder builder = new StringBuilder("NetworkInfo: ");
398a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            builder.append("type: ").append(getTypeName()).append("[").append(getSubtypeName()).
399a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append("], state: ").append(mState).append("/").append(mDetailedState).
400a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append(", reason: ").append(mReason == null ? "(unspecified)" : mReason).
401a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append(", extra: ").append(mExtraInfo == null ? "(none)" : mExtraInfo).
402a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append(", roaming: ").append(mIsRoaming).
403a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append(", failover: ").append(mIsFailover).
404a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            append(", isAvailable: ").append(mIsAvailable);
405a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            return builder.toString();
406a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement the Parcelable interface
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement the Parcelable interface.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
422a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        synchronized (this) {
423a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeInt(mNetworkType);
424a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeInt(mSubtype);
425a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mTypeName);
426a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mSubtypeName);
427a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mState.name());
428a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mDetailedState.name());
429a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeInt(mIsFailover ? 1 : 0);
430a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeInt(mIsAvailable ? 1 : 0);
431a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeInt(mIsRoaming ? 1 : 0);
432a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mReason);
433a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff            dest.writeString(mExtraInfo);
434a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement the Parcelable interface.
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<NetworkInfo> CREATOR =
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<NetworkInfo>() {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public NetworkInfo createFromParcel(Parcel in) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int netType = in.readInt();
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int subtype = in.readInt();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String typeName = in.readString();
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String subtypeName = in.readString();
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NetworkInfo netInfo = new NetworkInfo(netType, subtype, typeName, subtypeName);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mState = State.valueOf(in.readString());
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mDetailedState = DetailedState.valueOf(in.readString());
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mIsFailover = in.readInt() != 0;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mIsAvailable = in.readInt() != 0;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mIsRoaming = in.readInt() != 0;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mReason = in.readString();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                netInfo.mExtraInfo = in.readString();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return netInfo;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public NetworkInfo[] newArray(int size) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new NetworkInfo[size];
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
464