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