• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.car.hal;
18 
19 import static java.lang.Integer.toHexString;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.car.Car;
24 import android.car.VehicleHvacFanDirection;
25 import android.car.hardware.property.VehicleVendorPermission;
26 import android.hardware.automotive.vehicle.V2_0.EvConnectorType;
27 import android.hardware.automotive.vehicle.V2_0.FuelType;
28 import android.hardware.automotive.vehicle.V2_0.PortLocationType;
29 import android.hardware.automotive.vehicle.V2_0.VehicleAreaSeat;
30 import android.hardware.automotive.vehicle.V2_0.VehicleGear;
31 import android.hardware.automotive.vehicle.V2_0.VehicleIgnitionState;
32 import android.hardware.automotive.vehicle.V2_0.VehicleLightState;
33 import android.hardware.automotive.vehicle.V2_0.VehicleLightSwitch;
34 import android.hardware.automotive.vehicle.V2_0.VehicleOilLevel;
35 import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
36 import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
37 import android.hardware.automotive.vehicle.V2_0.VehiclePropertyGroup;
38 import android.hardware.automotive.vehicle.V2_0.VehiclePropertyType;
39 import android.hardware.automotive.vehicle.V2_0.VehicleSeatOccupancyState;
40 import android.hardware.automotive.vehicle.V2_0.VehicleTurnSignal;
41 import android.hardware.automotive.vehicle.V2_0.VehicleUnit;
42 import android.util.Log;
43 import android.util.Pair;
44 import android.util.SparseArray;
45 
46 import java.lang.reflect.Field;
47 import java.util.ArrayList;
48 import java.util.HashMap;
49 import java.util.HashSet;
50 import java.util.List;
51 import java.util.Set;
52 
53 /**
54  * Helper class to define which property IDs are used by PropertyHalService.  This class binds the
55  * read and write permissions to the property ID.
56  */
57 public class PropertyHalServiceIds {
58 
59     /**
60      * Index key is propertyId, and the value is readPermission, writePermission.
61      * If the property can not be written (or read), set value as NULL.
62      * Throw an IllegalArgumentException when try to write READ_ONLY properties or read WRITE_ONLY
63      * properties.
64      */
65     private final SparseArray<Pair<String, String>> mProps;
66     private final HashSet<Integer> mPropForUnits;
67     // Key: propId, Value: possible value for the property
68     private final HashMap<Integer, Set<Integer>> mPropToValidValue;
69     private final HashMap<Integer, Integer> mPropToValidBitFlag;
70     private static final String TAG = "PropertyHalServiceIds";
71     // Enums are used as return value in Vehicle HAL.
72     private static final Set<Integer> FUEL_TYPE =
73             new HashSet<>(getIntegersFromDataEnums(FuelType.class));
74     private static final Set<Integer> EV_CONNECTOR_TYPE =
75             new HashSet<>(getIntegersFromDataEnums(EvConnectorType.class));
76     private static final Set<Integer> PORT_LOCATION =
77             new HashSet<>(getIntegersFromDataEnums(PortLocationType.class));
78     private static final Set<Integer> VEHICLE_SEAT =
79             new HashSet<>(getIntegersFromDataEnums(VehicleAreaSeat.class));
80     private static final Set<Integer> OIL_LEVEL =
81             new HashSet<>(getIntegersFromDataEnums(VehicleOilLevel.class));
82     private static final Set<Integer> VEHICLE_GEAR =
83             new HashSet<>(getIntegersFromDataEnums(VehicleGear.class));
84     private static final Set<Integer> TURN_SIGNAL =
85             new HashSet<>(getIntegersFromDataEnums(VehicleTurnSignal.class));
86     private static final Set<Integer> IGNITION_STATE =
87             new HashSet<>(getIntegersFromDataEnums(VehicleIgnitionState.class));
88     private static final Set<Integer> VEHICLE_UNITS =
89             new HashSet<>(getIntegersFromDataEnums(VehicleUnit.class));
90     private static final Set<Integer> SEAT_OCCUPANCY_STATE =
91             new HashSet<>(getIntegersFromDataEnums(VehicleSeatOccupancyState.class));
92     private static final Set<Integer> VEHICLE_LIGHT_STATE =
93             new HashSet<>(getIntegersFromDataEnums(VehicleLightState.class));
94     private static final Set<Integer> VEHICLE_LIGHT_SWITCH =
95             new HashSet<>(getIntegersFromDataEnums(VehicleLightSwitch.class));
96     private static final int HVAC_FAN_DIRECTION_COMBINATIONS =
97             generateAllCombination(VehicleHvacFanDirection.class);
98 
99     // default vendor permission
100     private static final int PERMISSION_CAR_VENDOR_DEFAULT = 0x00000000;
101 
102     // permissions for the property related with window
103     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW = 0X00000001;
104     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW = 0x00000002;
105     // permissions for the property related with door
106     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR = 0x00000003;
107     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR = 0x00000004;
108     // permissions for the property related with seat
109     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT = 0x00000005;
110     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT = 0x00000006;
111     // permissions for the property related with mirror
112     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000007;
113     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000008;
114 
115     // permissions for the property related with car's information
116     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO = 0x00000009;
117     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO = 0x0000000A;
118     // permissions for the property related with car's engine
119     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000B;
120     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000C;
121     // permissions for the property related with car's HVAC
122     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000D;
123     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000E;
124     // permissions for the property related with car's light
125     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT = 0x0000000F;
126     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT = 0x00000010;
127 
128     // permissions reserved for other vendor permission
129     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_1 = 0x00010000;
130     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_1 = 0x00011000;
131     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_2 = 0x00020000;
132     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_2 = 0x00021000;
133     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_3 = 0x00030000;
134     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_3 = 0x00031000;
135     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_4 = 0x00040000;
136     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_4 = 0x00041000;
137     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_5 = 0x00050000;
138     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_5 = 0x00051000;
139     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_6 = 0x00060000;
140     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_6 = 0x00061000;
141     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_7 = 0x00070000;
142     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_7 = 0x00071000;
143     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_8 = 0x00080000;
144     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_8 = 0x00081000;
145     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_9 = 0x00090000;
146     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_9 = 0x00091000;
147     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_10 = 0x000A0000;
148     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_10 = 0x000A1000;
149     // Not available for android
150     private static final int PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE = 0xF0000000;
151 
PropertyHalServiceIds()152     public PropertyHalServiceIds() {
153         mProps = new SparseArray<>();
154         mPropForUnits = new HashSet<>();
155         mPropToValidValue = new HashMap<>();
156         mPropToValidBitFlag = new HashMap<>();
157         // Add propertyId and read/write permissions
158         // Cabin Properties
159         mProps.put(VehicleProperty.DOOR_POS, new Pair<>(
160                 Car.PERMISSION_CONTROL_CAR_DOORS,
161                 Car.PERMISSION_CONTROL_CAR_DOORS));
162         mProps.put(VehicleProperty.DOOR_MOVE, new Pair<>(
163                 Car.PERMISSION_CONTROL_CAR_DOORS,
164                 Car.PERMISSION_CONTROL_CAR_DOORS));
165         mProps.put(VehicleProperty.DOOR_LOCK, new Pair<>(
166                 Car.PERMISSION_CONTROL_CAR_DOORS,
167                 Car.PERMISSION_CONTROL_CAR_DOORS));
168         mProps.put(VehicleProperty.MIRROR_Z_POS, new Pair<>(
169                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
170                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
171         mProps.put(VehicleProperty.MIRROR_Z_MOVE, new Pair<>(
172                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
173                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
174         mProps.put(VehicleProperty.MIRROR_Y_POS, new Pair<>(
175                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
176                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
177         mProps.put(VehicleProperty.MIRROR_Y_MOVE, new Pair<>(
178                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
179                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
180         mProps.put(VehicleProperty.MIRROR_LOCK, new Pair<>(
181                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
182                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
183         mProps.put(VehicleProperty.MIRROR_FOLD, new Pair<>(
184                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
185                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
186         mProps.put(VehicleProperty.SEAT_MEMORY_SELECT, new Pair<>(
187                 Car.PERMISSION_CONTROL_CAR_SEATS,
188                 Car.PERMISSION_CONTROL_CAR_SEATS));
189         mProps.put(VehicleProperty.SEAT_MEMORY_SET, new Pair<>(
190                 Car.PERMISSION_CONTROL_CAR_SEATS,
191                 Car.PERMISSION_CONTROL_CAR_SEATS));
192         mProps.put(VehicleProperty.SEAT_BELT_BUCKLED, new Pair<>(
193                 Car.PERMISSION_CONTROL_CAR_SEATS,
194                 Car.PERMISSION_CONTROL_CAR_SEATS));
195         mProps.put(VehicleProperty.SEAT_BELT_HEIGHT_POS, new Pair<>(
196                 Car.PERMISSION_CONTROL_CAR_SEATS,
197                 Car.PERMISSION_CONTROL_CAR_SEATS));
198         mProps.put(VehicleProperty.SEAT_BELT_HEIGHT_MOVE, new Pair<>(
199                 Car.PERMISSION_CONTROL_CAR_SEATS,
200                 Car.PERMISSION_CONTROL_CAR_SEATS));
201         mProps.put(VehicleProperty.SEAT_FORE_AFT_POS, new Pair<>(
202                 Car.PERMISSION_CONTROL_CAR_SEATS,
203                 Car.PERMISSION_CONTROL_CAR_SEATS));
204         mProps.put(VehicleProperty.SEAT_FORE_AFT_MOVE, new Pair<>(
205                 Car.PERMISSION_CONTROL_CAR_SEATS,
206                 Car.PERMISSION_CONTROL_CAR_SEATS));
207         mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_POS, new Pair<>(
208                 Car.PERMISSION_CONTROL_CAR_SEATS,
209                 Car.PERMISSION_CONTROL_CAR_SEATS));
210         mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE, new Pair<>(
211                 Car.PERMISSION_CONTROL_CAR_SEATS,
212                 Car.PERMISSION_CONTROL_CAR_SEATS));
213         mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_POS, new Pair<>(
214                 Car.PERMISSION_CONTROL_CAR_SEATS,
215                 Car.PERMISSION_CONTROL_CAR_SEATS));
216         mProps.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE, new Pair<>(
217                 Car.PERMISSION_CONTROL_CAR_SEATS,
218                 Car.PERMISSION_CONTROL_CAR_SEATS));
219         mProps.put(VehicleProperty.SEAT_HEIGHT_POS, new Pair<>(
220                 Car.PERMISSION_CONTROL_CAR_SEATS,
221                 Car.PERMISSION_CONTROL_CAR_SEATS));
222         mProps.put(VehicleProperty.SEAT_HEIGHT_MOVE, new Pair<>(
223                 Car.PERMISSION_CONTROL_CAR_SEATS,
224                 Car.PERMISSION_CONTROL_CAR_SEATS));
225         mProps.put(VehicleProperty.SEAT_DEPTH_POS, new Pair<>(
226                 Car.PERMISSION_CONTROL_CAR_SEATS,
227                 Car.PERMISSION_CONTROL_CAR_SEATS));
228         mProps.put(VehicleProperty.SEAT_DEPTH_MOVE, new Pair<>(
229                 Car.PERMISSION_CONTROL_CAR_SEATS,
230                 Car.PERMISSION_CONTROL_CAR_SEATS));
231         mProps.put(VehicleProperty.SEAT_TILT_POS, new Pair<>(
232                 Car.PERMISSION_CONTROL_CAR_SEATS,
233                 Car.PERMISSION_CONTROL_CAR_SEATS));
234         mProps.put(VehicleProperty.SEAT_TILT_MOVE, new Pair<>(
235                 Car.PERMISSION_CONTROL_CAR_SEATS,
236                 Car.PERMISSION_CONTROL_CAR_SEATS));
237         mProps.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS, new Pair<>(
238                 Car.PERMISSION_CONTROL_CAR_SEATS,
239                 Car.PERMISSION_CONTROL_CAR_SEATS));
240         mProps.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE, new Pair<>(
241                 Car.PERMISSION_CONTROL_CAR_SEATS,
242                 Car.PERMISSION_CONTROL_CAR_SEATS));
243         mProps.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS, new Pair<>(
244                 Car.PERMISSION_CONTROL_CAR_SEATS,
245                 Car.PERMISSION_CONTROL_CAR_SEATS));
246         mProps.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE, new Pair<>(
247                 Car.PERMISSION_CONTROL_CAR_SEATS,
248                 Car.PERMISSION_CONTROL_CAR_SEATS));
249         mProps.put(VehicleProperty.SEAT_HEADREST_HEIGHT_POS, new Pair<>(
250                 Car.PERMISSION_CONTROL_CAR_SEATS,
251                 Car.PERMISSION_CONTROL_CAR_SEATS));
252         mProps.put(VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE, new Pair<>(
253                 Car.PERMISSION_CONTROL_CAR_SEATS,
254                 Car.PERMISSION_CONTROL_CAR_SEATS));
255         mProps.put(VehicleProperty.SEAT_HEADREST_ANGLE_POS, new Pair<>(
256                 Car.PERMISSION_CONTROL_CAR_SEATS,
257                 Car.PERMISSION_CONTROL_CAR_SEATS));
258         mProps.put(VehicleProperty.SEAT_HEADREST_ANGLE_MOVE, new Pair<>(
259                 Car.PERMISSION_CONTROL_CAR_SEATS,
260                 Car.PERMISSION_CONTROL_CAR_SEATS));
261         mProps.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_POS, new Pair<>(
262                 Car.PERMISSION_CONTROL_CAR_SEATS,
263                 Car.PERMISSION_CONTROL_CAR_SEATS));
264         mProps.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE, new Pair<>(
265                 Car.PERMISSION_CONTROL_CAR_SEATS,
266                 Car.PERMISSION_CONTROL_CAR_SEATS));
267         mProps.put(VehicleProperty.SEAT_OCCUPANCY, new Pair<>(
268                 Car.PERMISSION_CONTROL_CAR_SEATS,
269                 null));
270         mProps.put(VehicleProperty.WINDOW_POS, new Pair<>(
271                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
272                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
273         mProps.put(VehicleProperty.WINDOW_MOVE, new Pair<>(
274                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
275                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
276         mProps.put(VehicleProperty.WINDOW_LOCK, new Pair<>(
277                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
278                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
279 
280         // HVAC properties
281         mProps.put(VehicleProperty.HVAC_FAN_SPEED, new Pair<>(
282                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
283                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
284         mProps.put(VehicleProperty.HVAC_FAN_DIRECTION, new Pair<>(
285                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
286                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
287         mProps.put(VehicleProperty.HVAC_TEMPERATURE_CURRENT, new Pair<>(
288                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
289                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
290         mProps.put(VehicleProperty.HVAC_TEMPERATURE_SET, new Pair<>(
291                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
292                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
293         mProps.put(VehicleProperty.HVAC_DEFROSTER, new Pair<>(
294                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
295                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
296         mProps.put(VehicleProperty.HVAC_ELECTRIC_DEFROSTER_ON, new Pair<>(
297                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
298                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
299         mProps.put(VehicleProperty.HVAC_AC_ON, new Pair<>(
300                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
301                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
302         mProps.put(VehicleProperty.HVAC_MAX_AC_ON, new Pair<>(
303                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
304                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
305         mProps.put(VehicleProperty.HVAC_MAX_DEFROST_ON, new Pair<>(
306                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
307                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
308         mProps.put(VehicleProperty.HVAC_RECIRC_ON, new Pair<>(
309                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
310                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
311         mProps.put(VehicleProperty.HVAC_DUAL_ON, new Pair<>(
312                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
313                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
314         mProps.put(VehicleProperty.HVAC_AUTO_ON, new Pair<>(
315                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
316                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
317         mProps.put(VehicleProperty.HVAC_SEAT_TEMPERATURE, new Pair<>(
318                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
319                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
320         mProps.put(VehicleProperty.HVAC_SIDE_MIRROR_HEAT, new Pair<>(
321                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
322                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
323         mProps.put(VehicleProperty.HVAC_STEERING_WHEEL_HEAT, new Pair<>(
324                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
325                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
326         mProps.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, new Pair<>(
327                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
328                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
329         mProps.put(VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM, new Pair<>(
330                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
331                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
332         mProps.put(VehicleProperty.HVAC_POWER_ON, new Pair<>(
333                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
334                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
335         mProps.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE, new Pair<>(
336                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
337                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
338         mProps.put(VehicleProperty.HVAC_AUTO_RECIRC_ON, new Pair<>(
339                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
340                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
341         mProps.put(VehicleProperty.HVAC_SEAT_VENTILATION, new Pair<>(
342                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
343                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
344 
345         // Info properties
346         mProps.put(VehicleProperty.INFO_VIN, new Pair<>(
347                     Car.PERMISSION_IDENTIFICATION,
348                     null));
349         mProps.put(VehicleProperty.INFO_MAKE, new Pair<>(
350                     Car.PERMISSION_CAR_INFO,
351                     null));
352         mProps.put(VehicleProperty.INFO_MODEL, new Pair<>(
353                     Car.PERMISSION_CAR_INFO,
354                     null));
355         mProps.put(VehicleProperty.INFO_MODEL_YEAR, new Pair<>(
356                     Car.PERMISSION_CAR_INFO,
357                     null));
358         mProps.put(VehicleProperty.INFO_FUEL_CAPACITY, new Pair<>(
359                     Car.PERMISSION_CAR_INFO,
360                     null));
361         mProps.put(VehicleProperty.INFO_FUEL_TYPE, new Pair<>(
362                     Car.PERMISSION_CAR_INFO,
363                     null));
364         mProps.put(VehicleProperty.INFO_EV_BATTERY_CAPACITY, new Pair<>(
365                     Car.PERMISSION_CAR_INFO,
366                     null));
367         mProps.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, new Pair<>(
368                     Car.PERMISSION_CAR_INFO,
369                     null));
370         mProps.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, new Pair<>(
371                     Car.PERMISSION_CAR_INFO,
372                     null));
373         mProps.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, new Pair<>(
374                     Car.PERMISSION_CAR_INFO,
375                     null));
376         mProps.put(VehicleProperty.INFO_EV_PORT_LOCATION, new Pair<>(
377                     Car.PERMISSION_CAR_INFO,
378                     null));
379         mProps.put(VehicleProperty.INFO_DRIVER_SEAT, new Pair<>(
380                     Car.PERMISSION_CAR_INFO,
381                     null));
382         mProps.put(VehicleProperty.INFO_EXTERIOR_DIMENSIONS, new Pair<>(
383                     Car.PERMISSION_CAR_INFO,
384                     null));
385 
386         // Sensor properties
387         mProps.put(VehicleProperty.PERF_ODOMETER, new Pair<>(
388                 Car.PERMISSION_MILEAGE,
389                 null));
390         mProps.put(VehicleProperty.PERF_VEHICLE_SPEED, new Pair<>(
391                 Car.PERMISSION_SPEED,
392                 null));
393         mProps.put(VehicleProperty.PERF_VEHICLE_SPEED_DISPLAY, new Pair<>(
394                 Car.PERMISSION_SPEED,
395                 null));
396         mProps.put(VehicleProperty.ENGINE_COOLANT_TEMP, new Pair<>(
397                 Car.PERMISSION_CAR_ENGINE_DETAILED,
398                 null));
399         mProps.put(VehicleProperty.ENGINE_OIL_LEVEL, new Pair<>(
400                 Car.PERMISSION_CAR_ENGINE_DETAILED,
401                 null));
402         mProps.put(VehicleProperty.ENGINE_OIL_TEMP, new Pair<>(
403                 Car.PERMISSION_CAR_ENGINE_DETAILED,
404                 null));
405         mProps.put(VehicleProperty.ENGINE_RPM, new Pair<>(
406                 Car.PERMISSION_CAR_ENGINE_DETAILED,
407                 null));
408         mProps.put(VehicleProperty.WHEEL_TICK, new Pair<>(
409                 Car.PERMISSION_SPEED,
410                 null));
411         mProps.put(VehicleProperty.FUEL_LEVEL, new Pair<>(
412                 Car.PERMISSION_ENERGY,
413                 null));
414         mProps.put(VehicleProperty.FUEL_DOOR_OPEN, new Pair<>(
415                 Car.PERMISSION_ENERGY_PORTS,
416                 Car.PERMISSION_CONTROL_ENERGY_PORTS));
417         mProps.put(VehicleProperty.EV_BATTERY_LEVEL, new Pair<>(
418                 Car.PERMISSION_ENERGY,
419                 null));
420         mProps.put(VehicleProperty.EV_CHARGE_PORT_OPEN, new Pair<>(
421                 Car.PERMISSION_ENERGY_PORTS,
422                 Car.PERMISSION_CONTROL_ENERGY_PORTS));
423         mProps.put(VehicleProperty.EV_CHARGE_PORT_CONNECTED, new Pair<>(
424                 Car.PERMISSION_ENERGY_PORTS,
425                 null));
426         mProps.put(VehicleProperty.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE, new Pair<>(
427                 Car.PERMISSION_ENERGY,
428                 null));
429         mProps.put(VehicleProperty.RANGE_REMAINING, new Pair<>(
430                 Car.PERMISSION_ENERGY,
431                 Car.PERMISSION_ADJUST_RANGE_REMAINING));
432         mProps.put(VehicleProperty.TIRE_PRESSURE, new Pair<>(
433                 Car.PERMISSION_TIRES,
434                 null));
435         mProps.put(VehicleProperty.PERF_STEERING_ANGLE, new Pair<>(
436                 Car.PERMISSION_READ_STEERING_STATE,
437                 null));
438         mProps.put(VehicleProperty.PERF_REAR_STEERING_ANGLE, new Pair<>(
439                 Car.PERMISSION_READ_STEERING_STATE,
440                 null));
441         mProps.put(VehicleProperty.GEAR_SELECTION, new Pair<>(
442                 Car.PERMISSION_POWERTRAIN,
443                 null));
444         mProps.put(VehicleProperty.CURRENT_GEAR, new Pair<>(
445                 Car.PERMISSION_POWERTRAIN,
446                 null));
447         mProps.put(VehicleProperty.PARKING_BRAKE_ON, new Pair<>(
448                 Car.PERMISSION_POWERTRAIN,
449                 null));
450         mProps.put(VehicleProperty.PARKING_BRAKE_AUTO_APPLY, new Pair<>(
451                 Car.PERMISSION_POWERTRAIN,
452                 null));
453         mProps.put(VehicleProperty.FUEL_LEVEL_LOW, new Pair<>(
454                 Car.PERMISSION_ENERGY,
455                 null));
456         mProps.put(VehicleProperty.NIGHT_MODE, new Pair<>(
457                 Car.PERMISSION_EXTERIOR_ENVIRONMENT,
458                 null));
459         mProps.put(VehicleProperty.TURN_SIGNAL_STATE, new Pair<>(
460                 Car.PERMISSION_EXTERIOR_LIGHTS,
461                 null));
462         mProps.put(VehicleProperty.IGNITION_STATE, new Pair<>(
463                 Car.PERMISSION_POWERTRAIN,
464                 null));
465         mProps.put(VehicleProperty.ABS_ACTIVE, new Pair<>(
466                 Car.PERMISSION_CAR_DYNAMICS_STATE,
467                 null));
468         mProps.put(VehicleProperty.TRACTION_CONTROL_ACTIVE, new Pair<>(
469                 Car.PERMISSION_CAR_DYNAMICS_STATE,
470                 null));
471         mProps.put(VehicleProperty.ENV_OUTSIDE_TEMPERATURE, new Pair<>(
472                 Car.PERMISSION_EXTERIOR_ENVIRONMENT,
473                 null));
474         mProps.put(VehicleProperty.HEADLIGHTS_STATE, new Pair<>(
475                 Car.PERMISSION_EXTERIOR_LIGHTS,
476                 null));
477         mProps.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, new Pair<>(
478                 Car.PERMISSION_EXTERIOR_LIGHTS,
479                 null));
480         mProps.put(VehicleProperty.FOG_LIGHTS_STATE, new Pair<>(
481                 Car.PERMISSION_EXTERIOR_LIGHTS,
482                 null));
483         mProps.put(VehicleProperty.HAZARD_LIGHTS_STATE, new Pair<>(
484                 Car.PERMISSION_EXTERIOR_LIGHTS,
485                 null));
486         mProps.put(VehicleProperty.HEADLIGHTS_SWITCH, new Pair<>(
487                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
488                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
489         mProps.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, new Pair<>(
490                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
491                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
492         mProps.put(VehicleProperty.FOG_LIGHTS_SWITCH, new Pair<>(
493                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
494                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
495         mProps.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, new Pair<>(
496                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
497                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
498         mProps.put(VehicleProperty.READING_LIGHTS_STATE, new Pair<>(
499                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
500                 null));
501         mProps.put(VehicleProperty.CABIN_LIGHTS_STATE, new Pair<>(
502                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
503                 null));
504         mProps.put(VehicleProperty.READING_LIGHTS_SWITCH, new Pair<>(
505                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
506                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
507         mProps.put(VehicleProperty.CABIN_LIGHTS_SWITCH, new Pair<>(
508                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
509                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
510         // Display_Units
511         mProps.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, new Pair<>(
512                 Car.PERMISSION_READ_DISPLAY_UNITS,
513                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
514         mPropForUnits.add(VehicleProperty.DISTANCE_DISPLAY_UNITS);
515         mProps.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, new Pair<>(
516                 Car.PERMISSION_READ_DISPLAY_UNITS,
517                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
518         mPropForUnits.add(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS);
519         mProps.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, new Pair<>(
520                 Car.PERMISSION_READ_DISPLAY_UNITS,
521                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
522         mPropForUnits.add(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS);
523         mProps.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, new Pair<>(
524                 Car.PERMISSION_READ_DISPLAY_UNITS,
525                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
526         mPropForUnits.add(VehicleProperty.EV_BATTERY_DISPLAY_UNITS);
527         mProps.put(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, new Pair<>(
528                 Car.PERMISSION_READ_DISPLAY_UNITS,
529                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
530         mPropForUnits.add(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME);
531         mProps.put(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, new Pair<>(
532                 Car.PERMISSION_READ_DISPLAY_UNITS,
533                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
534         mPropForUnits.add(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS);
535 
536         mProps.put(VehicleProperty.SUPPORT_CUSTOMIZE_VENDOR_PERMISSION, new Pair<>(
537                 Car.PERMISSION_READ_CAR_VENDOR_PERMISSION_INFO,
538                 null));
539 
540         // mPropToValidValue should contain all properties which has @data_enum in types.hal
541         mPropToValidValue.put(VehicleProperty.INFO_FUEL_TYPE, FUEL_TYPE);
542         mPropToValidValue.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, EV_CONNECTOR_TYPE);
543         mPropToValidValue.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, PORT_LOCATION);
544         mPropToValidValue.put(VehicleProperty.INFO_DRIVER_SEAT, VEHICLE_SEAT);
545         mPropToValidValue.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, PORT_LOCATION);
546         mPropToValidValue.put(VehicleProperty.ENGINE_OIL_LEVEL, OIL_LEVEL);
547         mPropToValidValue.put(VehicleProperty.GEAR_SELECTION, VEHICLE_GEAR);
548         mPropToValidValue.put(VehicleProperty.CURRENT_GEAR, VEHICLE_GEAR);
549         mPropToValidValue.put(VehicleProperty.TURN_SIGNAL_STATE, TURN_SIGNAL);
550         mPropToValidValue.put(VehicleProperty.IGNITION_STATE, IGNITION_STATE);
551         mPropToValidValue.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_UNITS);
552         mPropToValidValue.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, VEHICLE_UNITS);
553         mPropToValidValue.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, VEHICLE_UNITS);
554         mPropToValidValue.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, VEHICLE_UNITS);
555         mPropToValidValue.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, VEHICLE_UNITS);
556         mPropToValidValue.put(VehicleProperty.SEAT_OCCUPANCY, SEAT_OCCUPANCY_STATE);
557         mPropToValidValue.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
558         mPropToValidValue.put(VehicleProperty.HEADLIGHTS_STATE, VEHICLE_LIGHT_STATE);
559         mPropToValidValue.put(VehicleProperty.FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
560         mPropToValidValue.put(VehicleProperty.HAZARD_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
561         mPropToValidValue.put(VehicleProperty.CABIN_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
562         mPropToValidValue.put(VehicleProperty.READING_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
563         mPropToValidValue.put(VehicleProperty.HEADLIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
564         mPropToValidValue.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
565         mPropToValidValue.put(VehicleProperty.FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
566         mPropToValidValue.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
567         mPropToValidValue.put(VehicleProperty.CABIN_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
568         mPropToValidValue.put(VehicleProperty.READING_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
569 
570         // mPropToValidBitFlag contains all properties which return values are combinations of bits
571         mPropToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE,
572                 HVAC_FAN_DIRECTION_COMBINATIONS);
573         mPropToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION,
574                 HVAC_FAN_DIRECTION_COMBINATIONS);
575     }
576 
577     /**
578      * @param propId Property ID
579      * @return Read permission string for given property ID. NULL if property ID does not exist or
580      * the property is not available for reading.
581      */
582     @Nullable
getReadPermission(int propId)583     public String getReadPermission(int propId) {
584         Pair<String, String> p = mProps.get(propId);
585         if (p != null) {
586             // Property ID exists.  Return read permission.
587             if (p.first == null) {
588                 Log.e(TAG, "propId is not available for reading : 0x" + toHexString(propId));
589             }
590             return p.first;
591         } else if (isVendorProperty(propId)) {
592             // if property is vendor property and do not have specific permission.
593             return Car.PERMISSION_VENDOR_EXTENSION;
594         } else {
595             return null;
596         }
597     }
598 
599     /**
600      * @param propId Property ID
601      * @return Write permission string for given property ID. NULL if property ID does not exist or
602      * the property is not writable.
603      */
604     @Nullable
getWritePermission(int propId)605     public String getWritePermission(int propId) {
606         Pair<String, String> p = mProps.get(propId);
607         if (p != null) {
608             // Property ID exists.  Return write permission.
609             if (p.second == null) {
610                 Log.e(TAG, "propId is not writable : 0x" + toHexString(propId));
611             }
612             return p.second;
613         } else if (isVendorProperty(propId)) {
614             // if property is vendor property and do not have specific permission.
615             return Car.PERMISSION_VENDOR_EXTENSION;
616         } else {
617             return null;
618         }
619     }
620 
isVendorProperty(int propId)621     private static boolean isVendorProperty(int propId) {
622         return (propId & VehiclePropertyGroup.MASK) == VehiclePropertyGroup.VENDOR;
623     }
624     /**
625      * Check if property ID is in the list of known IDs that PropertyHalService is interested it.
626      */
isSupportedProperty(int propId)627     public boolean isSupportedProperty(int propId) {
628         // Property is in the list of supported properties
629         return mProps.get(propId) != null || isVendorProperty(propId);
630     }
631 
632     /**
633      * Check if the property is one of display units properties.
634      */
isPropertyToChangeUnits(int propertyId)635     public boolean isPropertyToChangeUnits(int propertyId) {
636         return mPropForUnits.contains(propertyId);
637     }
638 
639     /**
640      * Overrides the permission map for vendor properties
641      *
642      * @param configArray the configArray for
643      * {@link VehicleProperty#SUPPORT_CUSTOMIZE_VENDOR_PERMISSION}
644      */
customizeVendorPermission(@onNull List<Integer> configArray)645     public void customizeVendorPermission(@NonNull List<Integer> configArray) {
646         if (configArray == null || configArray.size() % 3 != 0) {
647             throw new IllegalArgumentException(
648                     "ConfigArray for SUPPORT_CUSTOMIZE_VENDOR_PERMISSION is wrong");
649         }
650         int index = 0;
651         while (index < configArray.size()) {
652             int propId = configArray.get(index++);
653             if (!isVendorProperty(propId)) {
654                 throw new IllegalArgumentException("Property Id: " + propId
655                         + " is not in vendor range");
656             }
657             int readPermission = configArray.get(index++);
658             int writePermission = configArray.get(index++);
659             mProps.put(propId, new Pair<>(
660                     toPermissionString(readPermission, propId),
661                     toPermissionString(writePermission, propId)));
662         }
663 
664     }
665 
666     /**
667      * Map VehicleVendorPermission enums in VHAL to android permissions.
668      *
669      * @return permission string, return null if vendor property is not available.
670      */
671     @Nullable
toPermissionString(int permissionEnum, int propId)672     private String toPermissionString(int permissionEnum, int propId) {
673         switch (permissionEnum) {
674             case PERMISSION_CAR_VENDOR_DEFAULT:
675                 return Car.PERMISSION_VENDOR_EXTENSION;
676             case PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW:
677                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW;
678             case PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW:
679                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW;
680             case PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR:
681                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR;
682             case PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR:
683                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR;
684             case PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT:
685                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT;
686             case PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT:
687                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT;
688             case PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR:
689                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR;
690             case PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR:
691                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR;
692             case PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO:
693                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO;
694             case PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO:
695                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO;
696             case PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE:
697                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE;
698             case PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE:
699                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE;
700             case PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC:
701                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC;
702             case PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC:
703                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC;
704             case PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT:
705                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT;
706             case PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT:
707                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT;
708             case PERMISSION_SET_CAR_VENDOR_CATEGORY_1:
709                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_1;
710             case PERMISSION_GET_CAR_VENDOR_CATEGORY_1:
711                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_1;
712             case PERMISSION_SET_CAR_VENDOR_CATEGORY_2:
713                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_2;
714             case PERMISSION_GET_CAR_VENDOR_CATEGORY_2:
715                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_2;
716             case PERMISSION_SET_CAR_VENDOR_CATEGORY_3:
717                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_3;
718             case PERMISSION_GET_CAR_VENDOR_CATEGORY_3:
719                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_3;
720             case PERMISSION_SET_CAR_VENDOR_CATEGORY_4:
721                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_4;
722             case PERMISSION_GET_CAR_VENDOR_CATEGORY_4:
723                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_4;
724             case PERMISSION_SET_CAR_VENDOR_CATEGORY_5:
725                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_5;
726             case PERMISSION_GET_CAR_VENDOR_CATEGORY_5:
727                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_5;
728             case PERMISSION_SET_CAR_VENDOR_CATEGORY_6:
729                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_6;
730             case PERMISSION_GET_CAR_VENDOR_CATEGORY_6:
731                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_6;
732             case PERMISSION_SET_CAR_VENDOR_CATEGORY_7:
733                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_7;
734             case PERMISSION_GET_CAR_VENDOR_CATEGORY_7:
735                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_7;
736             case PERMISSION_SET_CAR_VENDOR_CATEGORY_8:
737                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_8;
738             case PERMISSION_GET_CAR_VENDOR_CATEGORY_8:
739                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_8;
740             case PERMISSION_SET_CAR_VENDOR_CATEGORY_9:
741                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_9;
742             case PERMISSION_GET_CAR_VENDOR_CATEGORY_9:
743                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_9;
744             case PERMISSION_SET_CAR_VENDOR_CATEGORY_10:
745                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_10;
746             case PERMISSION_GET_CAR_VENDOR_CATEGORY_10:
747                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_10;
748             case PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE:
749                 return null;
750             default:
751                 throw new IllegalArgumentException("permission Id: " + permissionEnum
752                     + " for property:" + propId + " is invalid vendor permission Id");
753         }
754     }
755 
756     /**
757      * Checks property value's format for all properties. Checks property value range if property
758      * has @data_enum flag in types.hal.
759      * @return true if property value's payload is valid.
760      */
checkPayload(VehiclePropValue propValue)761     public boolean checkPayload(VehiclePropValue propValue) {
762         // Mixed property uses config array to indicate the data format. Checked it when convert it
763         // to CarPropertyValue.
764         if ((propValue.prop & VehiclePropertyType.MASK) == VehiclePropertyType.MIXED) {
765             return true;
766         }
767         if (!checkFormatForAllProperties(propValue)) {
768             Log.e(TAG, "Property value" + propValue + "has an invalid data format");
769             return false;
770         }
771         if (mPropToValidValue.containsKey(propValue.prop)) {
772             return checkDataEnum(propValue);
773         }
774         if (mPropToValidBitFlag.containsKey(propValue.prop)) {
775             return checkValidBitFlag(propValue);
776         }
777         return true;
778     }
779 
checkValidBitFlag(VehiclePropValue propValue)780     private boolean checkValidBitFlag(VehiclePropValue propValue) {
781         int flagCombination = mPropToValidBitFlag.get(propValue.prop);
782         for (int value : propValue.value.int32Values) {
783             if ((value & flagCombination) != value) {
784                 return false;
785             }
786         }
787         return true;
788     }
789 
checkFormatForAllProperties(VehiclePropValue propValue)790     private boolean checkFormatForAllProperties(VehiclePropValue propValue) {
791         int propId = propValue.prop;
792         VehiclePropValue.RawValue rawValue = propValue.value;
793         //Records sum size of int32values, floatValue, int64Values, bytes, String
794         int sizeOfAllValue = rawValue.int32Values.size() + rawValue.floatValues.size()
795                 + rawValue.int64Values.size() + rawValue.bytes.size()
796                 + rawValue.stringValue.length();
797         if (sizeOfAllValue == 0) {
798             Log.e(TAG, "Property value is empty: " + propValue);
799             return false;
800         }
801         switch (propId & VehiclePropertyType.MASK) {
802             case VehiclePropertyType.BOOLEAN:
803             case VehiclePropertyType.INT32:
804                 return sizeOfAllValue == 1 && rawValue.int32Values.size() == 1;
805             case VehiclePropertyType.FLOAT:
806                 return sizeOfAllValue == 1 && rawValue.floatValues.size() == 1;
807             case VehiclePropertyType.INT64:
808                 return sizeOfAllValue == 1 && rawValue.int64Values.size() == 1;
809             case VehiclePropertyType.FLOAT_VEC:
810                 return sizeOfAllValue == rawValue.floatValues.size();
811             case VehiclePropertyType.INT64_VEC:
812                 return sizeOfAllValue == rawValue.int64Values.size();
813             case VehiclePropertyType.INT32_VEC:
814                 return sizeOfAllValue == rawValue.int32Values.size();
815             case VehiclePropertyType.BYTES:
816                 return sizeOfAllValue == rawValue.bytes.size();
817             case VehiclePropertyType.STRING:
818                 return sizeOfAllValue == rawValue.stringValue.length();
819             default:
820                 throw new IllegalArgumentException("Unexpected property type for propId: "
821                         + Integer.toHexString(propId));
822         }
823     }
checkDataEnum(VehiclePropValue propValue)824     private boolean checkDataEnum(VehiclePropValue propValue) {
825         int propId = propValue.prop;
826         VehiclePropValue.RawValue rawValue = propValue.value;
827         Set<Integer> validValue = mPropToValidValue.get(propId);
828         for (int value : rawValue.int32Values) {
829             if (!validValue.contains(value)) {
830                 return false;
831             }
832         }
833         return true;
834     }
835 
getIntegersFromDataEnums(Class clazz)836     private static List<Integer> getIntegersFromDataEnums(Class clazz) {
837         Field[] fields = clazz.getDeclaredFields();
838         List<Integer> integerList = new ArrayList<>(5);
839         for (Field f : fields) {
840             if (f.getType() == int.class) {
841                 try {
842                     integerList.add(f.getInt(clazz));
843                 } catch (Exception e) {
844                     Log.w(TAG, "Failed to get value");
845                 }
846             }
847         }
848         return integerList;
849     }
850 
851     // Generate all combinations at once
generateAllCombination(Class clazz)852     private static int generateAllCombination(Class clazz) {
853         List<Integer> allBits = getIntegersFromDataEnums(clazz);
854         int combination = allBits.get(0);
855         for (int i = 1; i < allBits.size(); i++) {
856             combination |= allBits.get(i);
857         }
858         return combination;
859     }
860 }
861