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.wifi;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
20e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidsonimport android.os.Parcelable;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes information about a detected access point. In addition
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the attributes described here, the supplicant keeps track of
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code quality}, {@code noise}, and {@code maxbitrate} attributes,
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but does not currently report them to external clients.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ScanResult implements Parcelable {
294eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
304eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * The network name.
314eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String SSID;
33b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
344eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
354eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Ascii encoded SSID. This will replace SSID when we deprecate it. @hide
364eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
37b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public WifiSsid wifiSsid;
38b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
394eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
404eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * The address of the access point.
414eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String BSSID;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Describes the authentication, key management, and encryption schemes
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supported by the access point.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String capabilities;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
49e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * The detected signal level in dBm, also known as the RSSI.
50e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     *
51e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * <p>Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into
52e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * an absolute signal level which can be displayed to a user.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int level;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The frequency in MHz of the channel over which the client is communicating
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the access point.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int frequency;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6202b115b2d8a889bcc04594802ffcbc880644012cVinit Deshpande     * timestamp in microseconds (since boot) when
6306c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev     * this result was last seen.
6406c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev     */
650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public long timestamp;
660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
687c3606c103e95d3991267cca2592402a68779cafvandwalle     * Timestamp representing date when this result was last seen, in milliseconds from 1970
697c3606c103e95d3991267cca2592402a68779cafvandwalle     * {@hide}
707c3606c103e95d3991267cca2592402a68779cafvandwalle     */
717c3606c103e95d3991267cca2592402a68779cafvandwalle    public long seen;
727c3606c103e95d3991267cca2592402a68779cafvandwalle
734eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
7463edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle     * If the scan result is a valid autojoin candidate
7563edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle     * {@hide}
7663edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle     */
7763edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle    public int isAutoJoinCandidate;
7863edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle
7963edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle    /**
804eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
814eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Update RSSI of the scan result
824eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @param previousRSSI
834eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @param previousSeen
844eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @param maxAge
854eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
864eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public void averageRssi(int previousRssi, long previousSeen, int maxAge) {
874eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
884eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        if (seen == 0) {
894eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            seen = System.currentTimeMillis();
904eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        }
914eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        long age = seen - previousSeen;
924eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
934eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        if (previousSeen > 0 && age > 0 && age < maxAge/2) {
944eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            // Average the RSSI with previously seen instances of this scan result
954eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            double alpha = 0.5 - (double) age / (double) maxAge;
964eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            level = (int) ((double) level * (1 - alpha) + (double) previousRssi * alpha);
974eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        }
984eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    }
994eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
100f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    /** @hide */
101f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    public static final int ENABLED                                          = 0;
102f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    /** @hide */
103f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    public static final int AUTO_ROAM_DISABLED                               = 16;
104f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    /** @hide */
105f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    public static final int AUTO_JOIN_DISABLED                               = 32;
106f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    /** @hide */
107154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public static final int AUTHENTICATION_ERROR                              = 128;
108f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle
109f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle    /**
110f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle     * Status: indicating join status
111f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle     * @hide
112f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle     */
113612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    public int autoJoinStatus;
114612519db40db1bad7597ab207f14c9b5b5524a93vandwalle
115612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    /**
116176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle     * num IP configuration failures
117176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle     * @hide
118176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle     */
119176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle    public int numIpConfigFailures;
120176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle
121176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle    /**
122612519db40db1bad7597ab207f14c9b5b5524a93vandwalle     * @hide
123612519db40db1bad7597ab207f14c9b5b5524a93vandwalle     * Last time we blacklisted the ScanResult
124612519db40db1bad7597ab207f14c9b5b5524a93vandwalle     */
125612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    public long blackListTimestamp;
126612519db40db1bad7597ab207f14c9b5b5524a93vandwalle
127612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    /** @hide **/
128612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    public void setAutoJoinStatus(int status) {
129612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        if (status < 0) status = 0;
130612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        if (status == 0) {
131612519db40db1bad7597ab207f14c9b5b5524a93vandwalle            blackListTimestamp = 0;
132612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        }  else if (status > autoJoinStatus) {
133612519db40db1bad7597ab207f14c9b5b5524a93vandwalle            blackListTimestamp = System.currentTimeMillis();
134612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        }
135612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        autoJoinStatus = status;
136612519db40db1bad7597ab207f14c9b5b5524a93vandwalle    }
1377c3606c103e95d3991267cca2592402a68779cafvandwalle
1387c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
1394eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Status: indicating the scan result is not a result
1404eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * that is part of user's saved configurations
1414eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
1424eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
1434eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public boolean untrusted;
1444eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
1454eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
1464eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Number of time we connected to it
1474eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
1484eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
1494eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public int numConnection;
1504eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
1514eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
1524eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Number of time autojoin used it
1534eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
1544eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
1554eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public int numUsage;
1564eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
1574eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
1580451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * The approximate distance to the AP in centimeter, if available.  Else
1590451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * {@link UNSPECIFIED}.
1600451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * {@hide}
1610451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
1620451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public int distanceCm;
1630451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
1640451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
1650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * The standard deviation of the distance to the AP, if available.
1660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * Else {@link UNSPECIFIED}.
1670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * {@hide}
1680451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
1690451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public int distanceSdCm;
1700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
1710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
1720451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * {@hide}
1730451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
1740451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public final static int UNSPECIFIED = -1;
175111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
176111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
177111fa0274d1d6620f9634783585387f3b773949evandwalle     */
178111fa0274d1d6620f9634783585387f3b773949evandwalle    public boolean is24GHz() {
1794eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        return ScanResult.is24GHz(frequency);
180111fa0274d1d6620f9634783585387f3b773949evandwalle    }
181111fa0274d1d6620f9634783585387f3b773949evandwalle
182111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
183111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
184111fa0274d1d6620f9634783585387f3b773949evandwalle     * TODO: makes real freq boundaries
185111fa0274d1d6620f9634783585387f3b773949evandwalle     */
1864eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public static boolean is24GHz(int freq) {
1874eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        return freq > 2400 && freq < 2500;
1884eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    }
1894eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
1904eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
1914eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
1924eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
193111fa0274d1d6620f9634783585387f3b773949evandwalle    public boolean is5GHz() {
194ec5a901ea88109f2bd5ac0a635b48176135ed32fvandwalle        return ScanResult.is5GHz(frequency);
1954eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    }
1964eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
1974eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
1984eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
1994eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * TODO: makes real freq boundaries
2004eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
2014eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public static boolean is5GHz(int freq) {
2024eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        return freq > 4900 && freq < 5900;
203111fa0274d1d6620f9634783585387f3b773949evandwalle    }
20406c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev
20555027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande    /** information element from beacon
20655027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande     * @hide
20755027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande     */
20855027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande    public static class InformationElement {
20955027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande        public int id;
21055027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande        public byte[] bytes;
211ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande
212ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande        public InformationElement() {
213ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande        }
214ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande
215ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande        public InformationElement(InformationElement rhs) {
216ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande            this.id = rhs.id;
217ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande            this.bytes = rhs.bytes.clone();
218ea676a0e51504aa53dff9cbe64085658987703b2Vinit Deshpande        }
21955027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande    }
22055027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande
22155027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande    /** information elements found in the beacon
22255027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande     * @hide
22355027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande     */
22455027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande    public InformationElement informationElements[];
22555027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande
226b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** {@hide} */
227b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public ScanResult(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency,
228b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            long tsf) {
229b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        this.wifiSsid = wifiSsid;
230b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        this.SSID = (wifiSsid != null) ? wifiSsid.toString() : WifiSsid.NONE;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.BSSID = BSSID;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.capabilities = caps;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.level = level;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.frequency = frequency;
23506c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev        this.timestamp = tsf;
2360451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.distanceCm = UNSPECIFIED;
2370451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.distanceSdCm = UNSPECIFIED;
23806c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev    }
23906c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev
2400451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /** {@hide} */
2410451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public ScanResult(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency,
2420451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt            long tsf, int distCm, int distSdCm) {
2430451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.wifiSsid = wifiSsid;
2440451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.SSID = (wifiSsid != null) ? wifiSsid.toString() : WifiSsid.NONE;
2450451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.BSSID = BSSID;
2460451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.capabilities = caps;
2470451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.level = level;
2480451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.frequency = frequency;
2490451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.timestamp = tsf;
2500451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.distanceCm = distCm;
2510451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        this.distanceSdCm = distSdCm;
2520451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    }
253b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
25406c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev    /** copy constructor {@hide} */
25506c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev    public ScanResult(ScanResult source) {
25606c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev        if (source != null) {
257b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            wifiSsid = source.wifiSsid;
25806c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            SSID = source.SSID;
25906c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            BSSID = source.BSSID;
26006c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            capabilities = source.capabilities;
26106c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            level = source.level;
26206c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            frequency = source.frequency;
26306c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            timestamp = source.timestamp;
2640451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt            distanceCm = source.distanceCm;
2650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt            distanceSdCm = source.distanceSdCm;
2667c3606c103e95d3991267cca2592402a68779cafvandwalle            seen = source.seen;
267612519db40db1bad7597ab207f14c9b5b5524a93vandwalle            autoJoinStatus = source.autoJoinStatus;
2684eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            untrusted = source.untrusted;
2694eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            numConnection = source.numConnection;
2704eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            numUsage = source.numUsage;
271176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle            numIpConfigFailures = source.numIpConfigFailures;
27263edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle            isAutoJoinCandidate = source.isAutoJoinCandidate;
27306c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev        }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
276011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde    /** empty scan result
277011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde     *
278011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde     * {@hide}
279011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde     * */
280011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde    public ScanResult() {
281011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde    }
282011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuffer sb = new StringBuffer();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String none = "<none>";
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("SSID: ").
289b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            append(wifiSsid == null ? WifiSsid.NONE : wifiSsid).
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", BSSID: ").
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(BSSID == null ? none : BSSID).
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", capabilities: ").
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(capabilities == null ? none : capabilities).
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", level: ").
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(level).
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", frequency: ").
29706c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            append(frequency).
29806c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            append(", timestamp: ").
29906c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev            append(timestamp);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3010451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        sb.append(", distance: ").append((distanceCm != UNSPECIFIED ? distanceCm : "?")).
3020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt                append("(cm)");
3030451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        sb.append(", distanceSd: ").append((distanceSdCm != UNSPECIFIED ? distanceSdCm : "?")).
3040451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt                append("(cm)");
3050451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
306612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        if (autoJoinStatus != 0) {
307612519db40db1bad7597ab207f14c9b5b5524a93vandwalle            sb.append(", status: ").append(autoJoinStatus);
308f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
319b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (wifiSsid != null) {
320b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            dest.writeInt(1);
321b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            wifiSsid.writeToParcel(dest, flags);
322b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        } else {
323b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            dest.writeInt(0);
324b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(BSSID);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(capabilities);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(level);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(frequency);
32906c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev        dest.writeLong(timestamp);
3300451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        dest.writeInt(distanceCm);
3310451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt        dest.writeInt(distanceSdCm);
3325fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        dest.writeLong(seen);
333612519db40db1bad7597ab207f14c9b5b5524a93vandwalle        dest.writeInt(autoJoinStatus);
3344eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(untrusted ? 1 : 0);
3354eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(numConnection);
3364eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(numUsage);
337176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle        dest.writeInt(numIpConfigFailures);
33863edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle        dest.writeInt(isAutoJoinCandidate);
33955027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande        if (informationElements != null) {
34055027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande            dest.writeInt(informationElements.length);
34155027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande            for (int i = 0; i < informationElements.length; i++) {
34255027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                dest.writeInt(informationElements[i].id);
34355027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                dest.writeInt(informationElements[i].bytes.length);
34455027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                dest.writeByteArray(informationElements[i].bytes);
34555027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande            }
34655027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande        } else {
34755027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande            dest.writeInt(0);
34855027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande        }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<ScanResult> CREATOR =
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<ScanResult>() {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public ScanResult createFromParcel(Parcel in) {
355b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                WifiSsid wifiSsid = null;
356b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                if (in.readInt() == 1) {
357b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    wifiSsid = WifiSsid.CREATOR.createFromParcel(in);
358b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                }
359a4864472313208e4f1de02f45d3eadad237c54afYuhao Zheng                ScanResult sr = new ScanResult(
360b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    wifiSsid,
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    in.readString(),
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    in.readString(),
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    in.readInt(),
36406c43d575c88976f8709ff3fc0bad7117bde23e7Iliyan Malchev                    in.readInt(),
3650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt                    in.readLong(),
3660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt                    in.readInt(),
3670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt                    in.readInt()
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                );
3695fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sr.seen = in.readLong();
370612519db40db1bad7597ab207f14c9b5b5524a93vandwalle                sr.autoJoinStatus = in.readInt();
3714eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle                sr.untrusted = in.readInt() != 0;
3724eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle                sr.numConnection = in.readInt();
373b1dce0220bec5d81dca0aac645d84854ef4324cbvandwalle                sr.numUsage = in.readInt();
374176a27f3abf18af18a1ad4012ca3eadbff12ba96vandwalle                sr.numIpConfigFailures = in.readInt();
37563edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle                sr.isAutoJoinCandidate = in.readInt();
37655027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                int n = in.readInt();
37755027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                if (n != 0) {
37855027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                    sr.informationElements = new InformationElement[n];
37955027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                    for (int i = 0; i < n; i++) {
38055027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                        sr.informationElements[i] = new InformationElement();
38155027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                        sr.informationElements[i].id = in.readInt();
38255027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                        int len = in.readInt();
38355027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                        sr.informationElements[i].bytes = new byte[len];
38455027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                        in.readByteArray(sr.informationElements[i].bytes);
38555027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                    }
38655027bb7b87ddcb05d65892677a2e0fe42f66ba2Vinit Deshpande                }
387a4864472313208e4f1de02f45d3eadad237c54afYuhao Zheng                return sr;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public ScanResult[] newArray(int size) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new ScanResult[size];
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
395