• 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 android.Manifest.permission.ACCESS_FINE_LOCATION;
20 
21 import static java.lang.Integer.toHexString;
22 
23 import android.annotation.NonNull;
24 import android.annotation.Nullable;
25 import android.car.Car;
26 import android.car.VehicleHvacFanDirection;
27 import android.car.builtin.util.Slogf;
28 import android.car.hardware.property.VehicleVendorPermission;
29 import android.hardware.automotive.vehicle.AutomaticEmergencyBrakingState;
30 import android.hardware.automotive.vehicle.BlindSpotWarningState;
31 import android.hardware.automotive.vehicle.CruiseControlCommand;
32 import android.hardware.automotive.vehicle.CruiseControlState;
33 import android.hardware.automotive.vehicle.CruiseControlType;
34 import android.hardware.automotive.vehicle.ElectronicTollCollectionCardStatus;
35 import android.hardware.automotive.vehicle.ElectronicTollCollectionCardType;
36 import android.hardware.automotive.vehicle.EmergencyLaneKeepAssistState;
37 import android.hardware.automotive.vehicle.ErrorState;
38 import android.hardware.automotive.vehicle.EvChargeState;
39 import android.hardware.automotive.vehicle.EvConnectorType;
40 import android.hardware.automotive.vehicle.EvRegenerativeBrakingState;
41 import android.hardware.automotive.vehicle.EvStoppingMode;
42 import android.hardware.automotive.vehicle.ForwardCollisionWarningState;
43 import android.hardware.automotive.vehicle.FuelType;
44 import android.hardware.automotive.vehicle.GsrComplianceRequirementType;
45 import android.hardware.automotive.vehicle.HandsOnDetectionDriverState;
46 import android.hardware.automotive.vehicle.HandsOnDetectionWarning;
47 import android.hardware.automotive.vehicle.LaneCenteringAssistCommand;
48 import android.hardware.automotive.vehicle.LaneCenteringAssistState;
49 import android.hardware.automotive.vehicle.LaneDepartureWarningState;
50 import android.hardware.automotive.vehicle.LaneKeepAssistState;
51 import android.hardware.automotive.vehicle.LocationCharacterization;
52 import android.hardware.automotive.vehicle.PortLocationType;
53 import android.hardware.automotive.vehicle.TrailerState;
54 import android.hardware.automotive.vehicle.VehicleAreaSeat;
55 import android.hardware.automotive.vehicle.VehicleGear;
56 import android.hardware.automotive.vehicle.VehicleIgnitionState;
57 import android.hardware.automotive.vehicle.VehicleLightState;
58 import android.hardware.automotive.vehicle.VehicleLightSwitch;
59 import android.hardware.automotive.vehicle.VehicleOilLevel;
60 import android.hardware.automotive.vehicle.VehicleProperty;
61 import android.hardware.automotive.vehicle.VehiclePropertyGroup;
62 import android.hardware.automotive.vehicle.VehiclePropertyStatus;
63 import android.hardware.automotive.vehicle.VehiclePropertyType;
64 import android.hardware.automotive.vehicle.VehicleSeatOccupancyState;
65 import android.hardware.automotive.vehicle.VehicleTurnSignal;
66 import android.hardware.automotive.vehicle.VehicleUnit;
67 import android.hardware.automotive.vehicle.WindshieldWipersState;
68 import android.hardware.automotive.vehicle.WindshieldWipersSwitch;
69 import android.util.Pair;
70 import android.util.SparseArray;
71 import android.util.SparseIntArray;
72 
73 import com.android.car.CarLog;
74 
75 import java.lang.reflect.Field;
76 import java.util.ArrayList;
77 import java.util.Collections;
78 import java.util.HashSet;
79 import java.util.List;
80 import java.util.Set;
81 
82 /**
83  * Helper class to define which AIDL HAL property IDs are used by PropertyHalService.  This class
84  * binds the read and write permissions to the property ID.
85  */
86 public class PropertyHalServiceIds {
87 
88     /**
89      * Index key is an AIDL HAL property ID, and the value is readPermission, writePermission.
90      * If the property can not be written (or read), set value as NULL.
91      * Throw an IllegalArgumentException when try to write READ_ONLY properties or read WRITE_ONLY
92      * properties.
93      */
94     private final SparseArray<Pair<String, String>> mHalPropIdToPermissions = new SparseArray<>();
95     private final HashSet<Integer> mHalPropIdsForUnits = new HashSet<>();
96     private final SparseIntArray mHalPropIdToValidBitFlag = new SparseIntArray();
97     private static final String TAG = CarLog.tagFor(PropertyHalServiceIds.class);
98     // Enums are used as return value in Vehicle HAL.
99     private static final Set<Integer> FUEL_TYPE =
100             new HashSet<>(getIntegersFromDataEnums(FuelType.class));
101     private static final Set<Integer> EV_CONNECTOR_TYPE =
102             new HashSet<>(getIntegersFromDataEnums(EvConnectorType.class));
103     private static final Set<Integer> PORT_LOCATION =
104             new HashSet<>(getIntegersFromDataEnums(PortLocationType.class));
105     private static final Set<Integer> VEHICLE_SEAT =
106             new HashSet<>(getIntegersFromDataEnums(VehicleAreaSeat.class));
107     private static final Set<Integer> OIL_LEVEL =
108             new HashSet<>(getIntegersFromDataEnums(VehicleOilLevel.class));
109     private static final Set<Integer> VEHICLE_GEAR =
110             new HashSet<>(getIntegersFromDataEnums(VehicleGear.class));
111     private static final Set<Integer> TURN_SIGNAL =
112             new HashSet<>(getIntegersFromDataEnums(VehicleTurnSignal.class));
113     private static final Set<Integer> IGNITION_STATE =
114             new HashSet<>(getIntegersFromDataEnums(VehicleIgnitionState.class));
115     private static final Set<Integer> VEHICLE_UNITS =
116             new HashSet<>(getIntegersFromDataEnums(VehicleUnit.class));
117     private static final Set<Integer> SEAT_OCCUPANCY_STATE =
118             new HashSet<>(getIntegersFromDataEnums(VehicleSeatOccupancyState.class));
119     private static final Set<Integer> VEHICLE_LIGHT_STATE =
120             new HashSet<>(getIntegersFromDataEnums(VehicleLightState.class));
121     private static final Set<Integer> VEHICLE_LIGHT_SWITCH =
122             new HashSet<>(getIntegersFromDataEnums(VehicleLightSwitch.class));
123     private static final int HVAC_FAN_DIRECTION_COMBINATIONS =
124             generateAllCombination(VehicleHvacFanDirection.class);
125     private static final Set<Integer> ETC_CARD_TYPE =
126             new HashSet<>(getIntegersFromDataEnums(ElectronicTollCollectionCardType.class));
127     private static final Set<Integer> ETC_CARD_STATUS =
128             new HashSet<>(getIntegersFromDataEnums(ElectronicTollCollectionCardStatus.class));
129     private static final Set<Integer> EV_CHARGE_STATE =
130             new HashSet<>(getIntegersFromDataEnums(EvChargeState.class));
131     private static final Set<Integer> EV_REGENERATIVE_BREAKING_STATE =
132             new HashSet<>(getIntegersFromDataEnums(EvRegenerativeBrakingState.class));
133     private static final Set<Integer> EV_STOPPING_MODE =
134             new HashSet<>(getIntegersFromDataEnums(EvStoppingMode.class));
135     private static final Set<Integer> TRAILER_PRESENT =
136             new HashSet<>(getIntegersFromDataEnums(TrailerState.class));
137     private static final Set<Integer> GSR_COMP_TYPE =
138             new HashSet<>(getIntegersFromDataEnums(GsrComplianceRequirementType.class));
139     private static final int LOCATION_CHARACTERIZATION =
140             generateAllCombination(LocationCharacterization.class);
141     private static final Set<Integer> WINDSHIELD_WIPERS_STATE =
142             new HashSet<>(getIntegersFromDataEnums(WindshieldWipersState.class));
143     private static final Set<Integer> WINDSHIELD_WIPERS_SWITCH =
144             new HashSet<>(getIntegersFromDataEnums(WindshieldWipersSwitch.class));
145     private static final Set<Integer> EMERGENCY_LANE_KEEP_ASSIST_STATE =
146             new HashSet<>(getIntegersFromDataEnums(
147                     EmergencyLaneKeepAssistState.class, ErrorState.class));
148     private static final Set<Integer> CRUISE_CONTROL_TYPE =
149             new HashSet<>(getIntegersFromDataEnums(
150                     CruiseControlType.class, ErrorState.class));
151     private static final Set<Integer> CRUISE_CONTROL_STATE =
152             new HashSet<>(getIntegersFromDataEnums(
153                     CruiseControlState.class, ErrorState.class));
154     private static final Set<Integer> CRUISE_CONTROL_COMMAND =
155             new HashSet<>(getIntegersFromDataEnums(CruiseControlCommand.class));
156     private static final Set<Integer> HANDS_ON_DETECTION_DRIVER_STATE =
157             new HashSet<>(getIntegersFromDataEnums(
158                     HandsOnDetectionDriverState.class, ErrorState.class));
159     private static final Set<Integer> HANDS_ON_DETECTION_WARNING =
160             new HashSet<>(getIntegersFromDataEnums(
161                     HandsOnDetectionWarning.class, ErrorState.class));
162     private static final Set<Integer> AUTOMATIC_EMERGENCY_BRAKING_STATE =
163             new HashSet<>(getIntegersFromDataEnums(
164                 AutomaticEmergencyBrakingState.class, ErrorState.class));
165     private static final Set<Integer> FORWARD_COLLISION_WARNING_STATE =
166             new HashSet<>(getIntegersFromDataEnums(
167                 ForwardCollisionWarningState.class, ErrorState.class));
168     private static final Set<Integer> BLIND_SPOT_WARNING_STATE =
169             new HashSet<>(getIntegersFromDataEnums(
170                 BlindSpotWarningState.class, ErrorState.class));
171     private static final Set<Integer> LANE_DEPARTURE_WARNING_STATE =
172             new HashSet<>(getIntegersFromDataEnums(
173                 LaneDepartureWarningState.class, ErrorState.class));
174     private static final Set<Integer> LANE_KEEP_ASSIST_STATE =
175             new HashSet<>(getIntegersFromDataEnums(
176                 LaneKeepAssistState.class, ErrorState.class));
177     private static final Set<Integer> LANE_CENTERING_ASSIST_COMMAND =
178             new HashSet<>(getIntegersFromDataEnums(LaneCenteringAssistCommand.class));
179     private static final Set<Integer> LANE_CENTERING_ASSIST_STATE =
180             new HashSet<>(getIntegersFromDataEnums(
181                 LaneCenteringAssistState.class, ErrorState.class));
182 
183     // TODO(b/264946993): Autogenerate HAL_PROP_ID_TO_ENUM_SET directly from AIDL definition.
184     private static final SparseArray<Set<Integer>> HAL_PROP_ID_TO_ENUM_SET = new SparseArray<>();
185     static {
186         // HAL_PROP_ID_TO_ENUM_SET should contain all properties which have @data_enum in
187         // VehicleProperty.aidl
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_FUEL_TYPE, FUEL_TYPE)188         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_FUEL_TYPE, FUEL_TYPE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, EV_CONNECTOR_TYPE)189         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, EV_CONNECTOR_TYPE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, PORT_LOCATION)190         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, PORT_LOCATION);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_DRIVER_SEAT, VEHICLE_SEAT)191         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_DRIVER_SEAT, VEHICLE_SEAT);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, PORT_LOCATION)192         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, PORT_LOCATION);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ENGINE_OIL_LEVEL, OIL_LEVEL)193         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ENGINE_OIL_LEVEL, OIL_LEVEL);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.GEAR_SELECTION, VEHICLE_GEAR)194         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.GEAR_SELECTION, VEHICLE_GEAR);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CURRENT_GEAR, VEHICLE_GEAR)195         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CURRENT_GEAR, VEHICLE_GEAR);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TURN_SIGNAL_STATE, TURN_SIGNAL)196         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TURN_SIGNAL_STATE, TURN_SIGNAL);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.IGNITION_STATE, IGNITION_STATE)197         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.IGNITION_STATE, IGNITION_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_UNITS)198         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, VEHICLE_UNITS)199         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, VEHICLE_UNITS)200         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, VEHICLE_UNITS)201         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, VEHICLE_UNITS)202         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, VEHICLE_UNITS)203         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, VEHICLE_UNITS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.SEAT_OCCUPANCY, SEAT_OCCUPANCY_STATE)204         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.SEAT_OCCUPANCY, SEAT_OCCUPANCY_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, VEHICLE_LIGHT_STATE)205         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HEADLIGHTS_STATE, VEHICLE_LIGHT_STATE)206         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HEADLIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE)207         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FRONT_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE)208         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FRONT_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.REAR_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE)209         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.REAR_FOG_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HAZARD_LIGHTS_STATE, VEHICLE_LIGHT_STATE)210         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HAZARD_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CABIN_LIGHTS_STATE, VEHICLE_LIGHT_STATE)211         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CABIN_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.READING_LIGHTS_STATE, VEHICLE_LIGHT_STATE)212         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.READING_LIGHTS_STATE, VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_CHARGE_STATE, EV_CHARGE_STATE)213         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_CHARGE_STATE, EV_CHARGE_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE, EV_REGENERATIVE_BREAKING_STATE)214         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE,
215                 EV_REGENERATIVE_BREAKING_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HEADLIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)216         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HEADLIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)217         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)218         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)219         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)220         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)221         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CABIN_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)222         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CABIN_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.READING_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)223         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.READING_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE, ETC_CARD_TYPE)224         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE,
225                 ETC_CARD_TYPE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS, ETC_CARD_STATUS)226         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS,
227                 ETC_CARD_STATUS);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TRAILER_PRESENT, TRAILER_PRESENT)228         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.TRAILER_PRESENT,
229                 TRAILER_PRESENT);
HAL_PROP_ID_TO_ENUM_SET.put( VehicleProperty.GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT, GSR_COMP_TYPE)230         HAL_PROP_ID_TO_ENUM_SET.put(
231                 VehicleProperty.GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT,
232                 GSR_COMP_TYPE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_STOPPING_MODE, EV_STOPPING_MODE)233         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EV_STOPPING_MODE,
234                 EV_STOPPING_MODE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.WINDSHIELD_WIPERS_STATE, WINDSHIELD_WIPERS_STATE)235         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.WINDSHIELD_WIPERS_STATE,
236                 WINDSHIELD_WIPERS_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.WINDSHIELD_WIPERS_SWITCH, WINDSHIELD_WIPERS_SWITCH)237         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.WINDSHIELD_WIPERS_SWITCH,
238                 WINDSHIELD_WIPERS_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.STEERING_WHEEL_LIGHTS_SWITCH, VEHICLE_LIGHT_SWITCH)239         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.STEERING_WHEEL_LIGHTS_SWITCH,
240                 VEHICLE_LIGHT_SWITCH);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.STEERING_WHEEL_LIGHTS_STATE, VEHICLE_LIGHT_STATE)241         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.STEERING_WHEEL_LIGHTS_STATE,
242                 VEHICLE_LIGHT_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_STATE, EMERGENCY_LANE_KEEP_ASSIST_STATE)243         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_STATE,
244                 EMERGENCY_LANE_KEEP_ASSIST_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_TYPE, CRUISE_CONTROL_TYPE)245         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_TYPE,
246                 CRUISE_CONTROL_TYPE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_STATE, CRUISE_CONTROL_STATE)247         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_STATE,
248                 CRUISE_CONTROL_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_COMMAND, CRUISE_CONTROL_COMMAND)249         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.CRUISE_CONTROL_COMMAND,
250                 CRUISE_CONTROL_COMMAND);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HANDS_ON_DETECTION_DRIVER_STATE, HANDS_ON_DETECTION_DRIVER_STATE)251         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HANDS_ON_DETECTION_DRIVER_STATE,
252                 HANDS_ON_DETECTION_DRIVER_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HANDS_ON_DETECTION_WARNING, HANDS_ON_DETECTION_WARNING)253         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.HANDS_ON_DETECTION_WARNING,
254                 HANDS_ON_DETECTION_WARNING);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_STATE, AUTOMATIC_EMERGENCY_BRAKING_STATE)255         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_STATE,
256                 AUTOMATIC_EMERGENCY_BRAKING_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FORWARD_COLLISION_WARNING_STATE, FORWARD_COLLISION_WARNING_STATE)257         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.FORWARD_COLLISION_WARNING_STATE,
258                 FORWARD_COLLISION_WARNING_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.BLIND_SPOT_WARNING_STATE, BLIND_SPOT_WARNING_STATE)259         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.BLIND_SPOT_WARNING_STATE,
260                 BLIND_SPOT_WARNING_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_DEPARTURE_WARNING_STATE, LANE_DEPARTURE_WARNING_STATE)261         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_DEPARTURE_WARNING_STATE,
262                 LANE_DEPARTURE_WARNING_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_KEEP_ASSIST_STATE, LANE_KEEP_ASSIST_STATE)263         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_KEEP_ASSIST_STATE,
264                 LANE_KEEP_ASSIST_STATE);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_CENTERING_ASSIST_COMMAND, LANE_CENTERING_ASSIST_COMMAND)265         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_CENTERING_ASSIST_COMMAND,
266                 LANE_CENTERING_ASSIST_COMMAND);
HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_CENTERING_ASSIST_STATE, LANE_CENTERING_ASSIST_STATE)267         HAL_PROP_ID_TO_ENUM_SET.put(VehicleProperty.LANE_CENTERING_ASSIST_STATE,
268                 LANE_CENTERING_ASSIST_STATE);
269     }
270 
271     // default vendor permission
272     private static final int PERMISSION_CAR_VENDOR_DEFAULT = 0x00000000;
273 
274     // permissions for the property related with window
275     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW = 0X00000001;
276     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW = 0x00000002;
277     // permissions for the property related with door
278     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR = 0x00000003;
279     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR = 0x00000004;
280     // permissions for the property related with seat
281     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT = 0x00000005;
282     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT = 0x00000006;
283     // permissions for the property related with mirror
284     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000007;
285     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR = 0x00000008;
286 
287     // permissions for the property related with car's information
288     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO = 0x00000009;
289     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO = 0x0000000A;
290     // permissions for the property related with car's engine
291     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000B;
292     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE = 0x0000000C;
293     // permissions for the property related with car's HVAC
294     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000D;
295     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC = 0x0000000E;
296     // permissions for the property related with car's light
297     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT = 0x0000000F;
298     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT = 0x00000010;
299 
300     // permissions reserved for other vendor permission
301     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_1 = 0x00010000;
302     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_1 = 0x00011000;
303     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_2 = 0x00020000;
304     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_2 = 0x00021000;
305     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_3 = 0x00030000;
306     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_3 = 0x00031000;
307     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_4 = 0x00040000;
308     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_4 = 0x00041000;
309     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_5 = 0x00050000;
310     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_5 = 0x00051000;
311     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_6 = 0x00060000;
312     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_6 = 0x00061000;
313     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_7 = 0x00070000;
314     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_7 = 0x00071000;
315     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_8 = 0x00080000;
316     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_8 = 0x00081000;
317     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_9 = 0x00090000;
318     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_9 = 0x00091000;
319     private static final int PERMISSION_SET_CAR_VENDOR_CATEGORY_10 = 0x000A0000;
320     private static final int PERMISSION_GET_CAR_VENDOR_CATEGORY_10 = 0x000A1000;
321     // Not available for android
322     private static final int PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE = 0xF0000000;
323 
PropertyHalServiceIds()324     public PropertyHalServiceIds() {
325         // Add propertyId and read/write permissions
326         // Cabin Properties
327         mHalPropIdToPermissions.put(VehicleProperty.DOOR_POS, new Pair<>(
328                 Car.PERMISSION_CONTROL_CAR_DOORS,
329                 Car.PERMISSION_CONTROL_CAR_DOORS));
330         mHalPropIdToPermissions.put(VehicleProperty.DOOR_MOVE, new Pair<>(
331                 Car.PERMISSION_CONTROL_CAR_DOORS,
332                 Car.PERMISSION_CONTROL_CAR_DOORS));
333         mHalPropIdToPermissions.put(VehicleProperty.DOOR_LOCK, new Pair<>(
334                 Car.PERMISSION_CONTROL_CAR_DOORS,
335                 Car.PERMISSION_CONTROL_CAR_DOORS));
336         mHalPropIdToPermissions.put(VehicleProperty.DOOR_CHILD_LOCK_ENABLED, new Pair<>(
337                 Car.PERMISSION_CONTROL_CAR_DOORS,
338                 Car.PERMISSION_CONTROL_CAR_DOORS));
339         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_Z_POS, new Pair<>(
340                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
341                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
342         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_Z_MOVE, new Pair<>(
343                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
344                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
345         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_Y_POS, new Pair<>(
346                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
347                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
348         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_Y_MOVE, new Pair<>(
349                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
350                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
351         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_LOCK, new Pair<>(
352                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
353                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
354         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_FOLD, new Pair<>(
355                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
356                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
357         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_AUTO_FOLD_ENABLED, new Pair<>(
358                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
359                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
360         mHalPropIdToPermissions.put(VehicleProperty.MIRROR_AUTO_TILT_ENABLED, new Pair<>(
361                 Car.PERMISSION_CONTROL_CAR_MIRRORS,
362                 Car.PERMISSION_CONTROL_CAR_MIRRORS));
363         mHalPropIdToPermissions.put(VehicleProperty.GLOVE_BOX_DOOR_POS, new Pair<>(
364                 Car.PERMISSION_CONTROL_GLOVE_BOX,
365                 Car.PERMISSION_CONTROL_GLOVE_BOX));
366         mHalPropIdToPermissions.put(VehicleProperty.GLOVE_BOX_LOCKED, new Pair<>(
367                 Car.PERMISSION_CONTROL_GLOVE_BOX,
368                 Car.PERMISSION_CONTROL_GLOVE_BOX));
369         mHalPropIdToPermissions.put(VehicleProperty.SEAT_MEMORY_SELECT, new Pair<>(
370                 null,
371                 Car.PERMISSION_CONTROL_CAR_SEATS));
372         mHalPropIdToPermissions.put(VehicleProperty.SEAT_MEMORY_SET, new Pair<>(
373                 null,
374                 Car.PERMISSION_CONTROL_CAR_SEATS));
375         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BELT_BUCKLED, new Pair<>(
376                 Car.PERMISSION_CONTROL_CAR_SEATS,
377                 Car.PERMISSION_CONTROL_CAR_SEATS));
378         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BELT_HEIGHT_POS, new Pair<>(
379                 Car.PERMISSION_CONTROL_CAR_SEATS,
380                 Car.PERMISSION_CONTROL_CAR_SEATS));
381         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BELT_HEIGHT_MOVE, new Pair<>(
382                 Car.PERMISSION_CONTROL_CAR_SEATS,
383                 Car.PERMISSION_CONTROL_CAR_SEATS));
384         mHalPropIdToPermissions.put(VehicleProperty.SEAT_FORE_AFT_POS, new Pair<>(
385                 Car.PERMISSION_CONTROL_CAR_SEATS,
386                 Car.PERMISSION_CONTROL_CAR_SEATS));
387         mHalPropIdToPermissions.put(VehicleProperty.SEAT_FORE_AFT_MOVE, new Pair<>(
388                 Car.PERMISSION_CONTROL_CAR_SEATS,
389                 Car.PERMISSION_CONTROL_CAR_SEATS));
390         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_POS, new Pair<>(
391                 Car.PERMISSION_CONTROL_CAR_SEATS,
392                 Car.PERMISSION_CONTROL_CAR_SEATS));
393         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE, new Pair<>(
394                 Car.PERMISSION_CONTROL_CAR_SEATS,
395                 Car.PERMISSION_CONTROL_CAR_SEATS));
396         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_POS, new Pair<>(
397                 Car.PERMISSION_CONTROL_CAR_SEATS,
398                 Car.PERMISSION_CONTROL_CAR_SEATS));
399         mHalPropIdToPermissions.put(VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE, new Pair<>(
400                 Car.PERMISSION_CONTROL_CAR_SEATS,
401                 Car.PERMISSION_CONTROL_CAR_SEATS));
402         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEIGHT_POS, new Pair<>(
403                 Car.PERMISSION_CONTROL_CAR_SEATS,
404                 Car.PERMISSION_CONTROL_CAR_SEATS));
405         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEIGHT_MOVE, new Pair<>(
406                 Car.PERMISSION_CONTROL_CAR_SEATS,
407                 Car.PERMISSION_CONTROL_CAR_SEATS));
408         mHalPropIdToPermissions.put(VehicleProperty.SEAT_DEPTH_POS, new Pair<>(
409                 Car.PERMISSION_CONTROL_CAR_SEATS,
410                 Car.PERMISSION_CONTROL_CAR_SEATS));
411         mHalPropIdToPermissions.put(VehicleProperty.SEAT_DEPTH_MOVE, new Pair<>(
412                 Car.PERMISSION_CONTROL_CAR_SEATS,
413                 Car.PERMISSION_CONTROL_CAR_SEATS));
414         mHalPropIdToPermissions.put(VehicleProperty.SEAT_TILT_POS, new Pair<>(
415                 Car.PERMISSION_CONTROL_CAR_SEATS,
416                 Car.PERMISSION_CONTROL_CAR_SEATS));
417         mHalPropIdToPermissions.put(VehicleProperty.SEAT_TILT_MOVE, new Pair<>(
418                 Car.PERMISSION_CONTROL_CAR_SEATS,
419                 Car.PERMISSION_CONTROL_CAR_SEATS));
420         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS, new Pair<>(
421                 Car.PERMISSION_CONTROL_CAR_SEATS,
422                 Car.PERMISSION_CONTROL_CAR_SEATS));
423         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE, new Pair<>(
424                 Car.PERMISSION_CONTROL_CAR_SEATS,
425                 Car.PERMISSION_CONTROL_CAR_SEATS));
426         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS, new Pair<>(
427                 Car.PERMISSION_CONTROL_CAR_SEATS,
428                 Car.PERMISSION_CONTROL_CAR_SEATS));
429         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE, new Pair<>(
430                 Car.PERMISSION_CONTROL_CAR_SEATS,
431                 Car.PERMISSION_CONTROL_CAR_SEATS));
432         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_HEIGHT_POS_V2, new Pair<>(
433                 Car.PERMISSION_CONTROL_CAR_SEATS,
434                 Car.PERMISSION_CONTROL_CAR_SEATS));
435         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE, new Pair<>(
436                 Car.PERMISSION_CONTROL_CAR_SEATS,
437                 Car.PERMISSION_CONTROL_CAR_SEATS));
438         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_ANGLE_POS, new Pair<>(
439                 Car.PERMISSION_CONTROL_CAR_SEATS,
440                 Car.PERMISSION_CONTROL_CAR_SEATS));
441         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_ANGLE_MOVE, new Pair<>(
442                 Car.PERMISSION_CONTROL_CAR_SEATS,
443                 Car.PERMISSION_CONTROL_CAR_SEATS));
444         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_POS, new Pair<>(
445                 Car.PERMISSION_CONTROL_CAR_SEATS,
446                 Car.PERMISSION_CONTROL_CAR_SEATS));
447         mHalPropIdToPermissions.put(VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE, new Pair<>(
448                 Car.PERMISSION_CONTROL_CAR_SEATS,
449                 Car.PERMISSION_CONTROL_CAR_SEATS));
450         mHalPropIdToPermissions.put(VehicleProperty.SEAT_FOOTWELL_LIGHTS_STATE, new Pair<>(
451                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
452                 null));
453         mHalPropIdToPermissions.put(VehicleProperty.SEAT_FOOTWELL_LIGHTS_SWITCH, new Pair<>(
454                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
455                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
456         mHalPropIdToPermissions.put(VehicleProperty.SEAT_EASY_ACCESS_ENABLED, new Pair<>(
457                 Car.PERMISSION_CONTROL_CAR_SEATS,
458                 Car.PERMISSION_CONTROL_CAR_SEATS));
459         mHalPropIdToPermissions.put(VehicleProperty.SEAT_AIRBAG_ENABLED, new Pair<>(
460                 Car.PERMISSION_CONTROL_CAR_AIRBAGS,
461                 Car.PERMISSION_CONTROL_CAR_AIRBAGS));
462         mHalPropIdToPermissions.put(VehicleProperty.SEAT_CUSHION_SIDE_SUPPORT_POS, new Pair<>(
463                 Car.PERMISSION_CONTROL_CAR_SEATS,
464                 Car.PERMISSION_CONTROL_CAR_SEATS));
465         mHalPropIdToPermissions.put(VehicleProperty.SEAT_CUSHION_SIDE_SUPPORT_MOVE, new Pair<>(
466                 Car.PERMISSION_CONTROL_CAR_SEATS,
467                 Car.PERMISSION_CONTROL_CAR_SEATS));
468         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_VERTICAL_POS, new Pair<>(
469                 Car.PERMISSION_CONTROL_CAR_SEATS,
470                 Car.PERMISSION_CONTROL_CAR_SEATS));
471         mHalPropIdToPermissions.put(VehicleProperty.SEAT_LUMBAR_VERTICAL_MOVE, new Pair<>(
472                 Car.PERMISSION_CONTROL_CAR_SEATS,
473                 Car.PERMISSION_CONTROL_CAR_SEATS));
474         mHalPropIdToPermissions.put(VehicleProperty.SEAT_WALK_IN_POS, new Pair<>(
475                 Car.PERMISSION_CONTROL_CAR_SEATS,
476                 Car.PERMISSION_CONTROL_CAR_SEATS));
477         mHalPropIdToPermissions.put(VehicleProperty.SEAT_OCCUPANCY, new Pair<>(
478                 Car.PERMISSION_CONTROL_CAR_SEATS,
479                 null));
480         mHalPropIdToPermissions.put(VehicleProperty.WINDOW_POS, new Pair<>(
481                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
482                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
483         mHalPropIdToPermissions.put(VehicleProperty.WINDOW_MOVE, new Pair<>(
484                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
485                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
486         mHalPropIdToPermissions.put(VehicleProperty.WINDOW_LOCK, new Pair<>(
487                 Car.PERMISSION_CONTROL_CAR_WINDOWS,
488                 Car.PERMISSION_CONTROL_CAR_WINDOWS));
489         mHalPropIdToPermissions.put(VehicleProperty.WINDSHIELD_WIPERS_PERIOD, new Pair<>(
490                 Car.PERMISSION_READ_WINDSHIELD_WIPERS,
491                 null));
492         mHalPropIdToPermissions.put(VehicleProperty.WINDSHIELD_WIPERS_STATE, new Pair<>(
493                 Car.PERMISSION_READ_WINDSHIELD_WIPERS,
494                 null));
495         mHalPropIdToPermissions.put(VehicleProperty.WINDSHIELD_WIPERS_SWITCH, new Pair<>(
496                 Car.PERMISSION_READ_WINDSHIELD_WIPERS,
497                 Car.PERMISSION_CONTROL_WINDSHIELD_WIPERS));
498         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_DEPTH_POS, new Pair<>(
499                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
500                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
501         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_DEPTH_MOVE, new Pair<>(
502                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
503                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
504         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_HEIGHT_POS, new Pair<>(
505                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
506                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
507         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_HEIGHT_MOVE, new Pair<>(
508                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
509                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
510         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_THEFT_LOCK_ENABLED, new Pair<>(
511                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
512                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
513         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_LOCKED, new Pair<>(
514                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
515                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
516         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_EASY_ACCESS_ENABLED, new Pair<>(
517                 Car.PERMISSION_CONTROL_STEERING_WHEEL,
518                 Car.PERMISSION_CONTROL_STEERING_WHEEL));
519 
520         // HVAC properties
521         mHalPropIdToPermissions.put(VehicleProperty.HVAC_FAN_SPEED, new Pair<>(
522                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
523                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
524         mHalPropIdToPermissions.put(VehicleProperty.HVAC_FAN_DIRECTION, new Pair<>(
525                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
526                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
527         mHalPropIdToPermissions.put(VehicleProperty.HVAC_TEMPERATURE_CURRENT, new Pair<>(
528                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
529                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
530         mHalPropIdToPermissions.put(VehicleProperty.HVAC_TEMPERATURE_SET, new Pair<>(
531                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
532                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
533         mHalPropIdToPermissions.put(VehicleProperty.HVAC_TEMPERATURE_VALUE_SUGGESTION, new Pair<>(
534                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
535                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
536         mHalPropIdToPermissions.put(VehicleProperty.HVAC_DEFROSTER, new Pair<>(
537                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
538                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
539         mHalPropIdToPermissions.put(VehicleProperty.HVAC_ELECTRIC_DEFROSTER_ON, new Pair<>(
540                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
541                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
542         mHalPropIdToPermissions.put(VehicleProperty.HVAC_AC_ON, new Pair<>(
543                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
544                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
545         mHalPropIdToPermissions.put(VehicleProperty.HVAC_MAX_AC_ON, new Pair<>(
546                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
547                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
548         mHalPropIdToPermissions.put(VehicleProperty.HVAC_MAX_DEFROST_ON, new Pair<>(
549                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
550                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
551         mHalPropIdToPermissions.put(VehicleProperty.HVAC_RECIRC_ON, new Pair<>(
552                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
553                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
554         mHalPropIdToPermissions.put(VehicleProperty.HVAC_DUAL_ON, new Pair<>(
555                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
556                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
557         mHalPropIdToPermissions.put(VehicleProperty.HVAC_AUTO_ON, new Pair<>(
558                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
559                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
560         mHalPropIdToPermissions.put(VehicleProperty.HVAC_SEAT_TEMPERATURE, new Pair<>(
561                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
562                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
563         mHalPropIdToPermissions.put(VehicleProperty.HVAC_SIDE_MIRROR_HEAT, new Pair<>(
564                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
565                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
566         mHalPropIdToPermissions.put(VehicleProperty.HVAC_STEERING_WHEEL_HEAT, new Pair<>(
567                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
568                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
569         mHalPropIdToPermissions.put(VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS, new Pair<>(
570                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
571                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
572         mHalPropIdToPermissions.put(VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM, new Pair<>(
573                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
574                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
575         mHalPropIdToPermissions.put(VehicleProperty.HVAC_POWER_ON, new Pair<>(
576                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
577                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
578         mHalPropIdToPermissions.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE, new Pair<>(
579                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
580                     null));
581         mHalPropIdToPermissions.put(VehicleProperty.HVAC_AUTO_RECIRC_ON, new Pair<>(
582                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
583                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
584         mHalPropIdToPermissions.put(VehicleProperty.HVAC_SEAT_VENTILATION, new Pair<>(
585                     Car.PERMISSION_CONTROL_CAR_CLIMATE,
586                     Car.PERMISSION_CONTROL_CAR_CLIMATE));
587 
588         // Info properties
589         mHalPropIdToPermissions.put(VehicleProperty.INFO_VIN, new Pair<>(
590                     Car.PERMISSION_IDENTIFICATION,
591                     null));
592         mHalPropIdToPermissions.put(VehicleProperty.INFO_MAKE, new Pair<>(
593                     Car.PERMISSION_CAR_INFO,
594                     null));
595         mHalPropIdToPermissions.put(VehicleProperty.INFO_MODEL, new Pair<>(
596                     Car.PERMISSION_CAR_INFO,
597                     null));
598         mHalPropIdToPermissions.put(VehicleProperty.INFO_MODEL_YEAR, new Pair<>(
599                     Car.PERMISSION_CAR_INFO,
600                     null));
601         mHalPropIdToPermissions.put(VehicleProperty.INFO_FUEL_CAPACITY, new Pair<>(
602                     Car.PERMISSION_CAR_INFO,
603                     null));
604         mHalPropIdToPermissions.put(VehicleProperty.INFO_FUEL_TYPE, new Pair<>(
605                     Car.PERMISSION_CAR_INFO,
606                     null));
607         mHalPropIdToPermissions.put(VehicleProperty.INFO_EV_BATTERY_CAPACITY, new Pair<>(
608                     Car.PERMISSION_CAR_INFO,
609                     null));
610         mHalPropIdToPermissions.put(VehicleProperty.INFO_EV_CONNECTOR_TYPE, new Pair<>(
611                     Car.PERMISSION_CAR_INFO,
612                     null));
613         mHalPropIdToPermissions.put(VehicleProperty.INFO_FUEL_DOOR_LOCATION, new Pair<>(
614                     Car.PERMISSION_CAR_INFO,
615                     null));
616         mHalPropIdToPermissions.put(VehicleProperty.INFO_MULTI_EV_PORT_LOCATIONS, new Pair<>(
617                     Car.PERMISSION_CAR_INFO,
618                     null));
619         mHalPropIdToPermissions.put(VehicleProperty.INFO_EV_PORT_LOCATION, new Pair<>(
620                     Car.PERMISSION_CAR_INFO,
621                     null));
622         mHalPropIdToPermissions.put(VehicleProperty.INFO_DRIVER_SEAT, new Pair<>(
623                     Car.PERMISSION_CAR_INFO,
624                     null));
625         mHalPropIdToPermissions.put(VehicleProperty.INFO_EXTERIOR_DIMENSIONS, new Pair<>(
626                     Car.PERMISSION_CAR_INFO,
627                     null));
628 
629         // Sensor properties
630         mHalPropIdToPermissions.put(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_ENABLED, new Pair<>(
631                 Car.PERMISSION_READ_ADAS_SETTINGS,
632                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
633         mHalPropIdToPermissions.put(VehicleProperty.EMERGENCY_LANE_KEEP_ASSIST_STATE, new Pair<>(
634                 Car.PERMISSION_READ_ADAS_STATES,
635                 null));
636         mHalPropIdToPermissions.put(VehicleProperty.CRUISE_CONTROL_ENABLED, new Pair<>(
637                 Car.PERMISSION_READ_ADAS_SETTINGS,
638                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
639         mHalPropIdToPermissions.put(VehicleProperty.CRUISE_CONTROL_TYPE, new Pair<>(
640                 Car.PERMISSION_READ_ADAS_STATES,
641                 Car.PERMISSION_CONTROL_ADAS_STATES));
642         mHalPropIdToPermissions.put(VehicleProperty.CRUISE_CONTROL_STATE, new Pair<>(
643                 Car.PERMISSION_READ_ADAS_STATES,
644                 null));
645         mHalPropIdToPermissions.put(VehicleProperty.CRUISE_CONTROL_COMMAND, new Pair<>(
646                 null,
647                 Car.PERMISSION_CONTROL_ADAS_STATES));
648         mHalPropIdToPermissions.put(VehicleProperty.CRUISE_CONTROL_TARGET_SPEED, new Pair<>(
649                 Car.PERMISSION_READ_ADAS_STATES,
650                 null));
651         mHalPropIdToPermissions.put(VehicleProperty.ADAPTIVE_CRUISE_CONTROL_TARGET_TIME_GAP,
652                 new Pair<>(
653                         Car.PERMISSION_READ_ADAS_STATES,
654                         Car.PERMISSION_CONTROL_ADAS_STATES));
655         mHalPropIdToPermissions.put(
656                 VehicleProperty.ADAPTIVE_CRUISE_CONTROL_LEAD_VEHICLE_MEASURED_DISTANCE, new Pair<>(
657                         Car.PERMISSION_READ_ADAS_STATES,
658                         null));
659         mHalPropIdToPermissions.put(VehicleProperty.HANDS_ON_DETECTION_ENABLED, new Pair<>(
660                 Car.PERMISSION_READ_DRIVER_MONITORING_SETTINGS,
661                 Car.PERMISSION_CONTROL_DRIVER_MONITORING_SETTINGS));
662         mHalPropIdToPermissions.put(VehicleProperty.HANDS_ON_DETECTION_DRIVER_STATE, new Pair<>(
663                 Car.PERMISSION_READ_DRIVER_MONITORING_STATES,
664                 null));
665         mHalPropIdToPermissions.put(VehicleProperty.HANDS_ON_DETECTION_WARNING, new Pair<>(
666                 Car.PERMISSION_READ_DRIVER_MONITORING_STATES,
667                 null));
668         mHalPropIdToPermissions.put(VehicleProperty.PERF_ODOMETER, new Pair<>(
669                 Car.PERMISSION_MILEAGE,
670                 null));
671         mHalPropIdToPermissions.put(VehicleProperty.PERF_VEHICLE_SPEED, new Pair<>(
672                 Car.PERMISSION_SPEED,
673                 null));
674         mHalPropIdToPermissions.put(VehicleProperty.PERF_VEHICLE_SPEED_DISPLAY, new Pair<>(
675                 Car.PERMISSION_SPEED,
676                 null));
677         mHalPropIdToPermissions.put(VehicleProperty.ENGINE_COOLANT_TEMP, new Pair<>(
678                 Car.PERMISSION_CAR_ENGINE_DETAILED,
679                 null));
680         mHalPropIdToPermissions.put(VehicleProperty.ENGINE_OIL_LEVEL, new Pair<>(
681                 Car.PERMISSION_CAR_ENGINE_DETAILED,
682                 null));
683         mHalPropIdToPermissions.put(VehicleProperty.ENGINE_OIL_TEMP, new Pair<>(
684                 Car.PERMISSION_CAR_ENGINE_DETAILED,
685                 null));
686         mHalPropIdToPermissions.put(VehicleProperty.ENGINE_RPM, new Pair<>(
687                 Car.PERMISSION_CAR_ENGINE_DETAILED,
688                 null));
689         mHalPropIdToPermissions.put(VehicleProperty.ENGINE_IDLE_AUTO_STOP_ENABLED, new Pair<>(
690                 Car.PERMISSION_CAR_ENGINE_DETAILED,
691                 Car.PERMISSION_CAR_ENGINE_DETAILED));
692         mHalPropIdToPermissions.put(VehicleProperty.WHEEL_TICK, new Pair<>(
693                 Car.PERMISSION_SPEED,
694                 null));
695         mHalPropIdToPermissions.put(VehicleProperty.FUEL_LEVEL, new Pair<>(
696                 Car.PERMISSION_ENERGY,
697                 null));
698         mHalPropIdToPermissions.put(VehicleProperty.FUEL_DOOR_OPEN, new Pair<>(
699                 Car.PERMISSION_ENERGY_PORTS,
700                 Car.PERMISSION_CONTROL_ENERGY_PORTS));
701         mHalPropIdToPermissions.put(VehicleProperty.EV_BATTERY_LEVEL, new Pair<>(
702                 Car.PERMISSION_ENERGY,
703                 null));
704         mHalPropIdToPermissions.put(VehicleProperty.EV_CURRENT_BATTERY_CAPACITY, new Pair<>(
705                 Car.PERMISSION_ENERGY,
706                 null));
707         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_CURRENT_DRAW_LIMIT, new Pair<>(
708                 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY));
709         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_PERCENT_LIMIT, new Pair<>(
710                 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY));
711         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_STATE, new Pair<>(
712                 Car.PERMISSION_ENERGY, null));
713         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_SWITCH, new Pair<>(
714                 Car.PERMISSION_ENERGY, Car.PERMISSION_CONTROL_CAR_ENERGY));
715         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_TIME_REMAINING, new Pair<>(
716                 Car.PERMISSION_ENERGY, null));
717         mHalPropIdToPermissions.put(VehicleProperty.EV_REGENERATIVE_BRAKING_STATE, new Pair<>(
718                 Car.PERMISSION_ENERGY, null));
719         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_PORT_OPEN, new Pair<>(
720                 Car.PERMISSION_ENERGY_PORTS,
721                 Car.PERMISSION_CONTROL_ENERGY_PORTS));
722         mHalPropIdToPermissions.put(VehicleProperty.EV_CHARGE_PORT_CONNECTED, new Pair<>(
723                 Car.PERMISSION_ENERGY_PORTS,
724                 null));
725         mHalPropIdToPermissions.put(VehicleProperty.EV_BATTERY_INSTANTANEOUS_CHARGE_RATE,
726                 new Pair<>(Car.PERMISSION_ENERGY, null));
727         mHalPropIdToPermissions.put(VehicleProperty.RANGE_REMAINING, new Pair<>(
728                 Car.PERMISSION_ENERGY,
729                 Car.PERMISSION_ADJUST_RANGE_REMAINING));
730         mHalPropIdToPermissions.put(VehicleProperty.TIRE_PRESSURE, new Pair<>(
731                 Car.PERMISSION_TIRES,
732                 null));
733         mHalPropIdToPermissions.put(VehicleProperty.CRITICALLY_LOW_TIRE_PRESSURE, new Pair<>(
734                 Car.PERMISSION_TIRES,
735                 null));
736         mHalPropIdToPermissions.put(VehicleProperty.PERF_STEERING_ANGLE, new Pair<>(
737                 Car.PERMISSION_READ_STEERING_STATE,
738                 null));
739         mHalPropIdToPermissions.put(VehicleProperty.PERF_REAR_STEERING_ANGLE, new Pair<>(
740                 Car.PERMISSION_READ_STEERING_STATE,
741                 null));
742         mHalPropIdToPermissions.put(VehicleProperty.GEAR_SELECTION, new Pair<>(
743                 Car.PERMISSION_POWERTRAIN,
744                 null));
745         mHalPropIdToPermissions.put(VehicleProperty.CURRENT_GEAR, new Pair<>(
746                 Car.PERMISSION_POWERTRAIN,
747                 null));
748         mHalPropIdToPermissions.put(VehicleProperty.PARKING_BRAKE_ON, new Pair<>(
749                 Car.PERMISSION_POWERTRAIN,
750                 null));
751         mHalPropIdToPermissions.put(VehicleProperty.PARKING_BRAKE_AUTO_APPLY, new Pair<>(
752                 Car.PERMISSION_POWERTRAIN,
753                 null));
754         mHalPropIdToPermissions.put(VehicleProperty.EV_BRAKE_REGENERATION_LEVEL, new Pair<>(
755                 Car.PERMISSION_POWERTRAIN,
756                 Car.PERMISSION_CONTROL_POWERTRAIN));
757         mHalPropIdToPermissions.put(VehicleProperty.EV_STOPPING_MODE, new Pair<>(
758                 Car.PERMISSION_POWERTRAIN,
759                 Car.PERMISSION_CONTROL_POWERTRAIN));
760         mHalPropIdToPermissions.put(VehicleProperty.FUEL_LEVEL_LOW, new Pair<>(
761                 Car.PERMISSION_ENERGY,
762                 null));
763         mHalPropIdToPermissions.put(VehicleProperty.NIGHT_MODE, new Pair<>(
764                 Car.PERMISSION_EXTERIOR_ENVIRONMENT,
765                 null));
766         mHalPropIdToPermissions.put(VehicleProperty.TURN_SIGNAL_STATE, new Pair<>(
767                 Car.PERMISSION_EXTERIOR_LIGHTS,
768                 null));
769         mHalPropIdToPermissions.put(VehicleProperty.IGNITION_STATE, new Pair<>(
770                 Car.PERMISSION_POWERTRAIN,
771                 null));
772         mHalPropIdToPermissions.put(VehicleProperty.ABS_ACTIVE, new Pair<>(
773                 Car.PERMISSION_CAR_DYNAMICS_STATE,
774                 null));
775         mHalPropIdToPermissions.put(VehicleProperty.TRACTION_CONTROL_ACTIVE, new Pair<>(
776                 Car.PERMISSION_CAR_DYNAMICS_STATE,
777                 null));
778         mHalPropIdToPermissions.put(VehicleProperty.ENV_OUTSIDE_TEMPERATURE, new Pair<>(
779                 Car.PERMISSION_EXTERIOR_ENVIRONMENT,
780                 null));
781         mHalPropIdToPermissions.put(VehicleProperty.HEADLIGHTS_STATE, new Pair<>(
782                 Car.PERMISSION_EXTERIOR_LIGHTS,
783                 null));
784         mHalPropIdToPermissions.put(VehicleProperty.HIGH_BEAM_LIGHTS_STATE, new Pair<>(
785                 Car.PERMISSION_EXTERIOR_LIGHTS,
786                 null));
787         mHalPropIdToPermissions.put(VehicleProperty.FOG_LIGHTS_STATE, new Pair<>(
788                 Car.PERMISSION_EXTERIOR_LIGHTS,
789                 null));
790         mHalPropIdToPermissions.put(VehicleProperty.FRONT_FOG_LIGHTS_STATE, new Pair<>(
791                 Car.PERMISSION_EXTERIOR_LIGHTS,
792                 null));
793         mHalPropIdToPermissions.put(VehicleProperty.REAR_FOG_LIGHTS_STATE, new Pair<>(
794                 Car.PERMISSION_EXTERIOR_LIGHTS,
795                 null));
796         mHalPropIdToPermissions.put(VehicleProperty.HAZARD_LIGHTS_STATE, new Pair<>(
797                 Car.PERMISSION_EXTERIOR_LIGHTS,
798                 null));
799         mHalPropIdToPermissions.put(VehicleProperty.HEADLIGHTS_SWITCH, new Pair<>(
800                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
801                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
802         mHalPropIdToPermissions.put(VehicleProperty.HIGH_BEAM_LIGHTS_SWITCH, new Pair<>(
803                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
804                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
805         mHalPropIdToPermissions.put(VehicleProperty.FOG_LIGHTS_SWITCH, new Pair<>(
806                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
807                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
808         mHalPropIdToPermissions.put(VehicleProperty.FRONT_FOG_LIGHTS_SWITCH, new Pair<>(
809                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
810                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
811         mHalPropIdToPermissions.put(VehicleProperty.REAR_FOG_LIGHTS_SWITCH, new Pair<>(
812                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
813                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
814         mHalPropIdToPermissions.put(VehicleProperty.HAZARD_LIGHTS_SWITCH, new Pair<>(
815                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS,
816                 Car.PERMISSION_CONTROL_EXTERIOR_LIGHTS));
817         mHalPropIdToPermissions.put(VehicleProperty.READING_LIGHTS_STATE, new Pair<>(
818                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
819                 null));
820         mHalPropIdToPermissions.put(VehicleProperty.CABIN_LIGHTS_STATE, new Pair<>(
821                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
822                 null));
823         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_LIGHTS_STATE, new Pair<>(
824                 Car.PERMISSION_READ_INTERIOR_LIGHTS,
825                 null));
826         mHalPropIdToPermissions.put(VehicleProperty.READING_LIGHTS_SWITCH, new Pair<>(
827                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
828                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
829         mHalPropIdToPermissions.put(VehicleProperty.CABIN_LIGHTS_SWITCH, new Pair<>(
830                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
831                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
832         mHalPropIdToPermissions.put(VehicleProperty.STEERING_WHEEL_LIGHTS_SWITCH, new Pair<>(
833                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
834                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
835         mHalPropIdToPermissions.put(VehicleProperty.ANDROID_EPOCH_TIME, new Pair<>(
836                 null,
837                 Car.PERMISSION_CAR_EPOCH_TIME));
838         mHalPropIdToPermissions.put(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_ENABLED, new Pair<>(
839                 Car.PERMISSION_READ_ADAS_SETTINGS,
840                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
841         mHalPropIdToPermissions.put(VehicleProperty.AUTOMATIC_EMERGENCY_BRAKING_STATE, new Pair<>(
842                 Car.PERMISSION_READ_ADAS_STATES,
843                 null));
844         mHalPropIdToPermissions.put(VehicleProperty.FORWARD_COLLISION_WARNING_ENABLED, new Pair<>(
845                 Car.PERMISSION_READ_ADAS_SETTINGS,
846                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
847         mHalPropIdToPermissions.put(VehicleProperty.FORWARD_COLLISION_WARNING_STATE, new Pair<>(
848                 Car.PERMISSION_READ_ADAS_STATES,
849                 null));
850         mHalPropIdToPermissions.put(VehicleProperty.BLIND_SPOT_WARNING_ENABLED, new Pair<>(
851                 Car.PERMISSION_READ_ADAS_SETTINGS,
852                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
853         mHalPropIdToPermissions.put(VehicleProperty.BLIND_SPOT_WARNING_STATE, new Pair<>(
854                 Car.PERMISSION_READ_ADAS_STATES,
855                 null));
856         mHalPropIdToPermissions.put(VehicleProperty.LANE_DEPARTURE_WARNING_ENABLED, new Pair<>(
857                 Car.PERMISSION_READ_ADAS_SETTINGS,
858                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
859         mHalPropIdToPermissions.put(VehicleProperty.LANE_DEPARTURE_WARNING_STATE, new Pair<>(
860                 Car.PERMISSION_READ_ADAS_STATES,
861                 null));
862         mHalPropIdToPermissions.put(VehicleProperty.LANE_KEEP_ASSIST_ENABLED, new Pair<>(
863                 Car.PERMISSION_READ_ADAS_SETTINGS,
864                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
865         mHalPropIdToPermissions.put(VehicleProperty.LANE_KEEP_ASSIST_STATE, new Pair<>(
866                 Car.PERMISSION_READ_ADAS_STATES,
867                 null));
868         mHalPropIdToPermissions.put(VehicleProperty.LANE_CENTERING_ASSIST_ENABLED, new Pair<>(
869                 Car.PERMISSION_READ_ADAS_SETTINGS,
870                 Car.PERMISSION_CONTROL_ADAS_SETTINGS));
871         mHalPropIdToPermissions.put(VehicleProperty.LANE_CENTERING_ASSIST_COMMAND, new Pair<>(
872                 null,
873                 Car.PERMISSION_CONTROL_ADAS_STATES));
874         mHalPropIdToPermissions.put(VehicleProperty.LANE_CENTERING_ASSIST_STATE, new Pair<>(
875                 Car.PERMISSION_READ_ADAS_STATES,
876                 null));
877 
878         // Display_Units
879         mHalPropIdToPermissions.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, new Pair<>(
880                 Car.PERMISSION_READ_DISPLAY_UNITS,
881                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
882         mHalPropIdsForUnits.add(VehicleProperty.DISTANCE_DISPLAY_UNITS);
883         mHalPropIdToPermissions.put(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS, new Pair<>(
884                 Car.PERMISSION_READ_DISPLAY_UNITS,
885                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
886         mHalPropIdsForUnits.add(VehicleProperty.FUEL_VOLUME_DISPLAY_UNITS);
887         mHalPropIdToPermissions.put(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS, new Pair<>(
888                 Car.PERMISSION_READ_DISPLAY_UNITS,
889                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
890         mHalPropIdsForUnits.add(VehicleProperty.TIRE_PRESSURE_DISPLAY_UNITS);
891         mHalPropIdToPermissions.put(VehicleProperty.EV_BATTERY_DISPLAY_UNITS, new Pair<>(
892                 Car.PERMISSION_READ_DISPLAY_UNITS,
893                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
894         mHalPropIdsForUnits.add(VehicleProperty.EV_BATTERY_DISPLAY_UNITS);
895         mHalPropIdToPermissions.put(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME,
896                 new Pair<>(Car.PERMISSION_READ_DISPLAY_UNITS,
897                         Car.PERMISSION_CONTROL_DISPLAY_UNITS));
898         mHalPropIdsForUnits.add(VehicleProperty.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME);
899         mHalPropIdToPermissions.put(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS, new Pair<>(
900                 Car.PERMISSION_READ_DISPLAY_UNITS,
901                 Car.PERMISSION_CONTROL_DISPLAY_UNITS));
902         mHalPropIdsForUnits.add(VehicleProperty.VEHICLE_SPEED_DISPLAY_UNITS);
903 
904         mHalPropIdToPermissions.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_TYPE,
905                 new Pair<>(Car.PERMISSION_CAR_INFO, null));
906         mHalPropIdToPermissions.put(VehicleProperty.ELECTRONIC_TOLL_COLLECTION_CARD_STATUS,
907                 new Pair<>(Car.PERMISSION_CAR_INFO, null));
908         mHalPropIdToPermissions.put(VehicleProperty.VEHICLE_CURB_WEIGHT, new Pair<>(
909                 Car.PERMISSION_PRIVILEGED_CAR_INFO, null));
910         mHalPropIdToPermissions.put(VehicleProperty.TRAILER_PRESENT, new Pair<>(
911                 Car.PERMISSION_PRIVILEGED_CAR_INFO, null));
912         mHalPropIdToPermissions.put(
913                 VehicleProperty.GENERAL_SAFETY_REGULATION_COMPLIANCE_REQUIREMENT,
914                 new Pair<>(Car.PERMISSION_CAR_INFO, null));
915         mHalPropIdToPermissions.put(VehicleProperty.LOCATION_CHARACTERIZATION, new Pair<>(
916                 ACCESS_FINE_LOCATION,
917                 null));
918 
919         // mPropToValidBitFlag contains all properties which return values are combinations of bits
920         mHalPropIdToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE,
921                 HVAC_FAN_DIRECTION_COMBINATIONS);
922         mHalPropIdToValidBitFlag.put(VehicleProperty.HVAC_FAN_DIRECTION,
923                 HVAC_FAN_DIRECTION_COMBINATIONS);
924         mHalPropIdToValidBitFlag.put(VehicleProperty.LOCATION_CHARACTERIZATION,
925                 LOCATION_CHARACTERIZATION);
926     }
927 
928     /**
929      * @param propId Property ID
930      * @return Read permission string for given property ID. NULL if property ID does not exist or
931      * the property is not available for reading.
932      */
933     @Nullable
getReadPermission(int propId)934     public String getReadPermission(int propId) {
935         Pair<String, String> p = mHalPropIdToPermissions.get(propId);
936         if (p != null) {
937             // Property ID exists.  Return read permission.
938             if (p.first == null) {
939                 Slogf.e(TAG, "propId is not available for reading : 0x" + toHexString(propId));
940             }
941             return p.first;
942         } else if (isVendorProperty(propId)) {
943             // if property is vendor property and do not have specific permission.
944             return Car.PERMISSION_VENDOR_EXTENSION;
945         } else {
946             return null;
947         }
948     }
949 
950     /**
951      * @param propId Property ID
952      * @return Write permission string for given property ID. NULL if property ID does not exist or
953      * the property is not writable.
954      */
955     @Nullable
getWritePermission(int propId)956     public String getWritePermission(int propId) {
957         Pair<String, String> p = mHalPropIdToPermissions.get(propId);
958         if (p != null) {
959             // Property ID exists.  Return write permission.
960             if (p.second == null) {
961                 Slogf.e(TAG, "propId is not writable : 0x" + toHexString(propId));
962             }
963             return p.second;
964         } else if (isVendorProperty(propId)) {
965             // if property is vendor property and do not have specific permission.
966             return Car.PERMISSION_VENDOR_EXTENSION;
967         } else {
968             return null;
969         }
970     }
971 
isVendorProperty(int propId)972     private static boolean isVendorProperty(int propId) {
973         return (propId & VehiclePropertyGroup.MASK) == VehiclePropertyGroup.VENDOR;
974     }
975     /**
976      * Check if property ID is in the list of known IDs that PropertyHalService is interested it.
977      */
isSupportedProperty(int propId)978     public boolean isSupportedProperty(int propId) {
979         // Property is in the list of supported properties
980         return mHalPropIdToPermissions.get(propId) != null || isVendorProperty(propId);
981     }
982 
983     /**
984      * Returns all possible supported enum values for the {@code halPropId}. If property does not
985      * support an enum, then it returns {@code null}.
986      */
987     @Nullable
getAllPossibleSupportedEnumValues(int halPropId)988     public static Set<Integer> getAllPossibleSupportedEnumValues(int halPropId) {
989         return HAL_PROP_ID_TO_ENUM_SET.contains(halPropId)
990                 ? Collections.unmodifiableSet(HAL_PROP_ID_TO_ENUM_SET.get(halPropId)) : null;
991     }
992 
993     /**
994      * Check if the property is one of display units properties.
995      */
isPropertyToChangeUnits(int propertyId)996     public boolean isPropertyToChangeUnits(int propertyId) {
997         return mHalPropIdsForUnits.contains(propertyId);
998     }
999 
1000     /**
1001      * Overrides the permission map for vendor properties
1002      *
1003      * @param configArray the configArray for
1004      * {@link VehicleProperty#SUPPORT_CUSTOMIZE_VENDOR_PERMISSION}
1005      */
customizeVendorPermission(@onNull int[] configArray)1006     public void customizeVendorPermission(@NonNull int[] configArray) {
1007         if (configArray == null || configArray.length % 3 != 0) {
1008             throw new IllegalArgumentException(
1009                     "ConfigArray for SUPPORT_CUSTOMIZE_VENDOR_PERMISSION is wrong");
1010         }
1011         int index = 0;
1012         while (index < configArray.length) {
1013             int propId = configArray[index++];
1014             if (!isVendorProperty(propId)) {
1015                 throw new IllegalArgumentException("Property Id: " + propId
1016                         + " is not in vendor range");
1017             }
1018             int readPermission = configArray[index++];
1019             int writePermission = configArray[index++];
1020             mHalPropIdToPermissions.put(propId, new Pair<>(
1021                     toPermissionString(readPermission, propId),
1022                     toPermissionString(writePermission, propId)));
1023         }
1024 
1025     }
1026 
1027     /**
1028      * Map VehicleVendorPermission enums in VHAL to android permissions.
1029      *
1030      * @return permission string, return null if vendor property is not available.
1031      */
1032     @Nullable
toPermissionString(int permissionEnum, int propId)1033     private String toPermissionString(int permissionEnum, int propId) {
1034         switch (permissionEnum) {
1035             case PERMISSION_CAR_VENDOR_DEFAULT:
1036                 return Car.PERMISSION_VENDOR_EXTENSION;
1037             case PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW:
1038                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_WINDOW;
1039             case PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW:
1040                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_WINDOW;
1041             case PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR:
1042                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_DOOR;
1043             case PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR:
1044                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_DOOR;
1045             case PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT:
1046                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_SEAT;
1047             case PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT:
1048                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_SEAT;
1049             case PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR:
1050                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_MIRROR;
1051             case PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR:
1052                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_MIRROR;
1053             case PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO:
1054                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_INFO;
1055             case PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO:
1056                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_INFO;
1057             case PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE:
1058                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_ENGINE;
1059             case PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE:
1060                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_ENGINE;
1061             case PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC:
1062                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_HVAC;
1063             case PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC:
1064                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_HVAC;
1065             case PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT:
1066                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_LIGHT;
1067             case PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT:
1068                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_LIGHT;
1069             case PERMISSION_SET_CAR_VENDOR_CATEGORY_1:
1070                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_1;
1071             case PERMISSION_GET_CAR_VENDOR_CATEGORY_1:
1072                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_1;
1073             case PERMISSION_SET_CAR_VENDOR_CATEGORY_2:
1074                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_2;
1075             case PERMISSION_GET_CAR_VENDOR_CATEGORY_2:
1076                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_2;
1077             case PERMISSION_SET_CAR_VENDOR_CATEGORY_3:
1078                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_3;
1079             case PERMISSION_GET_CAR_VENDOR_CATEGORY_3:
1080                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_3;
1081             case PERMISSION_SET_CAR_VENDOR_CATEGORY_4:
1082                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_4;
1083             case PERMISSION_GET_CAR_VENDOR_CATEGORY_4:
1084                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_4;
1085             case PERMISSION_SET_CAR_VENDOR_CATEGORY_5:
1086                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_5;
1087             case PERMISSION_GET_CAR_VENDOR_CATEGORY_5:
1088                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_5;
1089             case PERMISSION_SET_CAR_VENDOR_CATEGORY_6:
1090                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_6;
1091             case PERMISSION_GET_CAR_VENDOR_CATEGORY_6:
1092                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_6;
1093             case PERMISSION_SET_CAR_VENDOR_CATEGORY_7:
1094                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_7;
1095             case PERMISSION_GET_CAR_VENDOR_CATEGORY_7:
1096                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_7;
1097             case PERMISSION_SET_CAR_VENDOR_CATEGORY_8:
1098                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_8;
1099             case PERMISSION_GET_CAR_VENDOR_CATEGORY_8:
1100                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_8;
1101             case PERMISSION_SET_CAR_VENDOR_CATEGORY_9:
1102                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_9;
1103             case PERMISSION_GET_CAR_VENDOR_CATEGORY_9:
1104                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_9;
1105             case PERMISSION_SET_CAR_VENDOR_CATEGORY_10:
1106                 return VehicleVendorPermission.PERMISSION_SET_CAR_VENDOR_CATEGORY_10;
1107             case PERMISSION_GET_CAR_VENDOR_CATEGORY_10:
1108                 return VehicleVendorPermission.PERMISSION_GET_CAR_VENDOR_CATEGORY_10;
1109             case PERMISSION_CAR_VENDOR_NOT_ACCESSIBLE:
1110                 return null;
1111             default:
1112                 throw new IllegalArgumentException("permission Id: " + permissionEnum
1113                         + " for property:" + propId + " is invalid vendor permission Id");
1114         }
1115     }
1116 
1117     /**
1118      * Checks property value's format for all properties. Checks property value range if property
1119      * has @data_enum flag in types.hal.
1120      * @return true if property value's payload is valid.
1121      */
checkPayload(HalPropValue propValue)1122     public boolean checkPayload(HalPropValue propValue) {
1123         int propId = propValue.getPropId();
1124         // Mixed property uses config array to indicate the data format. Checked it when convert it
1125         // to CarPropertyValue.
1126         if ((propId & VehiclePropertyType.MASK) == VehiclePropertyType.MIXED) {
1127             return true;
1128         }
1129         if (propValue.getStatus() != VehiclePropertyStatus.AVAILABLE) {
1130             return true;
1131         }
1132         if (!checkFormatForAllProperties(propValue)) {
1133             Slogf.e(TAG, "Property value" + propValue + "has an invalid data format");
1134             return false;
1135         }
1136         if (HAL_PROP_ID_TO_ENUM_SET.contains(propId)) {
1137             return checkDataEnum(propValue);
1138         }
1139         if (mHalPropIdToValidBitFlag.indexOfKey(propId) >= 0) {
1140             return checkValidBitFlag(propValue);
1141         }
1142         return true;
1143     }
1144 
checkValidBitFlag(HalPropValue propValue)1145     private boolean checkValidBitFlag(HalPropValue propValue) {
1146         int flagCombination = mHalPropIdToValidBitFlag.get(propValue.getPropId());
1147         for (int i = 0; i < propValue.getInt32ValuesSize(); i++) {
1148             int value = propValue.getInt32Value(i);
1149             if ((value & flagCombination) != value) {
1150                 return false;
1151             }
1152         }
1153         return true;
1154     }
1155 
checkFormatForAllProperties(HalPropValue propValue)1156     private boolean checkFormatForAllProperties(HalPropValue propValue) {
1157         int propId = propValue.getPropId();
1158         //Records sum size of int32values, floatValue, int64Values, bytes, String
1159         int sizeOfAllValue = propValue.getInt32ValuesSize() + propValue.getFloatValuesSize()
1160                 + propValue.getInt64ValuesSize() + propValue.getByteValuesSize()
1161                 + propValue.getStringValue().length();
1162         if (sizeOfAllValue == 0) {
1163             Slogf.e(TAG, "Property value is empty: " + propValue);
1164             return false;
1165         }
1166         switch (propId & VehiclePropertyType.MASK) {
1167             case VehiclePropertyType.BOOLEAN:
1168             case VehiclePropertyType.INT32:
1169                 return sizeOfAllValue == 1 && propValue.getInt32ValuesSize() == 1;
1170             case VehiclePropertyType.FLOAT:
1171                 return sizeOfAllValue == 1 && propValue.getFloatValuesSize() == 1;
1172             case VehiclePropertyType.INT64:
1173                 return sizeOfAllValue == 1 && propValue.getInt64ValuesSize() == 1;
1174             case VehiclePropertyType.FLOAT_VEC:
1175                 return sizeOfAllValue == propValue.getFloatValuesSize();
1176             case VehiclePropertyType.INT64_VEC:
1177                 return sizeOfAllValue == propValue.getInt64ValuesSize();
1178             case VehiclePropertyType.INT32_VEC:
1179                 return sizeOfAllValue == propValue.getInt32ValuesSize();
1180             case VehiclePropertyType.BYTES:
1181                 return sizeOfAllValue == propValue.getByteValuesSize();
1182             case VehiclePropertyType.STRING:
1183                 return sizeOfAllValue == propValue.getStringValue().length();
1184             default:
1185                 throw new IllegalArgumentException("Unexpected property type for propId: "
1186                         + Integer.toHexString(propId));
1187         }
1188     }
checkDataEnum(HalPropValue propValue)1189     private boolean checkDataEnum(HalPropValue propValue) {
1190         int propId = propValue.getPropId();
1191         Set<Integer> validValue = HAL_PROP_ID_TO_ENUM_SET.get(propId);
1192         for (int i = 0; i < propValue.getInt32ValuesSize(); i++) {
1193             if (!validValue.contains(propValue.getInt32Value(i))) {
1194                 return false;
1195             }
1196         }
1197         return true;
1198     }
1199 
getIntegersFromDataEnums(Class... clazz)1200     private static List<Integer> getIntegersFromDataEnums(Class... clazz) {
1201         List<Integer> integerList = new ArrayList<>(5);
1202         for (Class c: clazz) {
1203             Field[] fields = c.getDeclaredFields();
1204             for (Field f : fields) {
1205                 if (f.getType() == int.class) {
1206                     try {
1207                         integerList.add(f.getInt(c));
1208                     } catch (IllegalAccessException | RuntimeException e) {
1209                         Slogf.w(TAG, "Failed to get value");
1210                     }
1211                 }
1212             }
1213         }
1214         return integerList;
1215     }
1216 
1217     // Generate all combinations at once
generateAllCombination(Class clazz)1218     private static int generateAllCombination(Class clazz) {
1219         List<Integer> allBits = getIntegersFromDataEnums(clazz);
1220         int combination = allBits.get(0);
1221         for (int i = 1; i < allBits.size(); i++) {
1222             combination |= allBits.get(i);
1223         }
1224         return combination;
1225     }
1226 }
1227