• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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