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.android.server.uwb.params;
18 
19 import static com.android.server.uwb.config.CapabilityParam.SUPPORTED_POWER_STATS_QUERY;
20 
21 import android.util.Log;
22 
23 import com.android.server.uwb.UwbInjector;
24 
25 import com.google.uwb.support.aliro.AliroParams;
26 import com.google.uwb.support.aliro.AliroSpecificationParams;
27 import com.google.uwb.support.base.Params;
28 import com.google.uwb.support.base.ProtocolVersion;
29 import com.google.uwb.support.ccc.CccParams;
30 import com.google.uwb.support.ccc.CccSpecificationParams;
31 import com.google.uwb.support.fira.FiraParams;
32 import com.google.uwb.support.fira.FiraSpecificationParams;
33 import com.google.uwb.support.generic.GenericSpecificationParams;
34 import com.google.uwb.support.radar.RadarParams;
35 import com.google.uwb.support.radar.RadarSpecificationParams;
36 
37 public class GenericDecoder extends TlvDecoder {
38     private final UwbInjector mUwbInjector;
39 
GenericDecoder(UwbInjector uwbInjector)40     public GenericDecoder(UwbInjector uwbInjector) {
41         mUwbInjector = uwbInjector;
42     }
43     private static final String TAG = "GenericDecoder";
44 
45     @Override
getParams(TlvDecoderBuffer tlvs, Class<T> paramType, ProtocolVersion protocolVersion)46     public <T extends Params> T getParams(TlvDecoderBuffer tlvs, Class<T> paramType,
47                     ProtocolVersion protocolVersion) {
48         if (GenericSpecificationParams.class.equals(paramType)) {
49             return (T) getSpecificationParamsFromTlvBuffer(tlvs, protocolVersion);
50         }
51         return null;
52     }
53 
getSpecificationParamsFromTlvBuffer(TlvDecoderBuffer tlvs, ProtocolVersion protocolVersion)54     private GenericSpecificationParams getSpecificationParamsFromTlvBuffer(TlvDecoderBuffer tlvs,
55                     ProtocolVersion protocolVersion) {
56         GenericSpecificationParams.Builder builder = new GenericSpecificationParams.Builder();
57         try {
58             FiraSpecificationParams firaSpecificationParams =
59                     TlvDecoder.getDecoder(FiraParams.PROTOCOL_NAME, mUwbInjector).getParams(
60                             tlvs, FiraSpecificationParams.class, protocolVersion);
61             builder.setFiraSpecificationParams(firaSpecificationParams);
62         } catch (IllegalArgumentException e) {
63             Log.e(TAG, "Failed to decode FIRA capabilities", e);
64         }
65         try {
66             CccSpecificationParams cccSpecificationParams =
67                     TlvDecoder.getDecoder(CccParams.PROTOCOL_NAME, mUwbInjector).getParams(
68                             tlvs, CccSpecificationParams.class, protocolVersion);
69             builder.setCccSpecificationParams(cccSpecificationParams);
70         } catch (IllegalArgumentException e) {
71             Log.e(TAG, "Failed to decode CCC capabilities", e);
72         }
73         try {
74             AliroSpecificationParams aliroSpecificationParams =
75                     TlvDecoder.getDecoder(AliroParams.PROTOCOL_NAME, mUwbInjector).getParams(
76                             tlvs, AliroSpecificationParams.class, protocolVersion);
77             builder.setAliroSpecificationParams(aliroSpecificationParams);
78         } catch (IllegalArgumentException e) {
79             Log.e(TAG, "Failed to decode ALIRO capabilities", e);
80         }
81         try {
82             RadarSpecificationParams radarSpecificationParams =
83                     TlvDecoder.getDecoder(RadarParams.PROTOCOL_NAME, mUwbInjector)
84                             .getParams(tlvs, RadarSpecificationParams.class, protocolVersion);
85             builder.setRadarSpecificationParams(radarSpecificationParams);
86         } catch (IllegalArgumentException e) {
87             Log.v(TAG, "Failed to decode Radar capabilities", e);
88         }
89         try {
90             byte supported_power_stats_query = tlvs.getByte(SUPPORTED_POWER_STATS_QUERY);
91             if (supported_power_stats_query != 0) {
92                 builder.hasPowerStatsSupport(true);
93             }
94         } catch (IllegalArgumentException e) {
95             // Do nothing. By default, hasPowerStatsSupport() returns false.
96         }
97         return builder.build();
98     }
99 }
100