• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.generic;
18 
19 import android.os.PersistableBundle;
20 import android.uwb.UwbManager;
21 
22 import androidx.annotation.NonNull;
23 import androidx.annotation.Nullable;
24 
25 import com.google.uwb.support.aliro.AliroParams;
26 import com.google.uwb.support.aliro.AliroSpecificationParams;
27 import com.google.uwb.support.base.FlagEnum;
28 import com.google.uwb.support.ccc.CccParams;
29 import com.google.uwb.support.ccc.CccSpecificationParams;
30 import com.google.uwb.support.fira.FiraParams;
31 import com.google.uwb.support.fira.FiraSpecificationParams;
32 import com.google.uwb.support.radar.RadarParams;
33 import com.google.uwb.support.radar.RadarSpecificationParams;
34 
35 import java.util.Collection;
36 import java.util.EnumSet;
37 import java.util.Objects;
38 
39 /**
40  * Defines parameters for generic capability.
41  *
42  * <p>This is returned as a bundle from the service API {@link UwbManager#getSpecificationInfo}.
43  */
44 public class GenericSpecificationParams extends GenericParams {
45     private static final int BUNDLE_VERSION_1 = 1;
46     private static final int BUNDLE_VERSION_CURRENT = BUNDLE_VERSION_1;
47 
48     private FiraSpecificationParams mFiraSpecificationParams;
49     private final CccSpecificationParams mCccSpecificationParams;
50     private final AliroSpecificationParams mAliroSpecificationParams;
51     private final RadarSpecificationParams mRadarSpecificationParams;
52     private final boolean mHasPowerStatsSupport;
53     private final int mMaxSupportedSessionCount;
54     private final EnumSet<AntennaModeCapabilityFlag> mAntennaModeCapabilities;
55 
56     private static final String KEY_FIRA_SPECIFICATION_PARAMS = FiraParams.PROTOCOL_NAME;
57     private static final String KEY_ALIRO_SPECIFICATION_PARAMS = AliroParams.PROTOCOL_NAME;
58     private static final String KEY_CCC_SPECIFICATION_PARAMS = CccParams.PROTOCOL_NAME;
59     private static final String KEY_RADAR_SPECIFICATION_PARAMS = RadarParams.PROTOCOL_NAME;
60     private static final String KEY_POWER_STATS_QUERY_SUPPORT = "power_stats_query";
61     private static final String KEY_SUPPORTED_ANTENNA_MODES = "supported_antenna_modes";
62     private static final String KEY_MAX_SUPPORTED_SESSION_COUNT = "max_supported_session_count";
63 
64     public static final int DEFAULT_MAX_SUPPORTED_SESSIONS_COUNT = 5;
65 
GenericSpecificationParams(Builder builder)66     private GenericSpecificationParams(Builder builder) {
67         mFiraSpecificationParams = builder.mFiraSpecificationParams;
68         mCccSpecificationParams = builder.mCccSpecificationParams;
69         mAliroSpecificationParams = builder.mAliroSpecificationParams;
70         mRadarSpecificationParams = builder.mRadarSpecificationParams;
71         mHasPowerStatsSupport = builder.mHasPowerStatsSupport;
72         mAntennaModeCapabilities = builder.mAntennaModeCapabilities;
73         mMaxSupportedSessionCount = builder.mMaxSupportedSessionCount;
74     }
75 
76     @Override
getBundleVersion()77     protected int getBundleVersion() {
78         return BUNDLE_VERSION_CURRENT;
79     }
80 
81     @Nullable
getFiraSpecificationParams()82     public FiraSpecificationParams getFiraSpecificationParams() {
83         return mFiraSpecificationParams;
84     }
85 
86     @Nullable
getCccSpecificationParams()87     public CccSpecificationParams getCccSpecificationParams() {
88         return mCccSpecificationParams;
89     }
90 
91     @Nullable
getAliroSpecificationParams()92     public AliroSpecificationParams getAliroSpecificationParams() {
93         return mAliroSpecificationParams;
94     }
95 
96     @Nullable
getRadarSpecificationParams()97     public RadarSpecificationParams getRadarSpecificationParams() {
98         return mRadarSpecificationParams;
99     }
100 
101     /**
102      * @return if the power stats is supported
103      */
hasPowerStatsSupport()104     public boolean hasPowerStatsSupport() {
105         return mHasPowerStatsSupport;
106     }
107 
108     /** @return antenna mode capabilities. */
getAntennaModeCapabilities()109     public EnumSet<AntennaModeCapabilityFlag> getAntennaModeCapabilities() {
110         return mAntennaModeCapabilities;
111     }
112 
getMaxSupportedSessionCount()113     public int getMaxSupportedSessionCount() {
114         return mMaxSupportedSessionCount;
115     }
116 
setFiraSpecificationParams(FiraSpecificationParams params)117     public void setFiraSpecificationParams(FiraSpecificationParams params) {
118         mFiraSpecificationParams = params;
119     }
120 
121     @Override
toBundle()122     public PersistableBundle toBundle() {
123         PersistableBundle bundle = super.toBundle();
124         bundle.putPersistableBundle(KEY_FIRA_SPECIFICATION_PARAMS,
125                 mFiraSpecificationParams.toBundle());
126         if (mAliroSpecificationParams != null) {
127             bundle.putPersistableBundle(KEY_ALIRO_SPECIFICATION_PARAMS,
128                     mAliroSpecificationParams.toBundle());
129         }
130         if (mCccSpecificationParams != null) {
131             bundle.putPersistableBundle(KEY_CCC_SPECIFICATION_PARAMS,
132                     mCccSpecificationParams.toBundle());
133         }
134         if (mRadarSpecificationParams != null) {
135             bundle.putPersistableBundle(KEY_RADAR_SPECIFICATION_PARAMS,
136                     mRadarSpecificationParams.toBundle());
137         }
138         bundle.putBoolean(KEY_POWER_STATS_QUERY_SUPPORT, mHasPowerStatsSupport);
139         bundle.putInt(KEY_SUPPORTED_ANTENNA_MODES, FlagEnum.toInt(mAntennaModeCapabilities));
140         bundle.putInt(KEY_MAX_SUPPORTED_SESSION_COUNT, mMaxSupportedSessionCount);
141         return bundle;
142     }
143 
fromBundle(PersistableBundle bundle)144     public static GenericSpecificationParams fromBundle(PersistableBundle bundle) {
145         switch (getBundleVersion(bundle)) {
146             case BUNDLE_VERSION_1:
147                 return parseVersion1(bundle);
148 
149             default:
150                 throw new IllegalArgumentException("Invalid bundle version");
151         }
152     }
153 
parseVersion1(PersistableBundle bundle)154     private static GenericSpecificationParams parseVersion1(PersistableBundle bundle) {
155         GenericSpecificationParams.Builder builder = new GenericSpecificationParams.Builder()
156                 .setAntennaModeCapabilities(FlagEnum.toEnumSet(
157                         bundle.getInt(KEY_SUPPORTED_ANTENNA_MODES, 0),
158                         AntennaModeCapabilityFlag.values()))
159                 .setMaxSupportedSessionCount(bundle.getInt(KEY_MAX_SUPPORTED_SESSION_COUNT))
160                 .hasPowerStatsSupport(bundle.getBoolean(KEY_POWER_STATS_QUERY_SUPPORT));
161 
162         builder = builder.setFiraSpecificationParams(
163                 FiraSpecificationParams.fromBundle(
164                         bundle.getPersistableBundle(KEY_FIRA_SPECIFICATION_PARAMS)));
165 
166         PersistableBundle cccBundle = bundle.getPersistableBundle(KEY_CCC_SPECIFICATION_PARAMS);
167         if (cccBundle != null) {
168             builder = builder.setCccSpecificationParams(
169                     CccSpecificationParams.fromBundle(cccBundle));
170         }
171 
172         PersistableBundle aliroBundle = bundle.getPersistableBundle(KEY_ALIRO_SPECIFICATION_PARAMS);
173         if (aliroBundle != null) {
174             builder = builder.setAliroSpecificationParams(
175                     AliroSpecificationParams.fromBundle(aliroBundle));
176         }
177 
178         PersistableBundle radarBundle = bundle.getPersistableBundle(
179                 KEY_RADAR_SPECIFICATION_PARAMS);
180         if (radarBundle != null) {
181             builder = builder.setRadarSpecificationParams(
182                     RadarSpecificationParams.fromBundle(radarBundle));
183         }
184         return builder.build();
185     }
186 
187     /** Builder */
188     public static class Builder {
189         private FiraSpecificationParams mFiraSpecificationParams = null;
190         private CccSpecificationParams mCccSpecificationParams = null;
191         private AliroSpecificationParams mAliroSpecificationParams = null;
192         private RadarSpecificationParams mRadarSpecificationParams = null;
193 
194         private boolean mHasPowerStatsSupport = false;
195         private EnumSet<AntennaModeCapabilityFlag> mAntennaModeCapabilities =
196                 EnumSet.noneOf(AntennaModeCapabilityFlag.class);
197         private int mMaxSupportedSessionCount = DEFAULT_MAX_SUPPORTED_SESSIONS_COUNT;
198 
199         /**
200          * Set FIRA specification params
201          */
setFiraSpecificationParams( @onNull FiraSpecificationParams firaSpecificationParams)202         public Builder setFiraSpecificationParams(
203                 @NonNull FiraSpecificationParams firaSpecificationParams) {
204             mFiraSpecificationParams = Objects.requireNonNull(firaSpecificationParams);
205             return this;
206         }
207 
208         /**
209          * Set CCC specification params
210          */
setCccSpecificationParams( @onNull CccSpecificationParams cccSpecificationParams)211         public Builder setCccSpecificationParams(
212                 @NonNull CccSpecificationParams cccSpecificationParams) {
213             mCccSpecificationParams = Objects.requireNonNull(cccSpecificationParams);
214             return this;
215         }
216 
217         /**
218          * Set ALIRO specification params.
219          */
setAliroSpecificationParams( @onNull AliroSpecificationParams aliroSpecificationParams)220         public Builder setAliroSpecificationParams(
221                 @NonNull AliroSpecificationParams aliroSpecificationParams) {
222             mAliroSpecificationParams = Objects.requireNonNull(aliroSpecificationParams);
223             return this;
224         }
225 
226         /**
227          * Set RADAR specification params
228          */
setRadarSpecificationParams( @onNull RadarSpecificationParams radarSpecificationParams)229         public Builder setRadarSpecificationParams(
230                 @NonNull RadarSpecificationParams radarSpecificationParams) {
231             mRadarSpecificationParams = Objects.requireNonNull(radarSpecificationParams);
232             return this;
233         }
234 
235         /**
236          * Sets if the power stats is supported
237          */
hasPowerStatsSupport(boolean value)238         public Builder hasPowerStatsSupport(boolean value) {
239             mHasPowerStatsSupport = value;
240             return this;
241         }
242 
243         /**
244          * Set antenna mode capabilities.
245          */
setAntennaModeCapabilities( Collection<AntennaModeCapabilityFlag> antennaModeCapabilities)246         public Builder setAntennaModeCapabilities(
247                 Collection<AntennaModeCapabilityFlag> antennaModeCapabilities) {
248             mAntennaModeCapabilities.addAll(antennaModeCapabilities);
249             return this;
250         }
251 
252         /**
253          * Sets the maximum supported session count
254          */
setMaxSupportedSessionCount(int value)255         public Builder setMaxSupportedSessionCount(int value) {
256             mMaxSupportedSessionCount = value;
257             return this;
258         }
259 
260         /**
261          * Build {@link GenericSpecificationParams}
262          */
build()263         public GenericSpecificationParams build() {
264             return new GenericSpecificationParams(this);
265         }
266     }
267 }
268