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