1dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen/*
2dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Copyright (C) 2017 The Android Open Source Project
3dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen *
4dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
5dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * you may not use this file except in compliance with the License.
6dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * You may obtain a copy of the License at
7dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen *
8dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen *      http://www.apache.org/licenses/LICENSE-2.0
9dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen *
10dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Unless required by applicable law or agreed to in writing, software
11dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
12dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * See the License for the specific language governing permissions and
14dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * limitations under the License.
15dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */
16dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
17dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenpackage android.net.wifi.rtt;
18dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
1967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport static android.net.wifi.ScanResult.InformationElement.EID_HT_CAPABILITIES;
2067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport static android.net.wifi.ScanResult.InformationElement.EID_VHT_CAPABILITIES;
2167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen
22dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.annotation.IntDef;
23dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.annotation.NonNull;
242892ba6611f72384314f8421befd26ae7e786a08Etan Cohenimport android.annotation.SystemApi;
25dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.MacAddress;
26dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.wifi.ScanResult;
27dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.wifi.aware.PeerHandle;
28dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.os.Parcel;
29dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.os.Parcelable;
3067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport android.util.Log;
31dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
32dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.lang.annotation.Retention;
33dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.lang.annotation.RetentionPolicy;
34dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.util.Objects;
35dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
36dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen/**
37dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Defines the configuration of an IEEE 802.11mc Responder. The Responder may be an Access Point
38dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * (AP), a Wi-Fi Aware device, or a manually configured Responder.
39dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * <p>
40dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * A Responder configuration may be constructed from a {@link ScanResult} or manually (with the
41dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * data obtained out-of-band from a peer).
42dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen *
432892ba6611f72384314f8421befd26ae7e786a08Etan Cohen * @hide
44dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */
452892ba6611f72384314f8421befd26ae7e786a08Etan Cohen@SystemApi
466713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohenpublic final class ResponderConfig implements Parcelable {
4767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen    private static final String TAG = "ResponderConfig";
482109f705f35999374d5e3519d0782f38c87adb99Etan Cohen    private static final int AWARE_BAND_2_DISCOVERY_CHANNEL = 2437;
492109f705f35999374d5e3519d0782f38c87adb99Etan Cohen
50dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /** @hide */
51dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @IntDef({RESPONDER_AP, RESPONDER_STA, RESPONDER_P2P_GO, RESPONDER_P2P_CLIENT, RESPONDER_AWARE})
52dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Retention(RetentionPolicy.SOURCE)
53dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public @interface ResponderType {
54dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
55dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
56dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
57dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder is an AP.
58dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
59dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int RESPONDER_AP = 0;
60dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
61dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder is a STA.
62dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
63dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int RESPONDER_STA = 1;
64dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
65dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder is a Wi-Fi Direct Group Owner (GO).
66dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
67dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int RESPONDER_P2P_GO = 2;
68dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
69dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder is a Wi-Fi Direct Group Client.
70dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
71dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int RESPONDER_P2P_CLIENT = 3;
72dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
73dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder is a Wi-Fi Aware device.
74dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
75dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int RESPONDER_AWARE = 4;
76dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
77dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
78dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /** @hide */
79dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @IntDef({
80dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            CHANNEL_WIDTH_20MHZ, CHANNEL_WIDTH_40MHZ, CHANNEL_WIDTH_80MHZ, CHANNEL_WIDTH_160MHZ,
81dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            CHANNEL_WIDTH_80MHZ_PLUS_MHZ})
82dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Retention(RetentionPolicy.SOURCE)
83dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public @interface ChannelWidth {
84dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
85dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
86dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
87dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Channel bandwidth is 20 MHZ
88dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
89dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int CHANNEL_WIDTH_20MHZ = 0;
90dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
91dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Channel bandwidth is 40 MHZ
92dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
93dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int CHANNEL_WIDTH_40MHZ = 1;
94dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
95dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Channel bandwidth is 80 MHZ
96dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
97dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int CHANNEL_WIDTH_80MHZ = 2;
98dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
99dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Channel bandwidth is 160 MHZ
100dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
101dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int CHANNEL_WIDTH_160MHZ = 3;
102dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
103dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ
104dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
105dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
106dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
107dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /** @hide */
108dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @IntDef({PREAMBLE_LEGACY, PREAMBLE_HT, PREAMBLE_VHT})
109dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Retention(RetentionPolicy.SOURCE)
110dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public @interface PreambleType {
111dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
112dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
113dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
114dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Preamble type: Legacy.
115dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
116dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int PREAMBLE_LEGACY = 0;
117dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
118dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
119dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Preamble type: HT.
120dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
121dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int PREAMBLE_HT = 1;
122dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
123dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
124dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Preamble type: VHT.
125dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
126dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final int PREAMBLE_VHT = 2;
127dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
128dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
129dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
130dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * The MAC address of the Responder. Will be null if a Wi-Fi Aware peer identifier (the
131dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * peerHandle field) ise used to identify the Responder.
132dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
1336713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen    public final MacAddress macAddress;
134dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
135dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
136dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * The peer identifier of a Wi-Fi Aware Responder. Will be null if a MAC Address (the macAddress
137dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * field) is used to identify the Responder.
138dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
1396713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen    public final PeerHandle peerHandle;
140dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
141dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
142dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * The device type of the Responder.
143dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
144dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int responderType;
145dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
146dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
147dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Indicates whether the Responder device supports IEEE 802.11mc.
148dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
149dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final boolean supports80211mc;
150dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
151dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
152dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder channel bandwidth, specified using {@link ChannelWidth}.
153dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
154dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int channelWidth;
155dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
156dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
157dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * The primary 20 MHz frequency (in MHz) of the channel of the Responder.
158dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
159dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int frequency;
160dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
161dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
162dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Not used if the {@link #channelWidth} is 20 MHz. If the Responder uses 40, 80 or 160 MHz,
163dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * this is the center frequency (in MHz), if the Responder uses 80 + 80 MHz, this is the
164dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * center frequency of the first segment (in MHz).
165dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
166dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int centerFreq0;
167dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
168dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
169dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Only used if the {@link #channelWidth} is 80 + 80 MHz. If the Responder uses 80 + 80 MHz,
170dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * this is the center frequency of the second segment (in MHz).
171dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
172dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int centerFreq1;
173dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
174dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
175dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * The preamble used by the Responder, specified using {@link PreambleType}.
176dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
177dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public final int preamble;
178dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
179dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
1806713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * Constructs Responder configuration, using a MAC address to identify the Responder.
181dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *
182dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param macAddress      The MAC address of the Responder.
183dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param responderType   The type of the responder device, specified using
184dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        {@link ResponderType}.
185dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
186dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
187dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
188dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
189dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
190dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
191dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        segment (in MHz).
192dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
193dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        Responder
194dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
195dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        (in
196dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        MHz).
197dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param preamble        The preamble used by the Responder, specified using
198dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        {@link PreambleType}.
199dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
20048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen    public ResponderConfig(@NonNull MacAddress macAddress, @ResponderType int responderType,
201dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0,
202dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int centerFreq1, @PreambleType int preamble) {
20348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        if (macAddress == null) {
20448856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            throw new IllegalArgumentException(
20548856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen                    "Invalid ResponderConfig - must specify a MAC address");
20648856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        }
207dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.macAddress = macAddress;
208dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.peerHandle = null;
209dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.responderType = responderType;
210dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.supports80211mc = supports80211mc;
211dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.channelWidth = channelWidth;
212dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.frequency = frequency;
213dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.centerFreq0 = centerFreq0;
214dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.centerFreq1 = centerFreq1;
215dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.preamble = preamble;
216dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
217dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
218dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
2196713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * Constructs Responder configuration, using a Wi-Fi Aware PeerHandle to identify the Responder.
220dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *
221dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param peerHandle      The Wi-Fi Aware peer identifier of the Responder.
222dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param responderType   The type of the responder device, specified using
223dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        {@link ResponderType}.
224dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
225dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
226dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
227dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
228dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
229dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
230dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        segment (in MHz).
231dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
232dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        Responder
233dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
234dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        (in
235dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        MHz).
236dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @param preamble        The preamble used by the Responder, specified using
237dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *                        {@link PreambleType}.
238dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
239dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public ResponderConfig(@NonNull PeerHandle peerHandle, @ResponderType int responderType,
240dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0,
241dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int centerFreq1, @PreambleType int preamble) {
242dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.macAddress = null;
243dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.peerHandle = peerHandle;
244dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.responderType = responderType;
245dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.supports80211mc = supports80211mc;
246dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.channelWidth = channelWidth;
247dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.frequency = frequency;
248dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.centerFreq0 = centerFreq0;
249dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.centerFreq1 = centerFreq1;
250dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        this.preamble = preamble;
251dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
252dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
253dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
2546713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * Constructs Responder configuration. This is an internal-only constructor which specifies both
2556713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * a MAC address and a Wi-Fi PeerHandle to identify the Responder.
2566713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *
2576713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param macAddress      The MAC address of the Responder.
2586713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param peerHandle      The Wi-Fi Aware peer identifier of the Responder.
2596713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param responderType   The type of the responder device, specified using
2606713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        {@link ResponderType}.
2616713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
2626713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
2636713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
2646713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
2656713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
2666713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
2676713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        segment (in MHz).
2686713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
2696713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        Responder
2706713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
2716713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        (in
2726713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        MHz).
2736713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @param preamble        The preamble used by the Responder, specified using
2746713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     *                        {@link PreambleType}.
2756713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     * @hide
2766713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen     */
2776713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen    public ResponderConfig(@NonNull MacAddress macAddress, @NonNull PeerHandle peerHandle,
2786713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen            @ResponderType int responderType, boolean supports80211mc,
2796713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen            @ChannelWidth int channelWidth, int frequency, int centerFreq0, int centerFreq1,
2806713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen            @PreambleType int preamble) {
2816713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.macAddress = macAddress;
2826713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.peerHandle = peerHandle;
2836713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.responderType = responderType;
2846713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.supports80211mc = supports80211mc;
2856713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.channelWidth = channelWidth;
2866713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.frequency = frequency;
2876713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.centerFreq0 = centerFreq0;
2886713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.centerFreq1 = centerFreq1;
2896713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen        this.preamble = preamble;
2906713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen    }
2916713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen
2926713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen    /**
293dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Creates a Responder configuration from a {@link ScanResult} corresponding to an Access
294dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Point (AP), which can be obtained from {@link android.net.wifi.WifiManager#getScanResults()}.
295dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
296dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static ResponderConfig fromScanResult(ScanResult scanResult) {
29748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        MacAddress macAddress = MacAddress.fromString(scanResult.BSSID);
298dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        int responderType = RESPONDER_AP;
299dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        boolean supports80211mc = scanResult.is80211mcResponder();
3002892ba6611f72384314f8421befd26ae7e786a08Etan Cohen        int channelWidth = translateScanResultChannelWidth(scanResult.channelWidth);
301dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        int frequency = scanResult.frequency;
302dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        int centerFreq0 = scanResult.centerFreq0;
303dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        int centerFreq1 = scanResult.centerFreq1;
304dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
305dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        int preamble;
30667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen        if (scanResult.informationElements != null && scanResult.informationElements.length != 0) {
30767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            boolean htCapabilitiesPresent = false;
30867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            boolean vhtCapabilitiesPresent = false;
30967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            for (ScanResult.InformationElement ie : scanResult.informationElements) {
31067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                if (ie.id == EID_HT_CAPABILITIES) {
31167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                    htCapabilitiesPresent = true;
31267f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                } else if (ie.id == EID_VHT_CAPABILITIES) {
31367f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                    vhtCapabilitiesPresent = true;
31467f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                }
31567f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            }
31667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            if (vhtCapabilitiesPresent) {
31767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                preamble = PREAMBLE_VHT;
31867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            } else if (htCapabilitiesPresent) {
31967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                preamble = PREAMBLE_HT;
32067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            } else {
32167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                preamble = PREAMBLE_LEGACY;
32267f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            }
323dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        } else {
32467f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            Log.e(TAG, "Scan Results do not contain IEs - using backup method to select preamble");
32567f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            if (channelWidth == CHANNEL_WIDTH_80MHZ || channelWidth == CHANNEL_WIDTH_160MHZ) {
32667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                preamble = PREAMBLE_VHT;
32767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            } else {
32867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen                preamble = PREAMBLE_HT;
32967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen            }
330dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
331dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
332dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth,
333dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                frequency, centerFreq0, centerFreq1, preamble);
334dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
335dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
336dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
337dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Creates a Responder configuration from a MAC address corresponding to a Wi-Fi Aware
338dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder. The Responder parameters are set to defaults.
339dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
34048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen    public static ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(MacAddress macAddress) {
3412109f705f35999374d5e3519d0782f38c87adb99Etan Cohen        /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder
3422109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * is expected to be brought up and available to negotiate a maximum accuracy channel
3432109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware
3442109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * Unsolicited Publisher with Ranging enabled.
3452109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         */
3462109f705f35999374d5e3519d0782f38c87adb99Etan Cohen        return new ResponderConfig(macAddress, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ,
3472109f705f35999374d5e3519d0782f38c87adb99Etan Cohen                AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT);
348dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
349dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
350dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
351dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Creates a Responder configuration from a {@link PeerHandle} corresponding to a Wi-Fi Aware
352dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Responder. The Responder parameters are set to defaults.
353dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
354dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static ResponderConfig fromWifiAwarePeerHandleWithDefaults(PeerHandle peerHandle) {
3552109f705f35999374d5e3519d0782f38c87adb99Etan Cohen        /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder
3562109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * is expected to be brought up and available to negotiate a maximum accuracy channel
3572109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware
3582109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         * Unsolicited Publisher with Ranging enabled.
3592109f705f35999374d5e3519d0782f38c87adb99Etan Cohen         */
3602109f705f35999374d5e3519d0782f38c87adb99Etan Cohen        return new ResponderConfig(peerHandle, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ,
3612109f705f35999374d5e3519d0782f38c87adb99Etan Cohen                AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT);
362dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
363dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
364dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /**
365dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * Check whether the Responder configuration is valid.
366dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     *
367dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @return true if valid, false otherwise.
368dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     * @hide
369dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen     */
370dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public boolean isValid(boolean awareSupported) {
371dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        if (macAddress == null && peerHandle == null || macAddress != null && peerHandle != null) {
372dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            return false;
373dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
374dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        if (!awareSupported && responderType == RESPONDER_AWARE) {
375dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            return false;
376dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
377dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
378dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        return true;
379dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
380dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
381dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Override
382dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public int describeContents() {
383dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        return 0;
384dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
385dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
386dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Override
387dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public void writeToParcel(Parcel dest, int flags) {
38848856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        if (macAddress == null) {
38948856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            dest.writeBoolean(false);
39048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        } else {
39148856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            dest.writeBoolean(true);
39248856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            macAddress.writeToParcel(dest, flags);
39348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        }
394dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        if (peerHandle == null) {
39548856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            dest.writeBoolean(false);
396dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        } else {
39748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            dest.writeBoolean(true);
398dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            dest.writeInt(peerHandle.peerId);
399dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
400dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(responderType);
401dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(supports80211mc ? 1 : 0);
402dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(channelWidth);
403dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(frequency);
404dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(centerFreq0);
405dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(centerFreq1);
406dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        dest.writeInt(preamble);
407dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
408dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
409dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public static final Creator<ResponderConfig> CREATOR = new Creator<ResponderConfig>() {
410dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        @Override
411dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        public ResponderConfig[] newArray(int size) {
412dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            return new ResponderConfig[size];
413dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
414dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
415dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        @Override
416dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        public ResponderConfig createFromParcel(Parcel in) {
41748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            boolean macAddressPresent = in.readBoolean();
41848856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            MacAddress macAddress = null;
41948856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            if (macAddressPresent) {
42048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen                macAddress = MacAddress.CREATOR.createFromParcel(in);
42148856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            }
42248856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            boolean peerHandlePresent = in.readBoolean();
423dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            PeerHandle peerHandle = null;
42448856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen            if (peerHandlePresent) {
425dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                peerHandle = new PeerHandle(in.readInt());
426dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            }
427dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int responderType = in.readInt();
428dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            boolean supports80211mc = in.readInt() == 1;
429dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int channelWidth = in.readInt();
430dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int frequency = in.readInt();
431dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int centerFreq0 = in.readInt();
432dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int centerFreq1 = in.readInt();
433dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            int preamble = in.readInt();
434dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
435dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            if (peerHandle == null) {
436dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth,
437dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                        frequency, centerFreq0, centerFreq1, preamble);
438dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            } else {
439dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return new ResponderConfig(peerHandle, responderType, supports80211mc, channelWidth,
440dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                        frequency, centerFreq0, centerFreq1, preamble);
441dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            }
442dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
443dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    };
444dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
445dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Override
446dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public boolean equals(Object o) {
447dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        if (this == o) {
448dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            return true;
449dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
450dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
451dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        if (!(o instanceof ResponderConfig)) {
452dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            return false;
453dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
454dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
455dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        ResponderConfig lhs = (ResponderConfig) o;
456dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
45748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        return Objects.equals(macAddress, lhs.macAddress) && Objects.equals(peerHandle,
458dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                lhs.peerHandle) && responderType == lhs.responderType
459dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                && supports80211mc == lhs.supports80211mc && channelWidth == lhs.channelWidth
460dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                && frequency == lhs.frequency && centerFreq0 == lhs.centerFreq0
461dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                && centerFreq1 == lhs.centerFreq1 && preamble == lhs.preamble;
462dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
463dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
464dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Override
465dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public int hashCode() {
466dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        return Objects.hash(macAddress, peerHandle, responderType, supports80211mc, channelWidth,
467dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                frequency, centerFreq0, centerFreq1, preamble);
468dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
469dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
470dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /** @hide */
471dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    @Override
472dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    public String toString() {
47348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen        return new StringBuffer("ResponderConfig: macAddress=").append(macAddress).append(
474dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                ", peerHandle=").append(peerHandle == null ? "<null>" : peerHandle.peerId).append(
475dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                ", responderType=").append(responderType).append(", supports80211mc=").append(
476dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                supports80211mc).append(", channelWidth=").append(channelWidth).append(
477dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                ", frequency=").append(frequency).append(", centerFreq0=").append(
478dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                centerFreq0).append(", centerFreq1=").append(centerFreq1).append(
479dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                ", preamble=").append(preamble).toString();
480dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
481dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen
482dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    /** @hide */
4832892ba6611f72384314f8421befd26ae7e786a08Etan Cohen    static int translateScanResultChannelWidth(int scanResultChannelWidth) {
484dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        switch (scanResultChannelWidth) {
485dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            case ScanResult.CHANNEL_WIDTH_20MHZ:
486dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return CHANNEL_WIDTH_20MHZ;
487dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            case ScanResult.CHANNEL_WIDTH_40MHZ:
488dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return CHANNEL_WIDTH_40MHZ;
489dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            case ScanResult.CHANNEL_WIDTH_80MHZ:
490dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return CHANNEL_WIDTH_80MHZ;
491dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            case ScanResult.CHANNEL_WIDTH_160MHZ:
492dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return CHANNEL_WIDTH_160MHZ;
493dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            case ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ:
494dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                return CHANNEL_WIDTH_80MHZ_PLUS_MHZ;
495dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen            default:
496dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen                throw new IllegalArgumentException(
4972892ba6611f72384314f8421befd26ae7e786a08Etan Cohen                        "translateScanResultChannelWidth: bad " + scanResultChannelWidth);
498dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen        }
499dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen    }
500dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen}
501