• 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.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