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.ccc.CccParams; 26 import com.google.uwb.support.ccc.CccSpecificationParams; 27 import com.google.uwb.support.fira.FiraParams; 28 import com.google.uwb.support.fira.FiraSpecificationParams; 29 30 import java.util.Objects; 31 32 /** 33 * Defines parameters for generic capability. 34 * 35 * <p>This is returned as a bundle from the service API {@link UwbManager#getSpecificationInfo}. 36 */ 37 public class GenericSpecificationParams extends GenericParams { 38 private static final int BUNDLE_VERSION_1 = 1; 39 private static final int BUNDLE_VERSION_CURRENT = BUNDLE_VERSION_1; 40 41 private final FiraSpecificationParams mFiraSpecificationParams; 42 private final CccSpecificationParams mCccSpecificationParams; 43 private final boolean mHasPowerStatsSupport; 44 45 private static final String KEY_FIRA_SPECIFICATION_PARAMS = FiraParams.PROTOCOL_NAME; 46 private static final String KEY_CCC_SPECIFICATION_PARAMS = CccParams.PROTOCOL_NAME; 47 private static final String KEY_POWER_STATS_QUERY_SUPPORT = "power_stats_query"; 48 GenericSpecificationParams( FiraSpecificationParams firaSpecificationParams, CccSpecificationParams cccSpecificationParams, boolean hasPowerStatsSupport)49 private GenericSpecificationParams( 50 FiraSpecificationParams firaSpecificationParams, 51 CccSpecificationParams cccSpecificationParams, 52 boolean hasPowerStatsSupport) { 53 mFiraSpecificationParams = firaSpecificationParams; 54 mCccSpecificationParams = cccSpecificationParams; 55 mHasPowerStatsSupport = hasPowerStatsSupport; 56 } 57 58 @Override getBundleVersion()59 protected int getBundleVersion() { 60 return BUNDLE_VERSION_CURRENT; 61 } 62 63 @Nullable getFiraSpecificationParams()64 public FiraSpecificationParams getFiraSpecificationParams() { 65 return mFiraSpecificationParams; 66 } 67 68 @Nullable getCccSpecificationParams()69 public CccSpecificationParams getCccSpecificationParams() { 70 return mCccSpecificationParams; 71 } 72 73 /** 74 * @return if the power stats is supported 75 */ hasPowerStatsSupport()76 public boolean hasPowerStatsSupport() { 77 return mHasPowerStatsSupport; 78 } 79 80 @Override toBundle()81 public PersistableBundle toBundle() { 82 PersistableBundle bundle = super.toBundle(); 83 bundle.putPersistableBundle(KEY_FIRA_SPECIFICATION_PARAMS, 84 mFiraSpecificationParams.toBundle()); 85 if (mCccSpecificationParams != null) { 86 bundle.putPersistableBundle(KEY_CCC_SPECIFICATION_PARAMS, 87 mCccSpecificationParams.toBundle()); 88 } 89 bundle.putBoolean(KEY_POWER_STATS_QUERY_SUPPORT, mHasPowerStatsSupport); 90 return bundle; 91 } 92 fromBundle(PersistableBundle bundle)93 public static GenericSpecificationParams fromBundle(PersistableBundle bundle) { 94 switch (getBundleVersion(bundle)) { 95 case BUNDLE_VERSION_1: 96 return parseVersion1(bundle); 97 98 default: 99 throw new IllegalArgumentException("Invalid bundle version"); 100 } 101 } 102 parseVersion1(PersistableBundle bundle)103 private static GenericSpecificationParams parseVersion1(PersistableBundle bundle) { 104 GenericSpecificationParams.Builder builder = new GenericSpecificationParams.Builder(); 105 builder = builder.setFiraSpecificationParams( 106 FiraSpecificationParams.fromBundle( 107 bundle.getPersistableBundle(KEY_FIRA_SPECIFICATION_PARAMS))) 108 .hasPowerStatsSupport(bundle.getBoolean(KEY_POWER_STATS_QUERY_SUPPORT)); 109 PersistableBundle cccBundle = bundle.getPersistableBundle(KEY_CCC_SPECIFICATION_PARAMS); 110 if (cccBundle != null) { 111 builder = builder.setCccSpecificationParams( 112 CccSpecificationParams.fromBundle( 113 cccBundle)); 114 } 115 return builder.build(); 116 } 117 118 /** Builder */ 119 public static class Builder { 120 private FiraSpecificationParams mFiraSpecificationParams = null; 121 private CccSpecificationParams mCccSpecificationParams = null; 122 private boolean mHasPowerStatsSupport = false; 123 124 /** 125 * Set FIRA specification params 126 */ setFiraSpecificationParams( @onNull FiraSpecificationParams firaSpecificationParams)127 public Builder setFiraSpecificationParams( 128 @NonNull FiraSpecificationParams firaSpecificationParams) { 129 mFiraSpecificationParams = Objects.requireNonNull(firaSpecificationParams); 130 return this; 131 } 132 133 /** 134 * Set CCC specification params 135 */ setCccSpecificationParams( @onNull CccSpecificationParams cccSpecificationParams)136 public Builder setCccSpecificationParams( 137 @NonNull CccSpecificationParams cccSpecificationParams) { 138 mCccSpecificationParams = Objects.requireNonNull(cccSpecificationParams); 139 return this; 140 } 141 142 /** 143 * Sets if the power stats is supported 144 */ hasPowerStatsSupport(boolean value)145 public Builder hasPowerStatsSupport(boolean value) { 146 mHasPowerStatsSupport = value; 147 return this; 148 } 149 150 /** 151 * Build {@link GenericSpecificationParams} 152 */ build()153 public GenericSpecificationParams build() { 154 return new GenericSpecificationParams( 155 mFiraSpecificationParams, 156 mCccSpecificationParams, 157 mHasPowerStatsSupport); 158 } 159 } 160 } 161