1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.uwb.support.fira; 18 19 import static com.google.common.base.Preconditions.checkArgument; 20 21 import static java.util.Objects.requireNonNull; 22 23 import android.os.PersistableBundle; 24 import android.uwb.RangingSession; 25 import android.uwb.UwbAddress; 26 27 import androidx.annotation.FloatRange; 28 import androidx.annotation.Nullable; 29 30 /** 31 * UWB parameters used to reconfigure a FiRa session. Supports peer adding/removing. 32 * 33 * <p>This is passed as a bundle to the service API {@link RangingSession#reconfigure}. 34 */ 35 public class FiraRangingReconfigureParams extends FiraParams { 36 private static final int BUNDLE_VERSION_1 = 1; 37 private static final int BUNDLE_VERSION_CURRENT = BUNDLE_VERSION_1; 38 39 @Nullable @MulticastListUpdateAction private final Integer mAction; 40 @Nullable private final UwbAddress[] mAddressList; 41 @Nullable private final int[] mSubSessionIdList; 42 @Nullable private final byte[] mSubSessionKeyList; 43 44 @Nullable private final Integer mBlockStrideLength; 45 46 @Nullable @RangeDataNtfConfig private final Integer mRangeDataNtfConfig; 47 @Nullable private final Integer mRangeDataProximityNear; 48 @Nullable private final Integer mRangeDataProximityFar; 49 @Nullable private final Double mRangeDataAoaAzimuthLower; 50 @Nullable private final Double mRangeDataAoaAzimuthUpper; 51 @Nullable private final Double mRangeDataAoaElevationLower; 52 @Nullable private final Double mRangeDataAoaElevationUpper; 53 54 private static final String KEY_ACTION = "action"; 55 private static final String KEY_MAC_ADDRESS_MODE = "mac_address_mode"; 56 private static final String KEY_ADDRESS_LIST = "address_list"; 57 private static final String KEY_SUB_SESSION_ID_LIST = "sub_session_id_list"; 58 private static final String KEY_SUB_SESSION_KEY_LIST = "sub_session_key_list"; 59 private static final String KEY_UPDATE_BLOCK_STRIDE_LENGTH = "update_block_stride_length"; 60 private static final String KEY_UPDATE_RANGE_DATA_NTF_CONFIG = "update_range_data_ntf_config"; 61 private static final String KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_NEAR = 62 "update_range_data_proximity_near"; 63 private static final String KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_FAR = 64 "update_range_data_proximity_far"; 65 private static final String KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER = 66 "range_data_aoa_azimuth_lower"; 67 private static final String KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER = 68 "range_data_aoa_azimuth_upper"; 69 private static final String KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_LOWER = 70 "range_data_aoa_elevation_lower"; 71 private static final String KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_UPPER = 72 "range_data_aoa_elevation_upper"; 73 FiraRangingReconfigureParams( @ullable @ulticastListUpdateAction Integer action, @Nullable UwbAddress[] addressList, @Nullable int[] subSessionIdList, @Nullable byte[] subSessionKeyList, @Nullable Integer blockStrideLength, @Nullable Integer rangeDataNtfConfig, @Nullable Integer rangeDataProximityNear, @Nullable Integer rangeDataProximityFar, @Nullable Double rangeDataAoaAzimuthLower, @Nullable Double rangeDataAoaAzimuthUpper, @Nullable Double rangeDataAoaElevationLower, @Nullable Double rangeDataAoaElevationUpper)74 private FiraRangingReconfigureParams( 75 @Nullable @MulticastListUpdateAction Integer action, 76 @Nullable UwbAddress[] addressList, 77 @Nullable int[] subSessionIdList, 78 @Nullable byte[] subSessionKeyList, 79 @Nullable Integer blockStrideLength, 80 @Nullable Integer rangeDataNtfConfig, 81 @Nullable Integer rangeDataProximityNear, 82 @Nullable Integer rangeDataProximityFar, 83 @Nullable Double rangeDataAoaAzimuthLower, 84 @Nullable Double rangeDataAoaAzimuthUpper, 85 @Nullable Double rangeDataAoaElevationLower, 86 @Nullable Double rangeDataAoaElevationUpper) { 87 mAction = action; 88 mAddressList = addressList; 89 mSubSessionIdList = subSessionIdList; 90 mSubSessionKeyList = subSessionKeyList; 91 mBlockStrideLength = blockStrideLength; 92 mRangeDataNtfConfig = rangeDataNtfConfig; 93 mRangeDataProximityNear = rangeDataProximityNear; 94 mRangeDataProximityFar = rangeDataProximityFar; 95 mRangeDataAoaAzimuthLower = rangeDataAoaAzimuthLower; 96 mRangeDataAoaAzimuthUpper = rangeDataAoaAzimuthUpper; 97 mRangeDataAoaElevationLower = rangeDataAoaElevationLower; 98 mRangeDataAoaElevationUpper = rangeDataAoaElevationUpper; 99 } 100 101 @Override getBundleVersion()102 protected int getBundleVersion() { 103 return BUNDLE_VERSION_CURRENT; 104 } 105 106 @Nullable 107 @MulticastListUpdateAction getAction()108 public Integer getAction() { 109 return mAction; 110 } 111 112 @Nullable getAddressList()113 public UwbAddress[] getAddressList() { 114 return mAddressList; 115 } 116 117 @Nullable getSubSessionIdList()118 public int[] getSubSessionIdList() { 119 return mSubSessionIdList; 120 } 121 122 @Nullable getSubSessionKeyList()123 public byte[] getSubSessionKeyList() { 124 return mSubSessionKeyList; 125 } 126 127 @Nullable getBlockStrideLength()128 public Integer getBlockStrideLength() { 129 return mBlockStrideLength; 130 } 131 132 @Nullable getRangeDataNtfConfig()133 public Integer getRangeDataNtfConfig() { 134 return mRangeDataNtfConfig; 135 } 136 137 @Nullable getRangeDataProximityNear()138 public Integer getRangeDataProximityNear() { 139 return mRangeDataProximityNear; 140 } 141 142 @Nullable getRangeDataProximityFar()143 public Integer getRangeDataProximityFar() { 144 return mRangeDataProximityFar; 145 } 146 147 @Nullable getRangeDataAoaAzimuthLower()148 public Double getRangeDataAoaAzimuthLower() { 149 return mRangeDataAoaAzimuthLower; 150 } 151 152 @Nullable getRangeDataAoaAzimuthUpper()153 public Double getRangeDataAoaAzimuthUpper() { 154 return mRangeDataAoaAzimuthUpper; 155 } 156 157 @Nullable getRangeDataAoaElevationLower()158 public Double getRangeDataAoaElevationLower() { 159 return mRangeDataAoaElevationLower; 160 } 161 162 @Nullable getRangeDataAoaElevationUpper()163 public Double getRangeDataAoaElevationUpper() { 164 return mRangeDataAoaElevationUpper; 165 } 166 167 @Nullable byteArrayToIntArray(@ullable byte[] bytes)168 private static int[] byteArrayToIntArray(@Nullable byte[] bytes) { 169 if (bytes == null) { 170 return null; 171 } 172 173 int[] values = new int[bytes.length]; 174 for (int i = 0; i < values.length; i++) { 175 values[i] = bytes[i]; 176 } 177 return values; 178 } 179 180 @Nullable intArrayToByteArray(@ullable int[] values)181 private static byte[] intArrayToByteArray(@Nullable int[] values) { 182 if (values == null) { 183 return null; 184 } 185 byte[] bytes = new byte[values.length]; 186 for (int i = 0; i < values.length; i++) { 187 bytes[i] = (byte) values[i]; 188 } 189 return bytes; 190 } 191 192 @Override toBundle()193 public PersistableBundle toBundle() { 194 PersistableBundle bundle = super.toBundle(); 195 if (mAction != null) { 196 requireNonNull(mAddressList); 197 bundle.putInt(KEY_ACTION, mAction); 198 199 long[] addressList = new long[mAddressList.length]; 200 int i = 0; 201 for (UwbAddress address : mAddressList) { 202 addressList[i++] = uwbAddressToLong(address); 203 } 204 int macAddressMode = MAC_ADDRESS_MODE_2_BYTES; 205 if (mAddressList[0].size() == UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH) { 206 macAddressMode = MAC_ADDRESS_MODE_8_BYTES; 207 } 208 bundle.putInt(KEY_MAC_ADDRESS_MODE, macAddressMode); 209 bundle.putLongArray(KEY_ADDRESS_LIST, addressList); 210 bundle.putIntArray(KEY_SUB_SESSION_KEY_LIST, byteArrayToIntArray(mSubSessionKeyList)); 211 bundle.putIntArray(KEY_SUB_SESSION_ID_LIST, mSubSessionIdList); 212 } 213 214 if (mBlockStrideLength != null) { 215 bundle.putInt(KEY_UPDATE_BLOCK_STRIDE_LENGTH, mBlockStrideLength); 216 } 217 218 if (mRangeDataNtfConfig != null) { 219 bundle.putInt(KEY_UPDATE_RANGE_DATA_NTF_CONFIG, mRangeDataNtfConfig); 220 } 221 222 if (mRangeDataProximityNear != null) { 223 bundle.putInt(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_NEAR, mRangeDataProximityNear); 224 } 225 226 if (mRangeDataProximityFar != null) { 227 bundle.putInt(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_FAR, mRangeDataProximityFar); 228 } 229 230 if (mRangeDataAoaAzimuthLower != null) { 231 bundle.putDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER, 232 mRangeDataAoaAzimuthLower); 233 } 234 235 if (mRangeDataAoaAzimuthUpper != null) { 236 bundle.putDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER, 237 mRangeDataAoaAzimuthUpper); 238 } 239 240 if (mRangeDataAoaElevationLower != null) { 241 bundle.putDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_LOWER, 242 mRangeDataAoaElevationLower); 243 } 244 245 if (mRangeDataAoaElevationUpper != null) { 246 bundle.putDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_UPPER, 247 mRangeDataAoaElevationUpper); 248 } 249 250 return bundle; 251 } 252 fromBundle(PersistableBundle bundle)253 public static FiraRangingReconfigureParams fromBundle(PersistableBundle bundle) { 254 if (!isCorrectProtocol(bundle)) { 255 throw new IllegalArgumentException("Invalid protocol"); 256 } 257 258 switch (getBundleVersion(bundle)) { 259 case BUNDLE_VERSION_1: 260 return parseVersion1(bundle); 261 262 default: 263 throw new IllegalArgumentException("Invalid bundle version"); 264 } 265 } 266 parseVersion1(PersistableBundle bundle)267 private static FiraRangingReconfigureParams parseVersion1(PersistableBundle bundle) { 268 FiraRangingReconfigureParams.Builder builder = new FiraRangingReconfigureParams.Builder(); 269 if (bundle.containsKey(KEY_ACTION)) { 270 int macAddressMode = bundle.getInt(KEY_MAC_ADDRESS_MODE); 271 int addressByteLength = UwbAddress.SHORT_ADDRESS_BYTE_LENGTH; 272 if (macAddressMode == MAC_ADDRESS_MODE_8_BYTES) { 273 addressByteLength = UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH; 274 } 275 276 long[] addresses = bundle.getLongArray(KEY_ADDRESS_LIST); 277 UwbAddress[] addressList = new UwbAddress[addresses.length]; 278 for (int i = 0; i < addresses.length; i++) { 279 addressList[i] = longToUwbAddress(addresses[i], addressByteLength); 280 } 281 builder.setAction(bundle.getInt(KEY_ACTION)) 282 .setAddressList(addressList) 283 .setSubSessionIdList(bundle.getIntArray(KEY_SUB_SESSION_ID_LIST)) 284 .setSubSessionKeyList( 285 intArrayToByteArray(bundle.getIntArray(KEY_SUB_SESSION_KEY_LIST))); 286 } 287 288 if (bundle.containsKey(KEY_UPDATE_BLOCK_STRIDE_LENGTH)) { 289 builder.setBlockStrideLength(bundle.getInt(KEY_UPDATE_BLOCK_STRIDE_LENGTH)); 290 } 291 292 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_CONFIG)) { 293 builder.setRangeDataNtfConfig(bundle.getInt(KEY_UPDATE_RANGE_DATA_NTF_CONFIG)); 294 } 295 296 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_NEAR)) { 297 builder.setRangeDataProximityNear( 298 bundle.getInt(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_NEAR)); 299 } 300 301 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_FAR)) { 302 builder.setRangeDataProximityFar( 303 bundle.getInt(KEY_UPDATE_RANGE_DATA_NTF_PROXIMITY_FAR)); 304 } 305 306 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER)) { 307 builder.setRangeDataAoaAzimuthLower( 308 bundle.getDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER)); 309 } 310 311 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER)) { 312 builder.setRangeDataAoaAzimuthUpper( 313 bundle.getDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER)); 314 } 315 316 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_LOWER)) { 317 builder.setRangeDataAoaElevationLower( 318 bundle.getDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_LOWER)); 319 } 320 321 if (bundle.containsKey(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_UPPER)) { 322 builder.setRangeDataAoaElevationUpper( 323 bundle.getDouble(KEY_UPDATE_RANGE_DATA_NTF_AOA_ELEVATION_UPPER)); 324 } 325 return builder.build(); 326 } 327 328 /** Builder */ 329 public static class Builder { 330 @Nullable private Integer mAction = null; 331 @Nullable private UwbAddress[] mAddressList = null; 332 @Nullable private int[] mSubSessionIdList = null; 333 @Nullable private byte[] mSubSessionKeyList = null; 334 335 @Nullable private Integer mBlockStrideLength = null; 336 337 @Nullable private Integer mRangeDataNtfConfig = null; 338 @Nullable private Integer mRangeDataProximityNear = null; 339 @Nullable private Integer mRangeDataProximityFar = null; 340 @Nullable private Double mRangeDataAoaAzimuthLower = null; 341 @Nullable private Double mRangeDataAoaAzimuthUpper = null; 342 @Nullable private Double mRangeDataAoaElevationLower = null; 343 @Nullable private Double mRangeDataAoaElevationUpper = null; 344 setAction( @ulticastListUpdateAction int action)345 public FiraRangingReconfigureParams.Builder setAction( 346 @MulticastListUpdateAction int action) { 347 mAction = action; 348 return this; 349 } 350 setAddressList(UwbAddress[] addressList)351 public FiraRangingReconfigureParams.Builder setAddressList(UwbAddress[] addressList) { 352 mAddressList = addressList; 353 return this; 354 } 355 setSubSessionIdList(int[] subSessionIdList)356 public FiraRangingReconfigureParams.Builder setSubSessionIdList(int[] subSessionIdList) { 357 mSubSessionIdList = subSessionIdList; 358 return this; 359 } 360 361 /** Sub Session Key List setter. This is a 2D array of keys represented as 1D array */ setSubSessionKeyList(byte[] subSessionKeyList)362 public FiraRangingReconfigureParams.Builder setSubSessionKeyList(byte[] subSessionKeyList) { 363 mSubSessionKeyList = subSessionKeyList; 364 return this; 365 } 366 setBlockStrideLength(int blockStrideLength)367 public FiraRangingReconfigureParams.Builder setBlockStrideLength(int blockStrideLength) { 368 mBlockStrideLength = blockStrideLength; 369 return this; 370 } 371 setRangeDataNtfConfig(int rangeDataNtfConfig)372 public FiraRangingReconfigureParams.Builder setRangeDataNtfConfig(int rangeDataNtfConfig) { 373 mRangeDataNtfConfig = rangeDataNtfConfig; 374 return this; 375 } 376 setRangeDataProximityNear( int rangeDataProximityNear)377 public FiraRangingReconfigureParams.Builder setRangeDataProximityNear( 378 int rangeDataProximityNear) { 379 mRangeDataProximityNear = rangeDataProximityNear; 380 return this; 381 } 382 setRangeDataProximityFar( int rangeDataProximityFar)383 public FiraRangingReconfigureParams.Builder setRangeDataProximityFar( 384 int rangeDataProximityFar) { 385 mRangeDataProximityFar = rangeDataProximityFar; 386 return this; 387 } 388 setRangeDataAoaAzimuthLower( @loatRangefrom = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) double rangeDataAoaAzimuthLower)389 public Builder setRangeDataAoaAzimuthLower( 390 @FloatRange(from = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, 391 to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) 392 double rangeDataAoaAzimuthLower) { 393 mRangeDataAoaAzimuthLower = rangeDataAoaAzimuthLower; 394 return this; 395 } 396 setRangeDataAoaAzimuthUpper( @loatRangefrom = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) double rangeDataAoaAzimuthUpper)397 public Builder setRangeDataAoaAzimuthUpper( 398 @FloatRange(from = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, 399 to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) 400 double rangeDataAoaAzimuthUpper) { 401 mRangeDataAoaAzimuthUpper = rangeDataAoaAzimuthUpper; 402 return this; 403 } 404 setRangeDataAoaElevationLower( @loatRangefrom = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) double rangeDataAoaElevationLower)405 public Builder setRangeDataAoaElevationLower( 406 @FloatRange(from = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, 407 to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) 408 double rangeDataAoaElevationLower) { 409 mRangeDataAoaElevationLower = rangeDataAoaElevationLower; 410 return this; 411 } 412 setRangeDataAoaElevationUpper( @loatRangefrom = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) double rangeDataAoaElevationUpper)413 public Builder setRangeDataAoaElevationUpper( 414 @FloatRange(from = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, 415 to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) 416 double rangeDataAoaElevationUpper) { 417 mRangeDataAoaElevationUpper = rangeDataAoaElevationUpper; 418 return this; 419 } 420 checkAddressList()421 private void checkAddressList() { 422 checkArgument(mAddressList != null && mAddressList.length > 0); 423 for (UwbAddress uwbAddress : mAddressList) { 424 requireNonNull(uwbAddress); 425 checkArgument(uwbAddress.size() == UwbAddress.SHORT_ADDRESS_BYTE_LENGTH); 426 } 427 428 if (mAction == P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE) { 429 checkArgument(mSubSessionKeyList != null 430 && mSubSessionKeyList.length == 16 * mSubSessionIdList.length); 431 } 432 if (mAction == P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_32_BYTE) { 433 checkArgument(mSubSessionKeyList != null 434 && mSubSessionKeyList.length == 32 * mSubSessionIdList.length); 435 } 436 } 437 checkRangeDataNtfConfig()438 private void checkRangeDataNtfConfig() { 439 if (mRangeDataNtfConfig == null) { 440 return; 441 } 442 if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_DISABLE) { 443 checkArgument(mRangeDataProximityNear == null); 444 checkArgument(mRangeDataProximityFar == null); 445 checkArgument(mRangeDataAoaAzimuthLower == null); 446 checkArgument(mRangeDataAoaAzimuthUpper == null); 447 checkArgument(mRangeDataAoaElevationLower == null); 448 checkArgument(mRangeDataAoaElevationUpper == null); 449 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG 450 || mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG) { 451 checkArgument(mRangeDataProximityNear != null 452 || mRangeDataProximityFar != null); 453 checkArgument(mRangeDataAoaAzimuthLower == null); 454 checkArgument(mRangeDataAoaAzimuthUpper == null); 455 checkArgument(mRangeDataAoaElevationLower == null); 456 checkArgument(mRangeDataAoaElevationUpper == null); 457 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG 458 || mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG) { 459 checkArgument(mRangeDataProximityNear == null); 460 checkArgument(mRangeDataProximityFar == null); 461 checkArgument((mRangeDataAoaAzimuthLower != null 462 && mRangeDataAoaAzimuthUpper != null) 463 || (mRangeDataAoaElevationLower != null 464 && mRangeDataAoaElevationUpper != null)); 465 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG 466 || mRangeDataNtfConfig 467 == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG) { 468 checkArgument(mRangeDataProximityNear != null 469 || mRangeDataProximityFar != null 470 || (mRangeDataAoaAzimuthLower != null 471 && mRangeDataAoaAzimuthUpper != null) 472 || (mRangeDataAoaElevationLower != null 473 && mRangeDataAoaElevationUpper != null)); 474 } 475 } 476 build()477 public FiraRangingReconfigureParams build() { 478 if (mAction != null) { 479 checkAddressList(); 480 // Either update the address list or update ranging parameters. Not both. 481 checkArgument( 482 mBlockStrideLength == null 483 && mRangeDataNtfConfig == null 484 && mRangeDataProximityNear == null 485 && mRangeDataProximityFar == null 486 && mRangeDataAoaAzimuthLower == null 487 && mRangeDataAoaAzimuthUpper == null 488 && mRangeDataAoaElevationLower == null 489 && mRangeDataAoaElevationUpper == null); 490 } else { 491 checkRangeDataNtfConfig(); 492 checkArgument( 493 mBlockStrideLength != null 494 || mRangeDataNtfConfig != null 495 || mRangeDataProximityNear != null 496 || mRangeDataProximityFar != null 497 || mRangeDataAoaAzimuthLower == null 498 || mRangeDataAoaAzimuthUpper == null 499 || mRangeDataAoaElevationLower == null 500 || mRangeDataAoaElevationUpper == null); 501 } 502 503 return new FiraRangingReconfigureParams( 504 mAction, 505 mAddressList, 506 mSubSessionIdList, 507 mSubSessionKeyList, 508 mBlockStrideLength, 509 mRangeDataNtfConfig, 510 mRangeDataProximityNear, 511 mRangeDataProximityFar, 512 mRangeDataAoaAzimuthLower, 513 mRangeDataAoaAzimuthUpper, 514 mRangeDataAoaElevationLower, 515 mRangeDataAoaElevationUpper); 516 } 517 } 518 } 519