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