17686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandepackage android.net.wifi;
27686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3fabae2fff0556efffda842081f290ecd04c56aecWei Wangimport android.annotation.NonNull;
4d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.RequiresPermission;
5d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SuppressLint;
67686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.annotation.SystemApi;
7d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SystemService;
87686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.content.Context;
9c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpandeimport android.os.Bundle;
107686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.os.Handler;
117686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.os.Looper;
127686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.os.Message;
137686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.os.Messenger;
14c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpandeimport android.os.Parcel;
15c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpandeimport android.os.Parcelable;
167686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.os.RemoteException;
177686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.util.Log;
187686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.util.SparseArray;
197686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
20fabae2fff0556efffda842081f290ecd04c56aecWei Wangimport com.android.internal.annotations.VisibleForTesting;
217686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport com.android.internal.util.AsyncChannel;
22c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpandeimport com.android.internal.util.Protocol;
237686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
247686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande/** @hide */
257686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande@SystemApi
26d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SystemService(Context.WIFI_RTT_SERVICE)
277686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandepublic class RttManager {
287686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
299fcf3ca4ded8cd68995b9e9281c223e92ba0d7beJoe Onorato    private static final boolean DBG = false;
307686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    private static final String TAG = "RttManager";
317686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
32d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated It is Not supported anymore. */
339954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
349954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_TYPE_UNSPECIFIED        = 0;
35d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
369954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_TYPE_ONE_SIDED          = 1;
37d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_TYPE_TWO_SIDED          = 2;
389954faa70d4172617b8b77743d1fdd599e2e6277xinhe
39d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated It is not supported anymore. */
409954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
419954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_TYPE_11_V               = 2;
429954faa70d4172617b8b77743d1fdd599e2e6277xinhe
43d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated It is not supported anymore. */
449954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
459954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_TYPE_11_MC              = 4;
467686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
47d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated It is not supported anymore. */
48d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
497686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_PEER_TYPE_UNSPECIFIED    = 0;
50d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
517686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_PEER_TYPE_AP             = 1;
527686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_PEER_TYPE_STA            = 2;       /* requires NAN */
53d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_PEER_P2P_GO              = 3;
54d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_PEER_P2P_CLIENT          = 4;
55d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_PEER_NAN                 = 5;
567686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
57d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**
58d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * @deprecated It is not supported anymore.
59d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_20_SUPPORT} API.
60d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
61d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
627686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_20      = 0;
63d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
64d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**
65d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * @deprecated It is not supported anymore.
66d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_40_SUPPORT} API.
67d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
68d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
697686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_40      = 1;
70d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
71d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**
72d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * @deprecated It is not supported anymore.
73d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_80_SUPPORT} API.
74d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
75d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
767686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_80      = 2;
77d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
78d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**@deprecated It is not supported anymore.
79d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_160_SUPPORT} API.
80d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
81d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
827686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_160     = 3;
83d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
84d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**@deprecated not supported anymore*/
85d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
867686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_80P80   = 4;
87d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
88d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**@deprecated It is not supported anymore.
89d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_5_SUPPORT} API.
90d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
91d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
927686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_5       = 5;
93d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
94d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /**@deprecated It is not supported anymore.
95d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * Use {@link android.net.wifi.RttManager#RTT_BW_10_SUPPORT} API.
96d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     */
97d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    @Deprecated
987686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_10      = 6;
999954faa70d4172617b8b77743d1fdd599e2e6277xinhe
100d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated channel info must be specified. */
1019954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
1027686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1;
1037686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1047686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_SUCCESS                  = 0;
105d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** General failure*/
1067686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAILURE                  = 1;
107d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Destination does not respond to RTT request*/
1087686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_NO_RSP              = 2;
109d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** RTT request is rejected by the destination. Double side RTT only*/
1107686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_REJECTED            = 3;
111d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** */
1127686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET   = 4;
113d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Timing measurement timeout*/
1147686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_TM_TIMEOUT          = 5;
115d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Destination is on a different channel from the RTT Request*/
1167686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL  = 6;
117d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** This type of Ranging is not support by Hardware*/
1187686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_FAIL_NO_CAPABILITY       = 7;
119d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Request abort fro uncertain reason*/
1207686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int RTT_STATUS_ABORTED                  = 8;
121d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** The T1-T4 or TOD/TOA Timestamp is illegal*/
1229954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_STATUS_FAIL_INVALID_TS          = 9;
123d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** 11mc protocol level failed, eg, unrecognized FTMR/FTM frame*/
1249954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_STATUS_FAIL_PROTOCOL            = 10;
125d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Request can not be scheduled by hardware*/
1269954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_STATUS_FAIL_SCHEDULE            = 11;
127d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** destination is busy now, you can try after a specified time from destination*/
1289954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER      = 12;
129d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Bad Request argument*/
130d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_STATUS_INVALID_REQ              = 13;
131d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Wifi is not enabled*/
132d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_STATUS_NO_WIFI                  = 14;
133d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** Responder overrides param info, cannot range with new params 2-side RTT only*/
134d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE  = 15;
1357686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1367686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static final int REASON_UNSPECIFIED              = -1;
137c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int REASON_NOT_AVAILABLE            = -2;
138c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int REASON_INVALID_LISTENER         = -3;
139c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int REASON_INVALID_REQUEST          = -4;
140ebc5ced56e474e48777194fd6ca349a6cedb1e6fxinhe    /** Do not have required permission */
141ebc5ced56e474e48777194fd6ca349a6cedb1e6fxinhe    public static final int REASON_PERMISSION_DENIED        = -5;
142564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    /** Ranging failed because responder role is enabled in STA mode.*/
143564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static final int
144564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON  = -6;
145c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
146c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final String DESCRIPTION_KEY  = "android.net.wifi.RttManager.Description";
1477686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1489954faa70d4172617b8b77743d1fdd599e2e6277xinhe    /**
149d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe     * RTT BW supported bit mask, used as RTT param bandWidth too
1509954faa70d4172617b8b77743d1fdd599e2e6277xinhe     */
151d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_BW_5_SUPPORT   = 0x01;
152d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_BW_10_SUPPORT  = 0x02;
153d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_BW_20_SUPPORT  = 0x04;
154d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int RTT_BW_40_SUPPORT  = 0x08;
1559954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_BW_80_SUPPORT  = 0x10;
1569954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static final int RTT_BW_160_SUPPORT = 0x20;
1579954faa70d4172617b8b77743d1fdd599e2e6277xinhe
1589954faa70d4172617b8b77743d1fdd599e2e6277xinhe    /**
1599954faa70d4172617b8b77743d1fdd599e2e6277xinhe     * RTT Preamble Support bit mask
1609954faa70d4172617b8b77743d1fdd599e2e6277xinhe     */
161d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int PREAMBLE_LEGACY  = 0x01;
162d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int PREAMBLE_HT      = 0x02;
163d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static final int PREAMBLE_VHT     = 0x04;
1649954faa70d4172617b8b77743d1fdd599e2e6277xinhe
165d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated Use the new {@link android.net.wifi.RttManager.RttCapabilities} API */
1669954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
1677686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public class Capabilities {
168c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int supportedType;
169c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int supportedPeerType;
1707686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
1717686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
172d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** @deprecated Use the new {@link android.net.wifi.RttManager#getRttCapabilities()} API.*/
1739954faa70d4172617b8b77743d1fdd599e2e6277xinhe    @Deprecated
174d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @SuppressLint("Doclava125")
1757686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public Capabilities getCapabilities() {
1767686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        return new Capabilities();
1777686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
1787686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1799954faa70d4172617b8b77743d1fdd599e2e6277xinhe    /**
1809954faa70d4172617b8b77743d1fdd599e2e6277xinhe     * This class describe the RTT capability of the Hardware
1819954faa70d4172617b8b77743d1fdd599e2e6277xinhe     */
1829954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public static class RttCapabilities implements Parcelable {
1839954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** @deprecated It is not supported*/
1849954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
1859954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean supportedType;
1869954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** @deprecated It is not supported*/
1879954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
1889954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean supportedPeerType;
1899954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //1-sided rtt measurement is supported
1909954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean oneSidedRttSupported;
1919954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //11mc 2-sided rtt measurement is supported
1929954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean twoSided11McRttSupported;
1939954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //location configuration information supported
1949954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean lciSupported;
1959954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //location civic records supported
1969954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean lcrSupported;
1979954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //preamble supported, see bit mask definition above
1989954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int preambleSupported;
1999954faa70d4172617b8b77743d1fdd599e2e6277xinhe        //RTT bandwidth supported
2009954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int bwSupported;
201564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        // Whether STA responder role is supported.
202564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public boolean responderSupported;
2039954faa70d4172617b8b77743d1fdd599e2e6277xinhe
204cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang        /** Whether the secure RTT protocol is supported. */
205cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang        public boolean secureRttSupported;
206cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang
207cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang        /** Draft 11mc version supported, including major and minor version. e.g, draft 4.3 is 43 */
208cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang        public int mcVersion;
209cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang
2109954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Override
2119954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public String toString() {
2129954faa70d4172617b8b77743d1fdd599e2e6277xinhe            StringBuffer sb = new StringBuffer();
2139954faa70d4172617b8b77743d1fdd599e2e6277xinhe            sb.append("oneSidedRtt ").
2149954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append(oneSidedRttSupported ? "is Supported. " : "is not supported. ").
2159954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append("twoSided11McRtt ").
2169954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append(twoSided11McRttSupported ? "is Supported. " : "is not supported. ").
2179954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append("lci ").
2189954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append(lciSupported ? "is Supported. " : "is not supported. ").
2199954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append("lcr ").
2209954faa70d4172617b8b77743d1fdd599e2e6277xinhe            append(lcrSupported ? "is Supported. " : "is not supported. ");
2219954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2229954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((preambleSupported & PREAMBLE_LEGACY) != 0) {
2239954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("Legacy ");
2249954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2259954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2269954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((preambleSupported & PREAMBLE_HT) != 0) {
2279954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("HT ");
2289954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2299954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2309954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((preambleSupported & PREAMBLE_VHT) != 0) {
2319954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("VHT ");
2329954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2339954faa70d4172617b8b77743d1fdd599e2e6277xinhe
234cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            sb.append("is supported. ");
2359954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2369954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_5_SUPPORT) != 0) {
2379954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("5 MHz ");
2389954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2399954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2409954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_10_SUPPORT) != 0) {
2419954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("10 MHz ");
2429954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2439954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2449954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_20_SUPPORT) != 0) {
2459954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("20 MHz ");
2469954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2479954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2489954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_40_SUPPORT) != 0) {
2499954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("40 MHz ");
2509954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2519954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2529954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_80_SUPPORT) != 0) {
2539954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("80 MHz ");
2549954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2559954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2569954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if ((bwSupported & RTT_BW_160_SUPPORT) != 0) {
2579954faa70d4172617b8b77743d1fdd599e2e6277xinhe                sb.append("160 MHz ");
2589954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
2599954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2609954faa70d4172617b8b77743d1fdd599e2e6277xinhe            sb.append("is supported.");
2619954faa70d4172617b8b77743d1fdd599e2e6277xinhe
262564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            sb.append(" STA responder role is ")
263cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                    .append(responderSupported ? "supported" : "not supported");
264cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            sb.append(" Secure RTT protocol is ")
265cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                    .append(secureRttSupported ? "supported" : "not supported");
266cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            sb.append(" 11mc version is " + mcVersion);
267564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
2689954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return sb.toString();
2699954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
2709954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** Implement the Parcelable interface {@hide} */
2719954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Override
2729954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int describeContents() {
2739954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return 0;
2749954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
2759954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2769954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** Implement the Parcelable interface {@hide} */
2779954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Override
2789954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public void writeToParcel(Parcel dest, int flags) {
2799954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(oneSidedRttSupported ? 1 : 0);
2809954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(twoSided11McRttSupported ? 1 : 0);
2819954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(lciSupported ? 1 : 0);
2829954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(lcrSupported ? 1 : 0);
2839954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(preambleSupported);
2849954faa70d4172617b8b77743d1fdd599e2e6277xinhe            dest.writeInt(bwSupported);
285564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(responderSupported ? 1 : 0);
286cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            dest.writeInt(secureRttSupported ? 1 : 0);
287cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            dest.writeInt(mcVersion);
2889954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
2899954faa70d4172617b8b77743d1fdd599e2e6277xinhe
2909954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** Implement the Parcelable interface {@hide} */
2919954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public static final Creator<RttCapabilities> CREATOR =
2929954faa70d4172617b8b77743d1fdd599e2e6277xinhe            new Creator<RttCapabilities>() {
293fabae2fff0556efffda842081f290ecd04c56aecWei Wang            @Override
294fabae2fff0556efffda842081f290ecd04c56aecWei Wang            public RttCapabilities createFromParcel(Parcel in) {
295cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                RttCapabilities capabilities = new RttCapabilities();
296cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.oneSidedRttSupported = (in.readInt() == 1);
297cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.twoSided11McRttSupported = (in.readInt() == 1);
298cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.lciSupported = (in.readInt() == 1);
299cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.lcrSupported = (in.readInt() == 1);
300cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.preambleSupported = in.readInt();
301cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.bwSupported = in.readInt();
302cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.responderSupported = (in.readInt() == 1);
303cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.secureRttSupported = (in.readInt() == 1);
304cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                capabilities.mcVersion = in.readInt();
305cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang                return capabilities;
306cae1be220071ac5e0483eb4f9ea5aca59d9ab733Wei Wang            }
3079954faa70d4172617b8b77743d1fdd599e2e6277xinhe                /** Implement the Parcelable interface {@hide} */
3089954faa70d4172617b8b77743d1fdd599e2e6277xinhe                @Override
3099954faa70d4172617b8b77743d1fdd599e2e6277xinhe                public RttCapabilities[] newArray(int size) {
3109954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    return new RttCapabilities[size];
3119954faa70d4172617b8b77743d1fdd599e2e6277xinhe                }
3129954faa70d4172617b8b77743d1fdd599e2e6277xinhe             };
3139954faa70d4172617b8b77743d1fdd599e2e6277xinhe    }
3149954faa70d4172617b8b77743d1fdd599e2e6277xinhe
3159954faa70d4172617b8b77743d1fdd599e2e6277xinhe    public RttCapabilities getRttCapabilities() {
316bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mCapabilitiesLock) {
3179954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if (mRttCapabilities == null) {
3189954faa70d4172617b8b77743d1fdd599e2e6277xinhe                try {
3199954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    mRttCapabilities = mService.getRttCapabilities();
3209954faa70d4172617b8b77743d1fdd599e2e6277xinhe                } catch (RemoteException e) {
321c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    throw e.rethrowFromSystemServer();
3229954faa70d4172617b8b77743d1fdd599e2e6277xinhe                }
3239954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
3249954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return mRttCapabilities;
3259954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
3269954faa70d4172617b8b77743d1fdd599e2e6277xinhe    }
3279954faa70d4172617b8b77743d1fdd599e2e6277xinhe
3287686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    /** specifies parameters for RTT request */
3297686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static class RttParams {
3309954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
331d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * type of destination device being ranged
332d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * currently only support RTT_PEER_TYPE_AP
333d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range:RTT_PEER_TYPE_xxxx Default value:RTT_PEER_TYPE_AP
3349954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3357686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int deviceType;
3367686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3379954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
338d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * type of RTT measurement method. Need check scan result and RttCapabilities first
339d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range: RTT_TYPE_ONE_SIDED or RTT_TYPE_TWO_SIDED
340d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: RTT_TYPE_ONE_SIDED
3419954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3427686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int requestType;
3437686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
344d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
34571210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang         * Whether the secure RTT protocol needs to be used for ranging this peer device.
34671210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang         */
34771210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang        public boolean secure;
34871210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang
34971210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang        /**
350d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * mac address of the device being ranged
351d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: null
352d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
3537686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public String bssid;
3547686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3559954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
356d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * The primary control channel over which the client is
357d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * communicating with the AP.Same as ScanResult.frequency
358d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 0
3599954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3607686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int frequency;
3617686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3629954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
363d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * channel width of the destination AP. Same as ScanResult.channelWidth
364d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 0
3659954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3667686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int channelWidth;
3677686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3689954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
3699954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * Not used if the AP bandwidth is 20 MHz
3709954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * If the AP use 40, 80 or 160 MHz, this is the center frequency
3719954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * if the AP use 80 + 80 MHz, this is the center frequency of the first segment
372d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * same as ScanResult.centerFreq0
373d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 0
3749954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3759954faa70d4172617b8b77743d1fdd599e2e6277xinhe         public int centerFreq0;
3769954faa70d4172617b8b77743d1fdd599e2e6277xinhe
3779954faa70d4172617b8b77743d1fdd599e2e6277xinhe         /**
3789954faa70d4172617b8b77743d1fdd599e2e6277xinhe          * Only used if the AP bandwidth is 80 + 80 MHz
3799954faa70d4172617b8b77743d1fdd599e2e6277xinhe          * if the AP use 80 + 80 MHz, this is the center frequency of the second segment
380d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe          * same as ScanResult.centerFreq1
381d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe          * Default value: 0
3829954faa70d4172617b8b77743d1fdd599e2e6277xinhe          */
3839954faa70d4172617b8b77743d1fdd599e2e6277xinhe          public int centerFreq1;
384d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
3859954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
3869954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * number of samples to be taken
387d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use the new {@link android.net.wifi.RttManager.RttParams#numSamplesPerBurst}
3889954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3899954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
3907686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int num_samples;
3917686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
3929954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
3939954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * number of retries if a sample fails
394d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated
395d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Use {@link android.net.wifi.RttManager.RttParams#numRetriesPerMeasurementFrame} API.
3969954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
3979954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
3987686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int num_retries;
3999954faa70d4172617b8b77743d1fdd599e2e6277xinhe
400d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** Number of burst in exp , 2^x. 0 means single shot measurement, range 0-15
401d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Currently only single shot is supported
402d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 0
403d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
4049954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int numberBurst;
4059954faa70d4172617b8b77743d1fdd599e2e6277xinhe
406d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
407d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * valid only if numberBurst > 1, interval between burst(100ms).
408d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range : 0-31, 0--means no specific
409d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 0
410d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
4119954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int interval;
4129954faa70d4172617b8b77743d1fdd599e2e6277xinhe
413d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
414d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * number of samples to be taken in one burst
415d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range: 1-31
416d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: 8
417d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
4189954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int numSamplesPerBurst;
4199954faa70d4172617b8b77743d1fdd599e2e6277xinhe
4209954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** number of retries for each measurement frame if a sample fails
421d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         *  Only used by single side RTT,
422d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         *  Range 0 - 3 Default value: 0
4239954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
4249954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int numRetriesPerMeasurementFrame;
4259954faa70d4172617b8b77743d1fdd599e2e6277xinhe
426d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
427d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * number of retries for FTMR frame (control frame) if it fails.
428d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Only used by 80211MC double side RTT
429d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range: 0-3  Default Value : 0
430d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
4319954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int numRetriesPerFTMR;
4329954faa70d4172617b8b77743d1fdd599e2e6277xinhe
433d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
434d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Request LCI information, only available when choose double side RTT measurement
435d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * need check RttCapabilties first.
436d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: false
437d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * */
4389954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean LCIRequest;
4399954faa70d4172617b8b77743d1fdd599e2e6277xinhe
440d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
441d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Request LCR information, only available when choose double side RTT measurement
442d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * need check RttCapabilties first.
443d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value: false
444d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * */
4459954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public boolean LCRRequest;
4469954faa70d4172617b8b77743d1fdd599e2e6277xinhe
447d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
448d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Timeout for each burst, (250 * 2^x) us,
449d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Range 1-11 and 15. 15 means no control Default value: 15
450d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * */
4519954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int burstTimeout;
4529954faa70d4172617b8b77743d1fdd599e2e6277xinhe
4539954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** preamble used for RTT measurement
454d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         *  Range: PREAMBLE_LEGACY, PREAMBLE_HT, PREAMBLE_VHT
455d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         *  Default value: PREAMBLE_HT
4569954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
4579954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int preamble;
4589954faa70d4172617b8b77743d1fdd599e2e6277xinhe
4599954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /** bandWidth used for RTT measurement.User need verify the highest BW the destination
4609954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * support (from scan result etc) before set this value. Wider channels result usually give
4619954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * better accuracy. However, the frame loss can increase too.
462d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * should be one of RTT_BW_5_SUPPORT to RTT_BW_160_SUPPORT. However, need check
463d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * RttCapabilities firstto verify HW support this bandwidth.
464d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Default value:RTT_BW_20_SUPPORT
4659954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
4669954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int bandwidth;
4679954faa70d4172617b8b77743d1fdd599e2e6277xinhe
4689954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public RttParams() {
4699954faa70d4172617b8b77743d1fdd599e2e6277xinhe            //provide initial value for RttParams
4709954faa70d4172617b8b77743d1fdd599e2e6277xinhe            deviceType = RTT_PEER_TYPE_AP;
471d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            requestType = RTT_TYPE_ONE_SIDED;
472d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            numberBurst = 0;
4739954faa70d4172617b8b77743d1fdd599e2e6277xinhe            numSamplesPerBurst = 8;
4749954faa70d4172617b8b77743d1fdd599e2e6277xinhe            numRetriesPerMeasurementFrame  = 0;
475d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            numRetriesPerFTMR = 0;
476d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            burstTimeout = 15;
477d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            preamble = PREAMBLE_HT;
478d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            bandwidth = RTT_BW_20_SUPPORT;
4799954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
480fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen
481fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        /**
482fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen         * {@hide}
483fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen         */
484fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        public String toString() {
485fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            StringBuilder sb = new StringBuilder();
486fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append("deviceType=" + deviceType);
487fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", requestType=" + requestType);
488fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", secure=" + secure);
489fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", bssid=" + bssid);
490fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", frequency=" + frequency);
491fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", channelWidth=" + channelWidth);
492fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", centerFreq0=" + centerFreq0);
493fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", centerFreq1=" + centerFreq1);
494fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", num_samples=" + num_samples);
495fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", num_retries=" + num_retries);
496fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", numberBurst=" + numberBurst);
497fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", interval=" + interval);
498fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", numSamplesPerBurst=" + numSamplesPerBurst);
499fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", numRetriesPerMeasurementFrame=" + numRetriesPerMeasurementFrame);
500fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", numRetriesPerFTMR=" + numRetriesPerFTMR);
501fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", LCIRequest=" + LCIRequest);
502fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", LCRRequest=" + LCRRequest);
503fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", burstTimeout=" + burstTimeout);
504fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", preamble=" + preamble);
505fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            sb.append(", bandwidth=" + bandwidth);
506fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            return sb.toString();
507fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        }
5087686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
5097686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
510c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    /** pseudo-private class used to parcel arguments */
511c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static class ParcelableRttParams implements Parcelable {
512c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
513fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @NonNull
514c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public RttParams mParams[];
515c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
516fabae2fff0556efffda842081f290ecd04c56aecWei Wang        /**
517fabae2fff0556efffda842081f290ecd04c56aecWei Wang         * @hide
518fabae2fff0556efffda842081f290ecd04c56aecWei Wang         */
519fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @VisibleForTesting
520fabae2fff0556efffda842081f290ecd04c56aecWei Wang        public ParcelableRttParams(RttParams[] params) {
521fabae2fff0556efffda842081f290ecd04c56aecWei Wang            mParams = (params == null ? new RttParams[0] : params);
522c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
523c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
524c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
525fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @Override
526c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int describeContents() {
527c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            return 0;
528c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
529c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
530c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
531fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @Override
532c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public void writeToParcel(Parcel dest, int flags) {
533fabae2fff0556efffda842081f290ecd04c56aecWei Wang            dest.writeInt(mParams.length);
534fabae2fff0556efffda842081f290ecd04c56aecWei Wang
535fabae2fff0556efffda842081f290ecd04c56aecWei Wang            for (RttParams params : mParams) {
536fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.deviceType);
537fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.requestType);
538fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeByte(params.secure ? (byte) 1 : 0);
539fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeString(params.bssid);
540fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.channelWidth);
541fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.frequency);
542fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.centerFreq0);
543fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.centerFreq1);
544fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.numberBurst);
545fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.interval);
546fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.numSamplesPerBurst);
547fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.numRetriesPerMeasurementFrame);
548fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.numRetriesPerFTMR);
549fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.LCIRequest ? 1 : 0);
550fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.LCRRequest ? 1 : 0);
551fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.burstTimeout);
552fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.preamble);
553fabae2fff0556efffda842081f290ecd04c56aecWei Wang                dest.writeInt(params.bandwidth);
554c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            }
555c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
556c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
557c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
558c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public static final Creator<ParcelableRttParams> CREATOR =
559c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                new Creator<ParcelableRttParams>() {
560fabae2fff0556efffda842081f290ecd04c56aecWei Wang                    @Override
561c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    public ParcelableRttParams createFromParcel(Parcel in) {
562c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
563c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        int num = in.readInt();
564c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        RttParams params[] = new RttParams[num];
565c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        for (int i = 0; i < num; i++) {
566c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            params[i] = new RttParams();
567c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            params[i].deviceType = in.readInt();
568c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            params[i].requestType = in.readInt();
56971210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang                            params[i].secure = (in.readByte() != 0);
570c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            params[i].bssid = in.readString();
571c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            params[i].channelWidth = in.readInt();
5729954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].frequency = in.readInt();
5739954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].centerFreq0 = in.readInt();
5749954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].centerFreq1 = in.readInt();
5759954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].numberBurst = in.readInt();
5769954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].interval = in.readInt();
5779954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].numSamplesPerBurst = in.readInt();
5789954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].numRetriesPerMeasurementFrame = in.readInt();
5799954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].numRetriesPerFTMR = in.readInt();
580fabae2fff0556efffda842081f290ecd04c56aecWei Wang                            params[i].LCIRequest = (in.readInt() == 1);
581fabae2fff0556efffda842081f290ecd04c56aecWei Wang                            params[i].LCRRequest = (in.readInt() == 1);
5829954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].burstTimeout = in.readInt();
5839954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].preamble = in.readInt();
5849954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            params[i].bandwidth = in.readInt();
585c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        }
586c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
587c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
588c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        return parcelableParams;
589c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    }
590c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
591fabae2fff0556efffda842081f290ecd04c56aecWei Wang                    @Override
592c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    public ParcelableRttParams[] newArray(int size) {
593c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        return new ParcelableRttParams[size];
594c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    }
595c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                };
596c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    }
597c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
598d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    public static class WifiInformationElement {
599d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** Information Element ID 0xFF means element is invalid. */
600d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        public byte id;
601d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        public byte[] data;
6029954faa70d4172617b8b77743d1fdd599e2e6277xinhe    }
6037686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    /** specifies RTT results */
6047686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static class RttResult {
605d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** mac address of the device being ranged. */
6067686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public String bssid;
6077686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
608d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** # of burst for this measurement. */
6099954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int burstNumber;
6109954faa70d4172617b8b77743d1fdd599e2e6277xinhe
611d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** total number of measurement frames attempted in this measurement. */
6129954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int measurementFrameNumber;
6139954faa70d4172617b8b77743d1fdd599e2e6277xinhe
614d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** total successful number of measurement frames in this measurement. */
6159954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int successMeasurementFrameNumber;
6169954faa70d4172617b8b77743d1fdd599e2e6277xinhe
617d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
618d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Maximum number of frames per burst supported by peer. Two side RTT only
619d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Valid only if less than request
620d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
6219954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int frameNumberPerBurstPeer;
6229954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6237686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        /** status of the request */
6247686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int status;
6257686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
6269954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
6279954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * type of the request used
628d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#measurementType}
6299954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6309954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
631c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int requestType;
632c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
633d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** RTT measurement method type used, should be one of RTT_TYPE_ONE_SIDED or
6349954faa70d4172617b8b77743d1fdd599e2e6277xinhe         *  RTT_TYPE_TWO_SIDED.
6359954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6369954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int measurementType;
6379954faa70d4172617b8b77743d1fdd599e2e6277xinhe
638d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**
639d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * only valid when status ==  RTT_STATUS_FAIL_BUSY_TRY_LATER
640d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * please retry RTT measurement after this duration since peer indicate busy at ths moment
641d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         *  Unit S  Range:1-31
642d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         */
6439954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int retryAfterDuration;
6449954faa70d4172617b8b77743d1fdd599e2e6277xinhe
645d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** timestamp of completion, in microsecond since boot. */
6467686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public long ts;
6477686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
648d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** average RSSI observed, unit of 0.5 dB. */
6497686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int rssi;
6507686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
6519954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
6529954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * RSSI spread (i.e. max - min)
653d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rssiSpread} API.
6549954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6559954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
6567686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int rssi_spread;
6577686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
658d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /**RSSI spread (i.e. max - min), unit of 0.5 dB. */
6599954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int rssiSpread;
6609954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6619954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
6629954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * average transmit rate
663d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#txRate} API.
6649954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6659954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
6667686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public int tx_rate;
6677686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
6688330dc98f5799bd039f60d04f1c37530ca48a12eWei Wang        /** average transmit rate. Unit (kbps). */
6699954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int txRate;
6709954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6718330dc98f5799bd039f60d04f1c37530ca48a12eWei Wang        /** average receiving rate Unit (kbps). */
6729954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int rxRate;
6739954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6749954faa70d4172617b8b77743d1fdd599e2e6277xinhe       /**
6759954faa70d4172617b8b77743d1fdd599e2e6277xinhe        * average round trip time in nano second
676d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        * @deprecated  Use {@link android.net.wifi.RttManager.RttResult#rtt} API.
6779954faa70d4172617b8b77743d1fdd599e2e6277xinhe        */
6789954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
6797686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public long rtt_ns;
6807686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
6818330dc98f5799bd039f60d04f1c37530ca48a12eWei Wang        /** average round trip time in picoseconds. */
6829954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public long rtt;
6839954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6849954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
6859954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * standard deviation observed in round trip time
686d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rttStandardDeviation} API.
6879954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6889954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
6897686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public long rtt_sd_ns;
6907686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
6918330dc98f5799bd039f60d04f1c37530ca48a12eWei Wang        /** standard deviation of RTT in picoseconds. */
6929954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public long rttStandardDeviation;
6939954faa70d4172617b8b77743d1fdd599e2e6277xinhe
6949954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
6959954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * spread (i.e. max - min) round trip time
696d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rttSpread} API.
6979954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
6989954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
6997686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public long rtt_spread_ns;
7007686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
7018330dc98f5799bd039f60d04f1c37530ca48a12eWei Wang        /** spread (i.e. max - min) RTT in picoseconds. */
7029954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public long rttSpread;
7039954faa70d4172617b8b77743d1fdd599e2e6277xinhe
7049954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
7059954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * average distance in centimeter, computed based on rtt_ns
706d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated use {@link android.net.wifi.RttManager.RttResult#distance} API.
7079954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
7089954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
709c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int distance_cm;
7107686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
711d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** average distance in cm, computed based on rtt. */
7129954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int distance;
7139954faa70d4172617b8b77743d1fdd599e2e6277xinhe
7149954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
7159954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * standard deviation observed in distance
716d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * @deprecated
717d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe         * Use {@link .android.net.wifi.RttManager.RttResult#distanceStandardDeviation} API.
7189954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
7199954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
720c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int distance_sd_cm;
7217686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
722d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** standard deviation observed in distance in cm. */
7239954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int distanceStandardDeviation;
7249954faa70d4172617b8b77743d1fdd599e2e6277xinhe
7259954faa70d4172617b8b77743d1fdd599e2e6277xinhe        /**
7269954faa70d4172617b8b77743d1fdd599e2e6277xinhe         * spread (i.e. max - min) distance
72798ad88811c76f7334c285cc970a4107f7a716b5aGina Dimino         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#distanceSpread} API.
7289954faa70d4172617b8b77743d1fdd599e2e6277xinhe         */
7299954faa70d4172617b8b77743d1fdd599e2e6277xinhe        @Deprecated
730c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int distance_spread_cm;
7319954faa70d4172617b8b77743d1fdd599e2e6277xinhe
732d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** spread (i.e. max - min) distance in cm. */
7339954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int distanceSpread;
7349954faa70d4172617b8b77743d1fdd599e2e6277xinhe
735d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** the duration of this measurement burst, unit ms. */
7369954faa70d4172617b8b77743d1fdd599e2e6277xinhe        public int burstDuration;
7379954faa70d4172617b8b77743d1fdd599e2e6277xinhe
738d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** Burst number supported by peer after negotiation, 2side RTT only*/
739d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        public int negotiatedBurstNum;
740d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe
741d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** LCI information Element, only available for double side RTT. */
742d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        public WifiInformationElement LCI;
7439954faa70d4172617b8b77743d1fdd599e2e6277xinhe
744d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        /** LCR information Element, only available to double side RTT. */
745d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        public WifiInformationElement LCR;
74671210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang
74771210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang        /**
74871210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang         * Whether the secure RTT protocol was used for ranging.
74971210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang         */
75071210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang        public boolean secure;
7517686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
7527686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
753c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
754d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe    /** pseudo-private class used to parcel results. */
755c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static class ParcelableRttResults implements Parcelable {
756c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
757c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public RttResult mResults[];
758c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
759c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public ParcelableRttResults(RttResult[] results) {
760c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            mResults = results;
761c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
762c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
763fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        /**
764fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen         * {@hide}
765fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen         */
766fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        public String toString() {
767fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            StringBuilder sb = new StringBuilder();
768fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            for (int i = 0; i < mResults.length; ++i) {
769fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append("[" + i + "]: ");
770fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append("bssid=" + mResults[i].bssid);
771fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", burstNumber=" + mResults[i].burstNumber);
772fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", measurementFrameNumber=" + mResults[i].measurementFrameNumber);
773fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", successMeasurementFrameNumber="
774fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                        + mResults[i].successMeasurementFrameNumber);
775fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", frameNumberPerBurstPeer=" + mResults[i].frameNumberPerBurstPeer);
776fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", status=" + mResults[i].status);
777fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", requestType=" + mResults[i].requestType);
778fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", measurementType=" + mResults[i].measurementType);
779fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", retryAfterDuration=" + mResults[i].retryAfterDuration);
780fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", ts=" + mResults[i].ts);
781fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rssi=" + mResults[i].rssi);
782fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rssi_spread=" + mResults[i].rssi_spread);
783fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rssiSpread=" + mResults[i].rssiSpread);
784fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", tx_rate=" + mResults[i].tx_rate);
785fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", txRate=" + mResults[i].txRate);
786fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rxRate=" + mResults[i].rxRate);
787fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rtt_ns=" + mResults[i].rtt_ns);
788fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rtt=" + mResults[i].rtt);
789fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rtt_sd_ns=" + mResults[i].rtt_sd_ns);
790fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rttStandardDeviation=" + mResults[i].rttStandardDeviation);
791fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rtt_spread_ns=" + mResults[i].rtt_spread_ns);
792fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", rttSpread=" + mResults[i].rttSpread);
793fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distance_cm=" + mResults[i].distance_cm);
794fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distance=" + mResults[i].distance);
795fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distance_sd_cm=" + mResults[i].distance_sd_cm);
796fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distanceStandardDeviation=" + mResults[i].distanceStandardDeviation);
797fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distance_spread_cm=" + mResults[i].distance_spread_cm);
798fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", distanceSpread=" + mResults[i].distanceSpread);
799fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", burstDuration=" + mResults[i].burstDuration);
800fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", negotiatedBurstNum=" + mResults[i].negotiatedBurstNum);
801fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", LCI=" + mResults[i].LCI);
802fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", LCR=" + mResults[i].LCR);
803fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen                sb.append(", secure=" + mResults[i].secure);
804fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            }
805fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen            return sb.toString();
806fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen        }
807fb8021c8371357dbb2b73135c89de57ef27e0131Etan Cohen
808c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
809fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @Override
810c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public int describeContents() {
811c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            return 0;
812c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
813c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
814c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
815fabae2fff0556efffda842081f290ecd04c56aecWei Wang        @Override
816c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public void writeToParcel(Parcel dest, int flags) {
817c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            if (mResults != null) {
818c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                dest.writeInt(mResults.length);
819c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                for (RttResult result : mResults) {
820c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    dest.writeString(result.bssid);
8219954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.burstNumber);
8229954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.measurementFrameNumber);
8239954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.successMeasurementFrameNumber);
8249954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.frameNumberPerBurstPeer);
825c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    dest.writeInt(result.status);
8269954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.measurementType);
8279954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.retryAfterDuration);
828c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    dest.writeLong(result.ts);
829c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    dest.writeInt(result.rssi);
8309954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.rssiSpread);
8319954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.txRate);
8329954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeLong(result.rtt);
8339954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeLong(result.rttStandardDeviation);
8349954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeLong(result.rttSpread);
8359954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.distance);
8369954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.distanceStandardDeviation);
8379954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.distanceSpread);
8389954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    dest.writeInt(result.burstDuration);
839d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    dest.writeInt(result.negotiatedBurstNum);
840d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    dest.writeByte(result.LCI.id);
841d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    if (result.LCI.id != (byte) 0xFF) {
842d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                        dest.writeByte((byte)result.LCI.data.length);
843d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                        dest.writeByteArray(result.LCI.data);
844d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    }
845d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    dest.writeByte(result.LCR.id);
846d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    if (result.LCR.id != (byte) 0xFF) {
847d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                        dest.writeInt((byte) result.LCR.data.length);
848d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                        dest.writeByte(result.LCR.id);
849d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    }
85071210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang                    dest.writeByte(result.secure ? (byte) 1 : 0);
851c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                }
852c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            } else {
853c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                dest.writeInt(0);
854c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            }
855c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
856c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
857c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        /** Implement the Parcelable interface {@hide} */
858c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public static final Creator<ParcelableRttResults> CREATOR =
859c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                new Creator<ParcelableRttResults>() {
860fabae2fff0556efffda842081f290ecd04c56aecWei Wang                    @Override
861c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    public ParcelableRttResults createFromParcel(Parcel in) {
862c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
863c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        int num = in.readInt();
864c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
865c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        if (num == 0) {
866c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            return new ParcelableRttResults(null);
867c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        }
868c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
869c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        RttResult results[] = new RttResult[num];
870c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        for (int i = 0; i < num; i++) {
871c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            results[i] = new RttResult();
872c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            results[i].bssid = in.readString();
8739954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].burstNumber = in.readInt();
8749954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].measurementFrameNumber = in.readInt();
8759954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].successMeasurementFrameNumber = in.readInt();
8769954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].frameNumberPerBurstPeer = in.readInt();
877c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            results[i].status = in.readInt();
8789954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].measurementType = in.readInt();
8799954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].retryAfterDuration = in.readInt();
880c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            results[i].ts = in.readLong();
881c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                            results[i].rssi = in.readInt();
8829954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].rssiSpread = in.readInt();
8839954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].txRate = in.readInt();
8849954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].rtt = in.readLong();
8859954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].rttStandardDeviation = in.readLong();
8869954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].rttSpread = in.readLong();
8879954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].distance = in.readInt();
8889954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].distanceStandardDeviation = in.readInt();
8899954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].distanceSpread = in.readInt();
8909954faa70d4172617b8b77743d1fdd599e2e6277xinhe                            results[i].burstDuration = in.readInt();
891d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            results[i].negotiatedBurstNum = in.readInt();
892d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            results[i].LCI = new WifiInformationElement();
893d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            results[i].LCI.id = in.readByte();
894d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            if (results[i].LCI.id != (byte) 0xFF) {
895d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                byte length = in.readByte();
896d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                results[i].LCI.data = new byte[length];
897d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                in.readByteArray(results[i].LCI.data);
898d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            }
899d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            results[i].LCR = new WifiInformationElement();
900d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            results[i].LCR.id = in.readByte();
901d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            if (results[i].LCR.id != (byte) 0xFF) {
902d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                byte length = in.readByte();
903d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                results[i].LCR.data = new byte[length];
904d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                                in.readByteArray(results[i].LCR.data);
905d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                            }
90671210b10225dd7c40ca1a07736c9d4c8559f5085Wei Wang                            results[i].secure = (in.readByte() != 0);
907c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        }
908c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
909c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        ParcelableRttResults parcelableResults = new ParcelableRttResults(results);
910c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        return parcelableResults;
911c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    }
912c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
913fabae2fff0556efffda842081f290ecd04c56aecWei Wang                    @Override
914c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    public ParcelableRttResults[] newArray(int size) {
915c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                        return new ParcelableRttResults[size];
916c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    }
917c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                };
918c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    }
919c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
920c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
9217686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public static interface RttListener {
922c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        public void onSuccess(RttResult[] results);
9237686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public void onFailure(int reason, String description);
9247686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public void onAborted();
9257686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
9267686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
9279954faa70d4172617b8b77743d1fdd599e2e6277xinhe    private boolean rttParamSanity(RttParams params, int index) {
9289954faa70d4172617b8b77743d1fdd599e2e6277xinhe        if (mRttCapabilities == null) {
9299954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if(getRttCapabilities() == null) {
9309954faa70d4172617b8b77743d1fdd599e2e6277xinhe                Log.e(TAG, "Can not get RTT capabilities");
9317f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe                throw new IllegalStateException("RTT chip is not working");
9329954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
9339954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
9349954faa70d4172617b8b77743d1fdd599e2e6277xinhe
9359954faa70d4172617b8b77743d1fdd599e2e6277xinhe        if (params.deviceType != RTT_PEER_TYPE_AP) {
9369954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9379954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if (params.requestType != RTT_TYPE_ONE_SIDED && params.requestType !=
9389954faa70d4172617b8b77743d1fdd599e2e6277xinhe                RTT_TYPE_TWO_SIDED) {
9399954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Illegal Request Type: " + params.requestType);
9409954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9419954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if (params.requestType == RTT_TYPE_ONE_SIDED &&
9429954faa70d4172617b8b77743d1fdd599e2e6277xinhe                !mRttCapabilities.oneSidedRttSupported) {
9439954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": One side RTT is not supported");
9449954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9459954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if (params.requestType == RTT_TYPE_TWO_SIDED &&
9469954faa70d4172617b8b77743d1fdd599e2e6277xinhe                !mRttCapabilities.twoSided11McRttSupported) {
9479954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": two side RTT is not supported");
9489954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
949d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        }  else if(params.bssid == null || params.bssid.isEmpty()) {
9503e9a1775d67b7fe1ee7c6f07f586dde391785e7fWei Wang            Log.e(TAG,"No BSSID in params");
9513e9a1775d67b7fe1ee7c6f07f586dde391785e7fWei Wang            return false;
952d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        } else if ( params.numberBurst != 0 ) {
9539954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Illegal number of burst: " + params.numberBurst);
9549954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
955d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        } else if (params.numSamplesPerBurst <= 0 || params.numSamplesPerBurst > 31) {
9569954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Illegal sample number per burst: " +
9579954faa70d4172617b8b77743d1fdd599e2e6277xinhe                    params.numSamplesPerBurst);
9589954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
959d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        } else if (params.numRetriesPerMeasurementFrame < 0 ||
960d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                params.numRetriesPerMeasurementFrame > 3) {
961d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            Log.e(TAG, "Request " + index + ": Illegal measurement frame retry number:" +
962d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    params.numRetriesPerMeasurementFrame);
963d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            return false;
964d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        } else if(params.numRetriesPerFTMR < 0 ||
965d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                params.numRetriesPerFTMR > 3) {
966d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe            Log.e(TAG, "Request " + index + ": Illegal FTMR frame retry number:" +
967d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                    params.numRetriesPerFTMR);
9689954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9699954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if (params.LCIRequest && !mRttCapabilities.lciSupported) {
9709954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": LCI is not supported");
9719954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9729954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if (params.LCRRequest && !mRttCapabilities.lcrSupported) {
9739954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": LCR is not supported");
9749954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
975d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe        } else if (params.burstTimeout < 1 ||
976d5351e7b602f8b69de8b89e343aeb71b5b5d879axinhe                (params.burstTimeout > 11 && params.burstTimeout != 15)){
9779954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Illegal burst timeout: " + params.burstTimeout);
9789954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9799954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if ((params.preamble & mRttCapabilities.preambleSupported) == 0) {
9809954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Do not support this preamble: " + params.preamble);
9819954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9829954faa70d4172617b8b77743d1fdd599e2e6277xinhe        } else if ((params.bandwidth & mRttCapabilities.bwSupported) == 0) {
9839954faa70d4172617b8b77743d1fdd599e2e6277xinhe            Log.e(TAG, "Request " + index + ": Do not support this bandwidth: " + params.bandwidth);
9849954faa70d4172617b8b77743d1fdd599e2e6277xinhe            return false;
9859954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
9869954faa70d4172617b8b77743d1fdd599e2e6277xinhe
9879954faa70d4172617b8b77743d1fdd599e2e6277xinhe        return true;
9889954faa70d4172617b8b77743d1fdd599e2e6277xinhe    }
9899954faa70d4172617b8b77743d1fdd599e2e6277xinhe
9907f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe    /**
9917f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     * Request to start an RTT ranging
9927f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     *
9937f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     * @param params  -- RTT request Parameters
9947f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     * @param listener -- Call back to inform RTT result
9957f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     * @exception throw IllegalArgumentException when params are illegal
9967f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     *            throw IllegalStateException when RttCapabilities do not exist
9977f61051949875edf4bfbf29b00ad6f2ede61d6cbxinhe     */
998d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
999c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public void startRanging(RttParams[] params, RttListener listener) {
10009954faa70d4172617b8b77743d1fdd599e2e6277xinhe        int index  = 0;
10019954faa70d4172617b8b77743d1fdd599e2e6277xinhe        for(RttParams rttParam : params) {
10029954faa70d4172617b8b77743d1fdd599e2e6277xinhe            if (!rttParamSanity(rttParam, index)) {
10039954faa70d4172617b8b77743d1fdd599e2e6277xinhe                throw new IllegalArgumentException("RTT Request Parameter Illegal");
10049954faa70d4172617b8b77743d1fdd599e2e6277xinhe            }
10059954faa70d4172617b8b77743d1fdd599e2e6277xinhe            index++;
10069954faa70d4172617b8b77743d1fdd599e2e6277xinhe        }
10077686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        validateChannel();
1008c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
1009023158cbbc378bc924ad2e55b773c4e8fcb44ec8xinhe        Log.i(TAG, "Send RTT request to RTT Service");
1010bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.sendMessage(CMD_OP_START_RANGING,
1011c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                0, putListener(listener), parcelableParams);
10127686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
10137686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1014d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
10157686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    public void stopRanging(RttListener listener) {
10167686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        validateChannel();
1017bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.sendMessage(CMD_OP_STOP_RANGING, 0, removeListener(listener));
10187686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
10197686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1020564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    /**
1021564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Callbacks for responder operations.
1022564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * <p>
1023564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * A {@link ResponderCallback} is the handle to the calling client. {@link RttManager} will keep
1024564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * a reference to the callback for the entire period when responder is enabled. The same
1025564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * callback as used in enabling responder needs to be passed for disabling responder.
1026564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * The client can freely destroy or reuse the callback after {@link RttManager#disableResponder}
1027564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * is called.
1028564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     */
1029564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public abstract static class ResponderCallback {
1030564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /** Callback when responder is enabled. */
1031564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public abstract void onResponderEnabled(ResponderConfig config);
1032564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /** Callback when enabling responder failed. */
1033564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public abstract void onResponderEnableFailure(int reason);
1034564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        // TODO: consider adding onResponderAborted once it's supported.
1035564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    }
1036564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1037564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    /**
1038564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Enable Wi-Fi RTT responder mode on the device. The enabling result will be delivered via
1039564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * {@code callback}.
1040564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * <p>
1041564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Note calling this method with the same callback when the responder is already enabled won't
1042564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * change the responder state, a cached {@link ResponderConfig} from the last enabling will be
1043564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * returned through the callback.
1044564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     *
1045564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * @param callback Callback for responder enabling/disabling result.
1046564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * @throws IllegalArgumentException If {@code callback} is null.
1047564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     */
1048d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
1049564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public void enableResponder(ResponderCallback callback) {
1050564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        if (callback == null) {
1051564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            throw new IllegalArgumentException("callback cannot be null");
1052564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1053564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        validateChannel();
1054564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        int key = putListenerIfAbsent(callback);
1055bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.sendMessage(CMD_OP_ENABLE_RESPONDER, 0, key);
1056564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    }
1057564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1058564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    /**
1059564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Disable Wi-Fi RTT responder mode on the device. The {@code callback} needs to be the
1060564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * same one used in {@link #enableResponder(ResponderCallback)}.
1061564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * <p>
1062564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Calling this method when responder isn't enabled won't have any effect. The callback can be
1063564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * reused for enabling responder after this method is called.
1064564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     *
1065564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * @param callback The same callback used for enabling responder.
1066564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * @throws IllegalArgumentException If {@code callback} is null.
1067564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     */
1068d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
1069564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public void disableResponder(ResponderCallback callback) {
1070564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        if (callback == null) {
1071564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            throw new IllegalArgumentException("callback cannot be null");
1072564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1073564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        validateChannel();
1074564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        int key = removeListener(callback);
1075564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        if (key == INVALID_KEY) {
1076564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            Log.e(TAG, "responder not enabled yet");
1077564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            return;
1078564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1079bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.sendMessage(CMD_OP_DISABLE_RESPONDER, 0, key);
1080564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    }
1081564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1082564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    /**
1083564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * Configuration used for RTT responder mode. The configuration information can be used by a
1084564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * peer device to range the responder.
1085564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     *
1086564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     * @see ScanResult
1087564527dc5af7e1a61196273f4e02835924a4a14fWei Wang     */
1088564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static class ResponderConfig implements Parcelable {
1089564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1090564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        // TODO: make all fields final once we can get mac address from responder HAL APIs.
1091564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1092564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * Wi-Fi mac address used for responder mode.
1093564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1094564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public String macAddress = "";
1095564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1096564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1097564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * The primary 20 MHz frequency (in MHz) of the channel where responder is enabled.
1098564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * @see ScanResult#frequency
1099564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1100564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int frequency;
1101564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1102564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1103564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * Center frequency of the channel where responder is enabled on. Only in use when channel
1104564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * width is at least 40MHz.
1105564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * @see ScanResult#centerFreq0
1106564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1107564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int centerFreq0;
1108564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1109564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1110564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * Center frequency of the second segment when channel width is 80 + 80 MHz.
1111564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * @see ScanResult#centerFreq1
1112564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1113564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int centerFreq1;
1114564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1115564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1116564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * Width of the channel where responder is enabled on.
1117564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * @see ScanResult#channelWidth
1118564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1119564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int channelWidth;
1120564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1121564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /**
1122564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         * Preamble supported by responder.
1123564527dc5af7e1a61196273f4e02835924a4a14fWei Wang         */
1124564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int preamble;
1125564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1126564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        @Override
1127564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public String toString() {
1128564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            StringBuilder builder = new StringBuilder();
1129564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            builder.append("macAddress = ").append(macAddress)
1130564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    .append(" frequency = ").append(frequency)
1131564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    .append(" centerFreq0 = ").append(centerFreq0)
1132564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    .append(" centerFreq1 = ").append(centerFreq1)
1133564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    .append(" channelWidth = ").append(channelWidth)
1134564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    .append(" preamble = ").append(preamble);
1135564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            return builder.toString();
1136564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1137564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1138564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        @Override
1139564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public int describeContents() {
1140564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            return 0;
1141564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1142564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1143564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        @Override
1144564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public void writeToParcel(Parcel dest, int flags) {
1145564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeString(macAddress);
1146564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(frequency);
1147564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(centerFreq0);
1148564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(centerFreq1);
1149564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(channelWidth);
1150564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            dest.writeInt(preamble);
1151564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1152564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1153564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        /** Implement {@link Parcelable} interface */
1154564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        public static final Parcelable.Creator<ResponderConfig> CREATOR =
1155564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                new Parcelable.Creator<ResponderConfig>() {
1156564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            @Override
1157564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            public ResponderConfig createFromParcel(Parcel in) {
1158564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                ResponderConfig config = new ResponderConfig();
1159564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.macAddress = in.readString();
1160564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.frequency = in.readInt();
1161564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.centerFreq0 = in.readInt();
1162564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.centerFreq1 = in.readInt();
1163564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.channelWidth = in.readInt();
1164564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                config.preamble = in.readInt();
1165564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                return config;
1166564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            }
1167564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1168564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            @Override
1169564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            public ResponderConfig[] newArray(int size) {
1170564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                return new ResponderConfig[size];
1171564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            }
1172564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        };
1173564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1174564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    }
1175564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
11767686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    /* private methods */
1177c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int BASE = Protocol.BASE_WIFI_RTT_MANAGER;
1178c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
1179c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int CMD_OP_START_RANGING        = BASE + 0;
1180c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int CMD_OP_STOP_RANGING         = BASE + 1;
1181c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int CMD_OP_FAILED               = BASE + 2;
1182c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int CMD_OP_SUCCEEDED            = BASE + 3;
1183c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande    public static final int CMD_OP_ABORTED              = BASE + 4;
1184564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static final int CMD_OP_ENABLE_RESPONDER     = BASE + 5;
1185564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static final int CMD_OP_DISABLE_RESPONDER    = BASE + 6;
1186564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static final int
1187564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            CMD_OP_ENALBE_RESPONDER_SUCCEEDED           = BASE + 7;
1188564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    public static final int
1189564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            CMD_OP_ENALBE_RESPONDER_FAILED              = BASE + 8;
11907686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
11917686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    private static final int INVALID_KEY = 0;
11927686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1193bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private final Context mContext;
1194bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private final IRttManager mService;
1195bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private final SparseArray mListenerMap = new SparseArray();
1196bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private final Object mListenerMapLock = new Object();
1197bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private final Object mCapabilitiesLock = new Object();
11987686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1199bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private RttCapabilities mRttCapabilities;
1200bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private int mListenerKey = 1;
1201bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private AsyncChannel mAsyncChannel;
12027686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
12037686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    /**
12047686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * Create a new WifiScanner instance.
12057686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * Applications will almost always want to use
12067686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
1207c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande     * the standard {@link android.content.Context#WIFI_RTT_SERVICE Context.WIFI_RTT_SERVICE}.
12087686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * @param context the application context
12097686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * @param service the Binder interface
1210bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang     * @param looper Looper for running the callbacks.
1211bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang     *
12127686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     * @hide
12137686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande     */
1214bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    public RttManager(Context context, IRttManager service, Looper looper) {
12157686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        mContext = context;
12167686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        mService = service;
1217bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        Messenger messenger = null;
1218bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        try {
1219bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            Log.d(TAG, "Get the messenger from " + mService);
1220bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            messenger = mService.getMessenger();
1221bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        } catch (RemoteException e) {
1222bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            throw e.rethrowFromSystemServer();
1223bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        }
12247686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1225bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        if (messenger == null) {
1226bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            throw new IllegalStateException("getMessenger() returned null!  This is invalid.");
1227bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        }
12287686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1229bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel = new AsyncChannel();
12307686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1231bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        Handler handler = new ServiceHandler(looper);
1232bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.connectSync(mContext, handler, messenger);
1233bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        // We cannot use fullyConnectSync because it sends the FULL_CONNECTION message
1234bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        // synchronously, which causes RttService to receive the wrong replyTo value.
1235bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
12367686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
12377686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
12387686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    private void validateChannel() {
1239bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        if (mAsyncChannel == null) throw new IllegalStateException(
12407686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                "No permission to access and change wifi or a bad initialization");
12417686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
12427686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1243bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private int putListener(Object listener) {
12447686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        if (listener == null) return INVALID_KEY;
12457686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        int key;
1246bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
12477686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            do {
1248bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                key = mListenerKey++;
12497686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            } while (key == INVALID_KEY);
1250bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            mListenerMap.put(key, listener);
12517686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
12527686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        return key;
12537686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
12547686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1255bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    // Insert a listener if it doesn't exist in mListenerMap. Returns the key of the listener.
1256bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private int putListenerIfAbsent(Object listener) {
1257564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        if (listener == null) return INVALID_KEY;
1258bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
1259564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            int key = getListenerKey(listener);
1260564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            if (key != INVALID_KEY) {
1261564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                return key;
1262564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            }
1263564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            do {
1264bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                key = mListenerKey++;
1265564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            } while (key == INVALID_KEY);
1266bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            mListenerMap.put(key, listener);
1267564527dc5af7e1a61196273f4e02835924a4a14fWei Wang            return key;
1268564527dc5af7e1a61196273f4e02835924a4a14fWei Wang        }
1269564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1270564527dc5af7e1a61196273f4e02835924a4a14fWei Wang    }
1271564527dc5af7e1a61196273f4e02835924a4a14fWei Wang
1272bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private Object getListener(int key) {
12737686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        if (key == INVALID_KEY) return null;
1274bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
1275bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            Object listener = mListenerMap.get(key);
12767686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            return listener;
12777686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
12787686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
12797686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1280bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private int getListenerKey(Object listener) {
12817686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        if (listener == null) return INVALID_KEY;
1282bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
1283bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            int index = mListenerMap.indexOfValue(listener);
12847686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            if (index == -1) {
12857686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                return INVALID_KEY;
12867686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            } else {
1287bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                return mListenerMap.keyAt(index);
12887686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            }
12897686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
12907686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
12917686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1292bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private Object removeListener(int key) {
12937686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        if (key == INVALID_KEY) return null;
1294bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
1295bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            Object listener = mListenerMap.get(key);
1296bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            mListenerMap.remove(key);
12977686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            return listener;
12987686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
12997686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
13007686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1301bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private int removeListener(Object listener) {
13027686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        int key = getListenerKey(listener);
13037686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        if (key == INVALID_KEY) return key;
1304bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang        synchronized (mListenerMapLock) {
1305bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang            mListenerMap.remove(key);
13067686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            return key;
13077686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
13087686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
13097686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1310bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang    private class ServiceHandler extends Handler {
13117686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        ServiceHandler(Looper looper) {
13127686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            super(looper);
13137686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
13147686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        @Override
13157686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        public void handleMessage(Message msg) {
1316023158cbbc378bc924ad2e55b773c4e8fcb44ec8xinhe            Log.i(TAG, "RTT manager get message: " + msg.what);
13177686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            switch (msg.what) {
13187686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED:
13197686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    return;
13207686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
13217686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    Log.e(TAG, "Channel connection lost");
13227686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    // This will cause all further async API calls on the WifiManager
13237686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    // to fail and throw an exception
1324bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                    mAsyncChannel = null;
13257686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    getLooper().quit();
13267686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    return;
13277686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            }
13287686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
13297686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            Object listener = getListener(msg.arg2);
13307686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            if (listener == null) {
1331023158cbbc378bc924ad2e55b773c4e8fcb44ec8xinhe                Log.e(TAG, "invalid listener key = " + msg.arg2 );
13327686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                return;
13337686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            } else {
1334023158cbbc378bc924ad2e55b773c4e8fcb44ec8xinhe                Log.i(TAG, "listener key = " + msg.arg2);
13357686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            }
13367686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
13377686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            switch (msg.what) {
13387686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                /* ActionListeners grouped together */
13397686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                case CMD_OP_SUCCEEDED :
1340c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    reportSuccess(listener, msg);
1341c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    removeListener(msg.arg2);
13427686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    break;
13437686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                case CMD_OP_FAILED :
1344c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande                    reportFailure(listener, msg);
13457686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    removeListener(msg.arg2);
13467686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    break;
13477686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                case CMD_OP_ABORTED :
13487686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    ((RttListener) listener).onAborted();
13497686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    removeListener(msg.arg2);
13507686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    break;
1351564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                case CMD_OP_ENALBE_RESPONDER_SUCCEEDED:
1352564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    ResponderConfig config = (ResponderConfig) msg.obj;
1353564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    ((ResponderCallback) (listener)).onResponderEnabled(config);
1354564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    break;
1355564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                case CMD_OP_ENALBE_RESPONDER_FAILED:
1356564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    ((ResponderCallback) (listener)).onResponderEnableFailure(msg.arg1);
1357564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    removeListener(msg.arg2);
1358564527dc5af7e1a61196273f4e02835924a4a14fWei Wang                    break;
13597686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                default:
13607686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    if (DBG) Log.d(TAG, "Ignoring message " + msg.what);
13617686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande                    return;
13627686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande            }
13637686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande        }
1364c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
1365c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        void reportSuccess(Object listener, Message msg) {
1366c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            RttListener rttListener = (RttListener) listener;
1367c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            ParcelableRttResults parcelableResults = (ParcelableRttResults) msg.obj;
1368c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            ((RttListener) listener).onSuccess(parcelableResults.mResults);
1369c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
1370c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande
1371c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        void reportFailure(Object listener, Message msg) {
1372c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            RttListener rttListener = (RttListener) listener;
1373c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            Bundle bundle = (Bundle) msg.obj;
1374c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande            ((RttListener) listener).onFailure(msg.arg1, bundle.getString(DESCRIPTION_KEY));
1375c4272f32aec68ae2377141a2d6d4e6059fb36714Vinit Deshpande        }
13767686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande    }
13777686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
13787686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande}
13797686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande
1380