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