Merge "Cache CarPropertyConfigs in CarPropertyService" into pi-dev
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index 8a380ff..57975a2 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -73,6 +73,126 @@
     ctor public CarNotConnectedException(java.lang.Exception);
   }
 
+  public final class VehiclePropertyIds {
+    ctor public VehiclePropertyIds();
+    method public static java.lang.String toString(int);
+    field public static final int ABS_ACTIVE = 287310858; // 0x1120040a
+    field public static final int AP_POWER_BOOTUP_REASON = 289409538; // 0x11400a02
+    field public static final int AP_POWER_STATE_REPORT = 289475073; // 0x11410a01
+    field public static final int AP_POWER_STATE_REQ = 289475072; // 0x11410a00
+    field public static final int CURRENT_GEAR = 289408001; // 0x11400401
+    field public static final int DISPLAY_BRIGHTNESS = 289409539; // 0x11400a03
+    field public static final int DOOR_LOCK = 371198722; // 0x16200b02
+    field public static final int DOOR_MOVE = 373295873; // 0x16400b01
+    field public static final int DOOR_POS = 373295872; // 0x16400b00
+    field public static final int ENGINE_COOLANT_TEMP = 291504897; // 0x11600301
+    field public static final int ENGINE_OIL_LEVEL = 289407747; // 0x11400303
+    field public static final int ENGINE_OIL_TEMP = 291504900; // 0x11600304
+    field public static final int ENGINE_RPM = 291504901; // 0x11600305
+    field public static final int ENV_OUTSIDE_TEMPERATURE = 291505923; // 0x11600703
+    field public static final int EV_BATTERY_INSTANTANEOUS_CHARGE_RATE = 291504908; // 0x1160030c
+    field public static final int EV_BATTERY_LEVEL = 291504905; // 0x11600309
+    field public static final int EV_CHARGE_PORT_CONNECTED = 287310603; // 0x1120030b
+    field public static final int EV_CHARGE_PORT_OPEN = 287310602; // 0x1120030a
+    field public static final int FOG_LIGHTS_STATE = 289410562; // 0x11400e02
+    field public static final int FOG_LIGHTS_SWITCH = 289410578; // 0x11400e12
+    field public static final int FUEL_DOOR_OPEN = 287310600; // 0x11200308
+    field public static final int FUEL_LEVEL = 291504903; // 0x11600307
+    field public static final int FUEL_LEVEL_LOW = 287310853; // 0x11200405
+    field public static final int GEAR_SELECTION = 289408000; // 0x11400400
+    field public static final int HAZARD_LIGHTS_STATE = 289410563; // 0x11400e03
+    field public static final int HAZARD_LIGHTS_SWITCH = 289410579; // 0x11400e13
+    field public static final int HEADLIGHTS_STATE = 289410560; // 0x11400e00
+    field public static final int HEADLIGHTS_SWITCH = 289410576; // 0x11400e10
+    field public static final int HIGH_BEAM_LIGHTS_STATE = 289410561; // 0x11400e01
+    field public static final int HIGH_BEAM_LIGHTS_SWITCH = 289410577; // 0x11400e11
+    field public static final int HVAC_ACTUAL_FAN_SPEED_RPM = 356517135; // 0x1540050f
+    field public static final int HVAC_AC_ON = 354419973; // 0x15200505
+    field public static final int HVAC_AUTO_ON = 354419978; // 0x1520050a
+    field public static final int HVAC_AUTO_RECIRC_ON = 354419986; // 0x15200512
+    field public static final int HVAC_DEFROSTER = 320865540; // 0x13200504
+    field public static final int HVAC_DUAL_ON = 354419977; // 0x15200509
+    field public static final int HVAC_FAN_DIRECTION = 356517121; // 0x15400501
+    field public static final int HVAC_FAN_DIRECTION_AVAILABLE = 356582673; // 0x15410511
+    field public static final int HVAC_FAN_SPEED = 356517120; // 0x15400500
+    field public static final int HVAC_MAX_AC_ON = 354419974; // 0x15200506
+    field public static final int HVAC_MAX_DEFROST_ON = 354419975; // 0x15200507
+    field public static final int HVAC_POWER_ON = 354419984; // 0x15200510
+    field public static final int HVAC_RECIRC_ON = 354419976; // 0x15200508
+    field public static final int HVAC_SEAT_TEMPERATURE = 356517131; // 0x1540050b
+    field public static final int HVAC_SEAT_VENTILATION = 356517139; // 0x15400513
+    field public static final int HVAC_SIDE_MIRROR_HEAT = 339739916; // 0x1440050c
+    field public static final int HVAC_STEERING_WHEEL_HEAT = 289408269; // 0x1140050d
+    field public static final int HVAC_TEMPERATURE_CURRENT = 358614274; // 0x15600502
+    field public static final int HVAC_TEMPERATURE_DISPLAY_UNITS = 289408270; // 0x1140050e
+    field public static final int HVAC_TEMPERATURE_SET = 358614275; // 0x15600503
+    field public static final int HW_KEY_INPUT = 289475088; // 0x11410a10
+    field public static final int IGNITION_STATE = 289408009; // 0x11400409
+    field public static final int INFO_DRIVER_SEAT = 356516106; // 0x1540010a
+    field public static final int INFO_EV_BATTERY_CAPACITY = 291504390; // 0x11600106
+    field public static final int INFO_EV_CONNECTOR_TYPE = 289472775; // 0x11410107
+    field public static final int INFO_EV_PORT_LOCATION = 289407241; // 0x11400109
+    field public static final int INFO_FUEL_CAPACITY = 291504388; // 0x11600104
+    field public static final int INFO_FUEL_DOOR_LOCATION = 289407240; // 0x11400108
+    field public static final int INFO_FUEL_TYPE = 289472773; // 0x11410105
+    field public static final int INFO_MAKE = 286261505; // 0x11100101
+    field public static final int INFO_MODEL = 286261506; // 0x11100102
+    field public static final int INFO_MODEL_YEAR = 289407235; // 0x11400103
+    field public static final int INFO_VIN = 286261504; // 0x11100100
+    field public static final int INVALID = 0; // 0x0
+    field public static final int MIRROR_FOLD = 287312709; // 0x11200b45
+    field public static final int MIRROR_LOCK = 287312708; // 0x11200b44
+    field public static final int MIRROR_Y_MOVE = 339741507; // 0x14400b43
+    field public static final int MIRROR_Y_POS = 339741506; // 0x14400b42
+    field public static final int MIRROR_Z_MOVE = 339741505; // 0x14400b41
+    field public static final int MIRROR_Z_POS = 339741504; // 0x14400b40
+    field public static final int NIGHT_MODE = 287310855; // 0x11200407
+    field public static final int OBD2_FREEZE_FRAME = 299896065; // 0x11e00d01
+    field public static final int OBD2_FREEZE_FRAME_CLEAR = 299896067; // 0x11e00d03
+    field public static final int OBD2_FREEZE_FRAME_INFO = 299896066; // 0x11e00d02
+    field public static final int OBD2_LIVE_FRAME = 299896064; // 0x11e00d00
+    field public static final int PARKING_BRAKE_AUTO_APPLY = 287310851; // 0x11200403
+    field public static final int PARKING_BRAKE_ON = 287310850; // 0x11200402
+    field public static final int PERF_ODOMETER = 291504644; // 0x11600204
+    field public static final int PERF_VEHICLE_SPEED = 291504647; // 0x11600207
+    field public static final int RANGE_REMAINING = 291504904; // 0x11600308
+    field public static final int SEAT_BACKREST_ANGLE_1_MOVE = 356518792; // 0x15400b88
+    field public static final int SEAT_BACKREST_ANGLE_1_POS = 356518791; // 0x15400b87
+    field public static final int SEAT_BACKREST_ANGLE_2_MOVE = 356518794; // 0x15400b8a
+    field public static final int SEAT_BACKREST_ANGLE_2_POS = 356518793; // 0x15400b89
+    field public static final int SEAT_BELT_BUCKLED = 354421634; // 0x15200b82
+    field public static final int SEAT_BELT_HEIGHT_MOVE = 356518788; // 0x15400b84
+    field public static final int SEAT_BELT_HEIGHT_POS = 356518787; // 0x15400b83
+    field public static final int SEAT_DEPTH_MOVE = 356518798; // 0x15400b8e
+    field public static final int SEAT_DEPTH_POS = 356518797; // 0x15400b8d
+    field public static final int SEAT_FORE_AFT_MOVE = 356518790; // 0x15400b86
+    field public static final int SEAT_FORE_AFT_POS = 356518789; // 0x15400b85
+    field public static final int SEAT_HEADREST_ANGLE_MOVE = 356518808; // 0x15400b98
+    field public static final int SEAT_HEADREST_ANGLE_POS = 356518807; // 0x15400b97
+    field public static final int SEAT_HEADREST_FORE_AFT_MOVE = 356518810; // 0x15400b9a
+    field public static final int SEAT_HEADREST_FORE_AFT_POS = 356518809; // 0x15400b99
+    field public static final int SEAT_HEADREST_HEIGHT_MOVE = 356518806; // 0x15400b96
+    field public static final int SEAT_HEADREST_HEIGHT_POS = 289409941; // 0x11400b95
+    field public static final int SEAT_HEIGHT_MOVE = 356518796; // 0x15400b8c
+    field public static final int SEAT_HEIGHT_POS = 356518795; // 0x15400b8b
+    field public static final int SEAT_LUMBAR_FORE_AFT_MOVE = 356518802; // 0x15400b92
+    field public static final int SEAT_LUMBAR_FORE_AFT_POS = 356518801; // 0x15400b91
+    field public static final int SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 356518804; // 0x15400b94
+    field public static final int SEAT_LUMBAR_SIDE_SUPPORT_POS = 356518803; // 0x15400b93
+    field public static final int SEAT_MEMORY_SELECT = 356518784; // 0x15400b80
+    field public static final int SEAT_MEMORY_SET = 356518785; // 0x15400b81
+    field public static final int SEAT_TILT_MOVE = 356518800; // 0x15400b90
+    field public static final int SEAT_TILT_POS = 356518799; // 0x15400b8f
+    field public static final int TIRE_PRESSURE = 392168201; // 0x17600309
+    field public static final int TRACTION_CONTROL_ACTIVE = 287310859; // 0x1120040b
+    field public static final int TURN_SIGNAL_STATE = 289408008; // 0x11400408
+    field public static final int VEHICLE_MAP_SERVICE = 299895808; // 0x11e00c00
+    field public static final int WHEEL_TICK = 290521862; // 0x11510306
+    field public static final int WINDOW_LOCK = 320867268; // 0x13200bc4
+    field public static final int WINDOW_MOVE = 322964417; // 0x13400bc1
+    field public static final int WINDOW_POS = 322964416; // 0x13400bc0
+  }
+
 }
 
 package android.car.app.menu {
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index d611932..df6b85e 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -5,7 +5,6 @@
     field public static final java.lang.String CAR_DRIVING_STATE_SERVICE = "drivingstate";
     field public static final java.lang.String DIAGNOSTIC_SERVICE = "diagnostic";
     field public static final java.lang.String HVAC_SERVICE = "hvac";
-    field public static final java.lang.String PERMISSION_ADJUST_CAR_CABIN = "android.car.permission.ADJUST_CAR_CABIN";
     field public static final java.lang.String PERMISSION_CAR_DIAGNOSTIC_CLEAR = "android.car.permission.CLEAR_CAR_DIAGNOSTICS";
     field public static final java.lang.String PERMISSION_CAR_DIAGNOSTIC_READ_ALL = "android.car.permission.CAR_DIAGNOSTICS";
     field public static final java.lang.String PERMISSION_CAR_DRIVING_STATE = "android.car.permission.CAR_DRIVING_STATE";
@@ -112,6 +111,13 @@
     field public static final int WINDOW_ROW_3_RIGHT = 16384; // 0x4000
   }
 
+  public final class VehiclePropertyAccess {
+    field public static final int NONE = 0; // 0x0
+    field public static final int READ = 1; // 0x1
+    field public static final int READ_WRITE = 3; // 0x3
+    field public static final int WRITE = 2; // 0x2
+  }
+
 }
 
 package android.car.cluster {
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index 738a423..c1bf502 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -281,14 +281,6 @@
             "android.car.permission.CONTROL_APP_BLOCKING";
 
     /**
-     * Permission necessary to access Car Cabin APIs.
-     * @hide
-     */
-    @SystemApi
-    public static final String PERMISSION_ADJUST_CAR_CABIN =
-            "android.car.permission.ADJUST_CAR_CABIN";
-
-    /**
      * Permission necessary to access car's engine information.
      * @hide
      */
diff --git a/car-lib/src/android/car/PortLocationType.java b/car-lib/src/android/car/PortLocationType.java
new file mode 100644
index 0000000..3006a29
--- /dev/null
+++ b/car-lib/src/android/car/PortLocationType.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car;
+
+/**
+ * Used by INFO_FUEL_DOOR_LOCATION/INFO_CHARGE_PORT_LOCATION to enumerate fuel door or
+ * ev port location.
+ * Use getProperty and setProperty in {@link android.car.hardware.property.CarPropertyManager} to
+ * set and get this VHAL property.
+ * @hide
+ */
+public final class PortLocationType {
+    public static final int UNKNOWN = 0;
+    public static final int FRONT_LEFT = 1;
+    public static final int FRONT_RIGHT = 2;
+    public static final int REAR_RIGHT = 3;
+    public static final int REAR_LEFT = 4;
+    public static final int FRONT = 5;
+    public static final int REAR = 6;
+
+    private PortLocationType() {}
+}
diff --git a/car-lib/src/android/car/VehicleLightState.java b/car-lib/src/android/car/VehicleLightState.java
new file mode 100644
index 0000000..55f74f9
--- /dev/null
+++ b/car-lib/src/android/car/VehicleLightState.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car;
+
+/**
+ * Used by Lights state properties to enumerate the current state of the lights.
+ * Use getProperty and setProperty in {@link android.car.hardware.property.CarPropertyManager} to
+ * set and get this VHAL property.
+ * @hide
+ */
+public final class VehicleLightState {
+    public static final int OFF = 0;
+    public static final int ON = 1;
+    public static final int DAYTIME_RUNNING = 2;
+
+    private VehicleLightState() {}
+
+}
diff --git a/car-lib/src/android/car/VehicleLightSwitch.java b/car-lib/src/android/car/VehicleLightSwitch.java
new file mode 100644
index 0000000..03780bb
--- /dev/null
+++ b/car-lib/src/android/car/VehicleLightSwitch.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car;
+
+/**
+ * Used by lights switch properties to enumerate user selected switch setting.
+ * Use getProperty and setProperty in {@link android.car.hardware.property.CarPropertyManager} to
+ * set and get this VHAL property.
+ * @hide
+ */
+public final class VehicleLightSwitch {
+    public static final int OFF = 0;
+    public static final int ON = 1;
+    public static final int DAYTIME_RUNNING = 2;
+    public static final int AUTOMATIC = 0x100;
+
+    private VehicleLightSwitch() {}
+}
diff --git a/car-lib/src/android/car/VehiclePropertyAccess.java b/car-lib/src/android/car/VehiclePropertyAccess.java
new file mode 100644
index 0000000..22801de
--- /dev/null
+++ b/car-lib/src/android/car/VehiclePropertyAccess.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car;
+
+import android.annotation.SystemApi;
+
+/**
+ * Define value for getAccess() in {@link android.car.hardware.CarPropertyConfig}
+ * @hide
+ */
+@SystemApi
+public final class VehiclePropertyAccess {
+    /**
+     * List of VehiclePropertyAccess from VHAL
+     */
+    public static final int NONE = 0x00;
+    public static final int READ = 0x01;
+    public static final int WRITE = 0x02;
+    public static final int READ_WRITE = 0x03;
+
+    private VehiclePropertyAccess() {}
+}
diff --git a/car-lib/src/android/car/VehiclePropertyIds.java b/car-lib/src/android/car/VehiclePropertyIds.java
new file mode 100644
index 0000000..12d2698
--- /dev/null
+++ b/car-lib/src/android/car/VehiclePropertyIds.java
@@ -0,0 +1,888 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car;
+
+/**
+ * Copy from android.hardware.automotive.vehicle-V2.0-java_gen_java/gen/android/hardware/automotive
+ * /vehicle/V2_0. Need to update this file when vehicle propertyId is changed in VHAL.
+ * Use it as PorpertyId in getProperty() and setProperty() in
+ * {@link android.car.hardware.property.CarPropertyManager}
+ */
+public final class VehiclePropertyIds {
+    /**
+     * Undefined property.  */
+    public static final int INVALID = 0;
+    /**
+     * VIN of vehicle
+     */
+    public static final int INFO_VIN = 286261504;
+    /**
+     * Manufacturer of vehicle
+     */
+    public static final int INFO_MAKE = 286261505;
+    /**
+     * Model of vehicle
+     */
+    public static final int INFO_MODEL = 286261506;
+    /**
+     * Model year of vehicle.
+     */
+    public static final int INFO_MODEL_YEAR = 289407235;
+    /**
+     * Fuel capacity of the vehicle in milliliters
+     */
+    public static final int INFO_FUEL_CAPACITY = 291504388;
+    /**
+     * List of fuels the vehicle may use
+     */
+    public static final int INFO_FUEL_TYPE = 289472773;
+    /**
+     * Battery capacity of the vehicle, if EV or hybrid.  This is the nominal
+     * battery capacity when the vehicle is new.
+     */
+    public static final int INFO_EV_BATTERY_CAPACITY = 291504390;
+    /**
+     * List of connectors this EV may use
+     */
+    public static final int INFO_EV_CONNECTOR_TYPE = 289472775;
+    /**
+     * Fuel door location
+     */
+    public static final int INFO_FUEL_DOOR_LOCATION = 289407240;
+    /**
+     * EV port location
+     */
+    public static final int INFO_EV_PORT_LOCATION = 289407241;
+    /**
+     * Driver's seat location
+     */
+    public static final int INFO_DRIVER_SEAT = 356516106;
+    /**
+     * Current odometer value of the vehicle
+     */
+    public static final int PERF_ODOMETER = 291504644;
+    /**
+     * Speed of the vehicle
+     */
+    public static final int PERF_VEHICLE_SPEED = 291504647;
+    /**
+     * Temperature of engine coolant
+     */
+    public static final int ENGINE_COOLANT_TEMP = 291504897;
+    /**
+     * Engine oil level
+     */
+    public static final int ENGINE_OIL_LEVEL = 289407747;
+    /**
+     * Temperature of engine oil
+     */
+    public static final int ENGINE_OIL_TEMP = 291504900;
+    /**
+     * Engine rpm
+     */
+    public static final int ENGINE_RPM = 291504901;
+    /**
+     * Reports wheel ticks
+     */
+    public static final int WHEEL_TICK = 290521862;
+    /**
+     * Fuel remaining in the the vehicle, in milliliters
+     */
+    public static final int FUEL_LEVEL = 291504903;
+    /**
+     * Fuel door open
+     */
+    public static final int FUEL_DOOR_OPEN = 287310600;
+    /**
+     * EV battery level in WH, if EV or hybrid
+     */
+    public static final int EV_BATTERY_LEVEL = 291504905;
+    /**
+     * EV charge port open
+     */
+    public static final int EV_CHARGE_PORT_OPEN = 287310602;
+    /**
+     * EV charge port connected
+     */
+    public static final int EV_CHARGE_PORT_CONNECTED = 287310603;
+    /**
+     * EV instantaneous charge rate in milliwatts
+     */
+    public static final int EV_BATTERY_INSTANTANEOUS_CHARGE_RATE = 291504908;
+    /**
+     * Range remaining
+     */
+    public static final int RANGE_REMAINING = 291504904;
+    /**
+     * Tire pressure
+     *
+     * min/max value indicates tire pressure sensor range.  Each tire will have a separate min/max
+     * value denoted by its areaConfig.areaId.
+     */
+    public static final int TIRE_PRESSURE = 392168201;
+    /**
+     * Currently selected gear
+     *
+     * This is the gear selected by the user.
+     */
+    public static final int GEAR_SELECTION = 289408000;
+    /**
+     * Current gear. In non-manual case, selected gear may not
+     * match the current gear. For example, if the selected gear is GEAR_DRIVE,
+     * the current gear will be one of GEAR_1, GEAR_2 etc, which reflects
+     * the actual gear the transmission is currently running in.
+     */
+    public static final int CURRENT_GEAR = 289408001;
+    /**
+     * Parking brake state.
+     */
+    public static final int PARKING_BRAKE_ON = 287310850;
+    /**
+     * Auto-apply parking brake.
+     */
+    public static final int PARKING_BRAKE_AUTO_APPLY = 287310851;
+    /**
+     * Warning for fuel low level.
+     */
+    public static final int FUEL_LEVEL_LOW = 287310853;
+    /**
+     * Night mode
+     */
+    public static final int NIGHT_MODE = 287310855;
+    /**
+     * State of the vehicles turn signals
+     */
+    public static final int TURN_SIGNAL_STATE = 289408008;
+    /**
+     * Represents ignition state
+     */
+    public static final int IGNITION_STATE = 289408009;
+    /**
+     * ABS is active
+     */
+    public static final int ABS_ACTIVE = 287310858;
+    /**
+     * Traction Control is active
+     */
+    public static final int TRACTION_CONTROL_ACTIVE = 287310859;
+    /**
+     * Fan speed setting
+     */
+    public static final int HVAC_FAN_SPEED = 356517120;
+    /**
+     * Fan direction setting
+     */
+    public static final int HVAC_FAN_DIRECTION = 356517121;
+    /**
+     * HVAC current temperature.
+     */
+    public static final int HVAC_TEMPERATURE_CURRENT = 358614274;
+    /**
+     * HVAC, target temperature set.
+     */
+    public static final int HVAC_TEMPERATURE_SET = 358614275;
+    /**
+     * On/off defrost for designated window
+     */
+    public static final int HVAC_DEFROSTER = 320865540;
+    /**
+     * On/off AC for designated areaId
+     */
+    public static final int HVAC_AC_ON = 354419973;
+    /**
+     * On/off max AC
+     */
+    public static final int HVAC_MAX_AC_ON = 354419974;
+    /**
+     * On/off max defrost
+     */
+    public static final int HVAC_MAX_DEFROST_ON = 354419975;
+    /**
+     * Recirculation on/off
+     */
+    public static final int HVAC_RECIRC_ON = 354419976;
+    /**
+     * Enable temperature coupling between areas.
+     */
+    public static final int HVAC_DUAL_ON = 354419977;
+    /**
+     * On/off automatic mode
+     */
+    public static final int HVAC_AUTO_ON = 354419978;
+    /**
+     * Seat heating/cooling
+     *
+     */
+    public static final int HVAC_SEAT_TEMPERATURE = 356517131;
+    /**
+     * Side Mirror Heat
+     */
+    public static final int HVAC_SIDE_MIRROR_HEAT = 339739916;
+    /**
+     * Steering Wheel Heating/Cooling
+     */
+    public static final int HVAC_STEERING_WHEEL_HEAT = 289408269;
+    /**
+     * Temperature units for display
+     */
+    public static final int HVAC_TEMPERATURE_DISPLAY_UNITS = 289408270;
+    /**
+     * Actual fan speed
+     */
+    public static final int HVAC_ACTUAL_FAN_SPEED_RPM = 356517135;
+    /**
+     * Represents global power state for HVAC. Setting this property to false
+     * MAY mark some properties that control individual HVAC features/subsystems
+     * to UNAVAILABLE state. Setting this property to true MAY mark some
+     * properties that control individual HVAC features/subsystems to AVAILABLE
+     * state (unless any/all of them are UNAVAILABLE on their own individual
+     * merits).
+     */
+    public static final int HVAC_POWER_ON = 354419984;
+    /**
+     * Fan Positions Available
+     */
+    public static final int HVAC_FAN_DIRECTION_AVAILABLE = 356582673;
+    /**
+     * Automatic recirculation on/off
+     */
+    public static final int HVAC_AUTO_RECIRC_ON = 354419986;
+    /**
+     * Seat ventilation
+     */
+    public static final int HVAC_SEAT_VENTILATION = 356517139;
+    /**
+     * Outside temperature
+     */
+    public static final int ENV_OUTSIDE_TEMPERATURE = 291505923;
+    /**
+     * Property to control power state of application processor
+     *
+     * It is assumed that AP's power state is controller by separate power
+     * controller.
+     */
+    public static final int AP_POWER_STATE_REQ = 289475072;
+    /**
+     * Property to report power state of application processor
+     *
+     * It is assumed that AP's power state is controller by separate power
+     * controller.
+     */
+    public static final int AP_POWER_STATE_REPORT = 289475073;
+    /**
+     * Property to report bootup reason for the current power on. This is a
+     * static property that will not change for the whole duration until power
+     * off. For example, even if user presses power on button after automatic
+     * power on with door unlock, bootup reason must stay with
+     * VehicleApPowerBootupReason#USER_UNLOCK.
+     */
+    public static final int AP_POWER_BOOTUP_REASON = 289409538;
+    /**
+     * Property to represent brightness of the display. Some cars have single
+     * control for the brightness of all displays and this property is to share
+     * change in that control.
+     */
+    public static final int DISPLAY_BRIGHTNESS = 289409539;
+    /**
+     * Property to feed H/W input events to android
+     */
+    public static final int HW_KEY_INPUT = 289475088;
+    /**
+     * Door position
+     *
+     * This is an integer in case a door may be set to a particular position.
+     * Max value indicates fully open, min value (0) indicates fully closed.
+     */
+    public static final int DOOR_POS = 373295872;
+    /**
+     * Door move
+     */
+    public static final int DOOR_MOVE = 373295873;
+    /**
+     * Door lock
+     */
+    public static final int DOOR_LOCK = 371198722;
+    /**
+     * Mirror Z Position
+     */
+    public static final int MIRROR_Z_POS = 339741504;
+    /**
+     * Mirror Z Move
+     */
+    public static final int MIRROR_Z_MOVE = 339741505;
+    /**
+     * Mirror Y Position
+     */
+    public static final int MIRROR_Y_POS = 339741506;
+    /**
+     * Mirror Y Move
+     */
+    public static final int MIRROR_Y_MOVE = 339741507;
+    /**
+     * Mirror Lock
+     */
+    public static final int MIRROR_LOCK = 287312708;
+    /**
+     * Mirror Fold
+     */
+    public static final int MIRROR_FOLD = 287312709;
+    /**
+     * Seat memory select
+     *
+     * This parameter selects the memory preset to use to select the seat
+     * position. The minValue is always 0, and the maxValue determines the
+     * number of seat positions available.
+     */
+    public static final int SEAT_MEMORY_SELECT = 356518784;
+    /**
+     * Seat memory set
+     *
+     * This setting allows the user to save the current seat position settings
+     * into the selected preset slot.  The maxValue for each seat position
+     * must match the maxValue for SEAT_MEMORY_SELECT.
+     */
+    public static final int SEAT_MEMORY_SET = 356518785;
+    /**
+     * Seatbelt buckled
+     *
+     * True indicates belt is buckled.
+     */
+    public static final int SEAT_BELT_BUCKLED = 354421634;
+    /**
+     * Seatbelt height position
+     */
+    public static final int SEAT_BELT_HEIGHT_POS = 356518787;
+    /**
+     * Seatbelt height move
+     */
+    public static final int SEAT_BELT_HEIGHT_MOVE = 356518788;
+    /**
+     * Seat fore/aft position
+     */
+    public static final int SEAT_FORE_AFT_POS = 356518789;
+    /**
+     * Seat fore/aft move
+     */
+    public static final int SEAT_FORE_AFT_MOVE = 356518790;
+    /**
+     * Seat backrest angle 1 position
+     */
+    public static final int SEAT_BACKREST_ANGLE_1_POS = 356518791;
+    /**
+     * Seat backrest angle 1 move
+     *
+     * Moves the backrest forward or recline.
+     */
+    public static final int SEAT_BACKREST_ANGLE_1_MOVE = 356518792;
+    /**
+     * Seat backrest angle 2 position
+     */
+    public static final int SEAT_BACKREST_ANGLE_2_POS = 356518793;
+    /**
+     * Seat backrest angle 2 move
+     */
+    public static final int SEAT_BACKREST_ANGLE_2_MOVE = 356518794;
+    /**
+     * Seat height position
+     */
+    public static final int SEAT_HEIGHT_POS = 356518795;
+    /**
+     * Seat height move
+     */
+    public static final int SEAT_HEIGHT_MOVE = 356518796;
+    /**
+     * Seat depth position
+     */
+    public static final int SEAT_DEPTH_POS = 356518797;
+    /**
+     * Seat depth move
+     */
+    public static final int SEAT_DEPTH_MOVE = 356518798;
+    /**
+     * Seat tilt position
+     */
+    public static final int SEAT_TILT_POS = 356518799;
+    /**
+     * Seat tilt move
+     */
+    public static final int SEAT_TILT_MOVE = 356518800;
+    /**
+     * Lumber fore/aft position
+     */
+    public static final int SEAT_LUMBAR_FORE_AFT_POS = 356518801;
+    /**
+     * Lumbar fore/aft move
+     */
+    public static final int SEAT_LUMBAR_FORE_AFT_MOVE = 356518802;
+    /**
+     * Lumbar side support position
+     */
+    public static final int SEAT_LUMBAR_SIDE_SUPPORT_POS = 356518803;
+    /**
+     * Lumbar side support move
+     */
+    public static final int SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 356518804;
+    /**
+     * Headrest height position
+     */
+    public static final int SEAT_HEADREST_HEIGHT_POS = 289409941;
+    /**
+     * Headrest height move
+     */
+    public static final int SEAT_HEADREST_HEIGHT_MOVE = 356518806;
+    /**
+     * Headrest angle position
+     */
+    public static final int SEAT_HEADREST_ANGLE_POS = 356518807;
+    /**
+     * Headrest angle move
+     */
+    public static final int SEAT_HEADREST_ANGLE_MOVE = 356518808;
+    /**
+     * Headrest fore/aft position
+     */
+    public static final int SEAT_HEADREST_FORE_AFT_POS = 356518809;
+    /**
+     * Headrest fore/aft move
+     */
+    public static final int SEAT_HEADREST_FORE_AFT_MOVE = 356518810;
+    /**
+     * Window Position
+     */
+    public static final int WINDOW_POS = 322964416;
+    /**
+     * Window Move
+     */
+    public static final int WINDOW_MOVE = 322964417;
+    /**
+     * Window Lock
+     */
+    public static final int WINDOW_LOCK = 320867268;
+    /**
+     * Vehicle Maps Service (VMS) message
+     */
+    public static final int VEHICLE_MAP_SERVICE = 299895808;
+    /**
+     * OBD2 Live Sensor Data
+     *
+     * Reports a snapshot of the current (live) values of the OBD2 sensors available.
+     */
+    public static final int OBD2_LIVE_FRAME = 299896064;
+    /**
+     * OBD2 Freeze Frame Sensor Data
+     *
+     * Reports a snapshot of the value of the OBD2 sensors available at the time that a fault
+     * occurred and was detected.
+     */
+    public static final int OBD2_FREEZE_FRAME = 299896065;
+    /**
+     * OBD2 Freeze Frame Information
+     */
+    public static final int OBD2_FREEZE_FRAME_INFO = 299896066;
+    /**
+     * OBD2 Freeze Frame Clear
+     *
+     * This property allows deletion of any of the freeze frames stored in
+     * vehicle memory, as described by OBD2_FREEZE_FRAME_INFO.
+     */
+    public static final int OBD2_FREEZE_FRAME_CLEAR = 299896067;
+    /**
+     * Headlights State
+     */
+    public static final int HEADLIGHTS_STATE = 289410560;
+    /**
+     * High beam lights state
+     */
+    public static final int HIGH_BEAM_LIGHTS_STATE = 289410561;
+    /**
+     * Fog light state
+     */
+    public static final int FOG_LIGHTS_STATE = 289410562;
+    /**
+     * Hazard light status
+     */
+    public static final int HAZARD_LIGHTS_STATE = 289410563;
+    /**
+     * Headlight switch
+     */
+    public static final int HEADLIGHTS_SWITCH = 289410576;
+    /**
+     * High beam light switch
+     */
+    public static final int HIGH_BEAM_LIGHTS_SWITCH = 289410577;
+    /**
+     * Fog light switch
+     */
+    public static final int FOG_LIGHTS_SWITCH = 289410578;
+    /**
+     * Hazard light switch
+     */
+    public static final int HAZARD_LIGHTS_SWITCH = 289410579;
+
+    /**
+     * @param o Integer
+     * @return String
+     */
+    public static  String toString(int o) {
+        if (o == INVALID) {
+            return "INVALID";
+        }
+        if (o == INFO_VIN) {
+            return "INFO_VIN";
+        }
+        if (o == INFO_MAKE) {
+            return "INFO_MAKE";
+        }
+        if (o == INFO_MODEL) {
+            return "INFO_MODEL";
+        }
+        if (o == INFO_MODEL_YEAR) {
+            return "INFO_MODEL_YEAR";
+        }
+        if (o == INFO_FUEL_CAPACITY) {
+            return "INFO_FUEL_CAPACITY";
+        }
+        if (o == INFO_FUEL_TYPE) {
+            return "INFO_FUEL_TYPE";
+        }
+        if (o == INFO_EV_BATTERY_CAPACITY) {
+            return "INFO_EV_BATTERY_CAPACITY";
+        }
+        if (o == INFO_EV_CONNECTOR_TYPE) {
+            return "INFO_EV_CONNECTOR_TYPE";
+        }
+        if (o == INFO_FUEL_DOOR_LOCATION) {
+            return "INFO_FUEL_DOOR_LOCATION";
+        }
+        if (o == INFO_EV_PORT_LOCATION) {
+            return "INFO_EV_PORT_LOCATION";
+        }
+        if (o == INFO_DRIVER_SEAT) {
+            return "INFO_DRIVER_SEAT";
+        }
+        if (o == PERF_ODOMETER) {
+            return "PERF_ODOMETER";
+        }
+        if (o == PERF_VEHICLE_SPEED) {
+            return "PERF_VEHICLE_SPEED";
+        }
+        if (o == ENGINE_COOLANT_TEMP) {
+            return "ENGINE_COOLANT_TEMP";
+        }
+        if (o == ENGINE_OIL_LEVEL) {
+            return "ENGINE_OIL_LEVEL";
+        }
+        if (o == ENGINE_OIL_TEMP) {
+            return "ENGINE_OIL_TEMP";
+        }
+        if (o == ENGINE_RPM) {
+            return "ENGINE_RPM";
+        }
+        if (o == WHEEL_TICK) {
+            return "WHEEL_TICK";
+        }
+        if (o == FUEL_LEVEL) {
+            return "FUEL_LEVEL";
+        }
+        if (o == FUEL_DOOR_OPEN) {
+            return "FUEL_DOOR_OPEN";
+        }
+        if (o == EV_BATTERY_LEVEL) {
+            return "EV_BATTERY_LEVEL";
+        }
+        if (o == EV_CHARGE_PORT_OPEN) {
+            return "EV_CHARGE_PORT_OPEN";
+        }
+        if (o == EV_CHARGE_PORT_CONNECTED) {
+            return "EV_CHARGE_PORT_CONNECTED";
+        }
+        if (o == EV_BATTERY_INSTANTANEOUS_CHARGE_RATE) {
+            return "EV_BATTERY_INSTANTANEOUS_CHARGE_RATE";
+        }
+        if (o == RANGE_REMAINING) {
+            return "RANGE_REMAINING";
+        }
+        if (o == TIRE_PRESSURE) {
+            return "TIRE_PRESSURE";
+        }
+        if (o == GEAR_SELECTION) {
+            return "GEAR_SELECTION";
+        }
+        if (o == CURRENT_GEAR) {
+            return "CURRENT_GEAR";
+        }
+        if (o == PARKING_BRAKE_ON) {
+            return "PARKING_BRAKE_ON";
+        }
+        if (o == PARKING_BRAKE_AUTO_APPLY) {
+            return "PARKING_BRAKE_AUTO_APPLY";
+        }
+        if (o == FUEL_LEVEL_LOW) {
+            return "FUEL_LEVEL_LOW";
+        }
+        if (o == NIGHT_MODE) {
+            return "NIGHT_MODE";
+        }
+        if (o == TURN_SIGNAL_STATE) {
+            return "TURN_SIGNAL_STATE";
+        }
+        if (o == IGNITION_STATE) {
+            return "IGNITION_STATE";
+        }
+        if (o == ABS_ACTIVE) {
+            return "ABS_ACTIVE";
+        }
+        if (o == TRACTION_CONTROL_ACTIVE) {
+            return "TRACTION_CONTROL_ACTIVE";
+        }
+        if (o == HVAC_FAN_SPEED) {
+            return "HVAC_FAN_SPEED";
+        }
+        if (o == HVAC_FAN_DIRECTION) {
+            return "HVAC_FAN_DIRECTION";
+        }
+        if (o == HVAC_TEMPERATURE_CURRENT) {
+            return "HVAC_TEMPERATURE_CURRENT";
+        }
+        if (o == HVAC_TEMPERATURE_SET) {
+            return "HVAC_TEMPERATURE_SET";
+        }
+        if (o == HVAC_DEFROSTER) {
+            return "HVAC_DEFROSTER";
+        }
+        if (o == HVAC_AC_ON) {
+            return "HVAC_AC_ON";
+        }
+        if (o == HVAC_MAX_AC_ON) {
+            return "HVAC_MAX_AC_ON";
+        }
+        if (o == HVAC_MAX_DEFROST_ON) {
+            return "HVAC_MAX_DEFROST_ON";
+        }
+        if (o == HVAC_RECIRC_ON) {
+            return "HVAC_RECIRC_ON";
+        }
+        if (o == HVAC_DUAL_ON) {
+            return "HVAC_DUAL_ON";
+        }
+        if (o == HVAC_AUTO_ON) {
+            return "HVAC_AUTO_ON";
+        }
+        if (o == HVAC_SEAT_TEMPERATURE) {
+            return "HVAC_SEAT_TEMPERATURE";
+        }
+        if (o == HVAC_SIDE_MIRROR_HEAT) {
+            return "HVAC_SIDE_MIRROR_HEAT";
+        }
+        if (o == HVAC_STEERING_WHEEL_HEAT) {
+            return "HVAC_STEERING_WHEEL_HEAT";
+        }
+        if (o == HVAC_TEMPERATURE_DISPLAY_UNITS) {
+            return "HVAC_TEMPERATURE_DISPLAY_UNITS";
+        }
+        if (o == HVAC_ACTUAL_FAN_SPEED_RPM) {
+            return "HVAC_ACTUAL_FAN_SPEED_RPM";
+        }
+        if (o == HVAC_POWER_ON) {
+            return "HVAC_POWER_ON";
+        }
+        if (o == HVAC_FAN_DIRECTION_AVAILABLE) {
+            return "HVAC_FAN_DIRECTION_AVAILABLE";
+        }
+        if (o == HVAC_AUTO_RECIRC_ON) {
+            return "HVAC_AUTO_RECIRC_ON";
+        }
+        if (o == HVAC_SEAT_VENTILATION) {
+            return "HVAC_SEAT_VENTILATION";
+        }
+        if (o == ENV_OUTSIDE_TEMPERATURE) {
+            return "ENV_OUTSIDE_TEMPERATURE";
+        }
+        if (o == AP_POWER_STATE_REQ) {
+            return "AP_POWER_STATE_REQ";
+        }
+        if (o == AP_POWER_STATE_REPORT) {
+            return "AP_POWER_STATE_REPORT";
+        }
+        if (o == AP_POWER_BOOTUP_REASON) {
+            return "AP_POWER_BOOTUP_REASON";
+        }
+        if (o == DISPLAY_BRIGHTNESS) {
+            return "DISPLAY_BRIGHTNESS";
+        }
+        if (o == HW_KEY_INPUT) {
+            return "HW_KEY_INPUT";
+        }
+        if (o == DOOR_POS) {
+            return "DOOR_POS";
+        }
+        if (o == DOOR_MOVE) {
+            return "DOOR_MOVE";
+        }
+        if (o == DOOR_LOCK) {
+            return "DOOR_LOCK";
+        }
+        if (o == MIRROR_Z_POS) {
+            return "MIRROR_Z_POS";
+        }
+        if (o == MIRROR_Z_MOVE) {
+            return "MIRROR_Z_MOVE";
+        }
+        if (o == MIRROR_Y_POS) {
+            return "MIRROR_Y_POS";
+        }
+        if (o == MIRROR_Y_MOVE) {
+            return "MIRROR_Y_MOVE";
+        }
+        if (o == MIRROR_LOCK) {
+            return "MIRROR_LOCK";
+        }
+        if (o == MIRROR_FOLD) {
+            return "MIRROR_FOLD";
+        }
+        if (o == SEAT_MEMORY_SELECT) {
+            return "SEAT_MEMORY_SELECT";
+        }
+        if (o == SEAT_MEMORY_SET) {
+            return "SEAT_MEMORY_SET";
+        }
+        if (o == SEAT_BELT_BUCKLED) {
+            return "SEAT_BELT_BUCKLED";
+        }
+        if (o == SEAT_BELT_HEIGHT_POS) {
+            return "SEAT_BELT_HEIGHT_POS";
+        }
+        if (o == SEAT_BELT_HEIGHT_MOVE) {
+            return "SEAT_BELT_HEIGHT_MOVE";
+        }
+        if (o == SEAT_FORE_AFT_POS) {
+            return "SEAT_FORE_AFT_POS";
+        }
+        if (o == SEAT_FORE_AFT_MOVE) {
+            return "SEAT_FORE_AFT_MOVE";
+        }
+        if (o == SEAT_BACKREST_ANGLE_1_POS) {
+            return "SEAT_BACKREST_ANGLE_1_POS";
+        }
+        if (o == SEAT_BACKREST_ANGLE_1_MOVE) {
+            return "SEAT_BACKREST_ANGLE_1_MOVE";
+        }
+        if (o == SEAT_BACKREST_ANGLE_2_POS) {
+            return "SEAT_BACKREST_ANGLE_2_POS";
+        }
+        if (o == SEAT_BACKREST_ANGLE_2_MOVE) {
+            return "SEAT_BACKREST_ANGLE_2_MOVE";
+        }
+        if (o == SEAT_HEIGHT_POS) {
+            return "SEAT_HEIGHT_POS";
+        }
+        if (o == SEAT_HEIGHT_MOVE) {
+            return "SEAT_HEIGHT_MOVE";
+        }
+        if (o == SEAT_DEPTH_POS) {
+            return "SEAT_DEPTH_POS";
+        }
+        if (o == SEAT_DEPTH_MOVE) {
+            return "SEAT_DEPTH_MOVE";
+        }
+        if (o == SEAT_TILT_POS) {
+            return "SEAT_TILT_POS";
+        }
+        if (o == SEAT_TILT_MOVE) {
+            return "SEAT_TILT_MOVE";
+        }
+        if (o == SEAT_LUMBAR_FORE_AFT_POS) {
+            return "SEAT_LUMBAR_FORE_AFT_POS";
+        }
+        if (o == SEAT_LUMBAR_FORE_AFT_MOVE) {
+            return "SEAT_LUMBAR_FORE_AFT_MOVE";
+        }
+        if (o == SEAT_LUMBAR_SIDE_SUPPORT_POS) {
+            return "SEAT_LUMBAR_SIDE_SUPPORT_POS";
+        }
+        if (o == SEAT_LUMBAR_SIDE_SUPPORT_MOVE) {
+            return "SEAT_LUMBAR_SIDE_SUPPORT_MOVE";
+        }
+        if (o == SEAT_HEADREST_HEIGHT_POS) {
+            return "SEAT_HEADREST_HEIGHT_POS";
+        }
+        if (o == SEAT_HEADREST_HEIGHT_MOVE) {
+            return "SEAT_HEADREST_HEIGHT_MOVE";
+        }
+        if (o == SEAT_HEADREST_ANGLE_POS) {
+            return "SEAT_HEADREST_ANGLE_POS";
+        }
+        if (o == SEAT_HEADREST_ANGLE_MOVE) {
+            return "SEAT_HEADREST_ANGLE_MOVE";
+        }
+        if (o == SEAT_HEADREST_FORE_AFT_POS) {
+            return "SEAT_HEADREST_FORE_AFT_POS";
+        }
+        if (o == SEAT_HEADREST_FORE_AFT_MOVE) {
+            return "SEAT_HEADREST_FORE_AFT_MOVE";
+        }
+        if (o == WINDOW_POS) {
+            return "WINDOW_POS";
+        }
+        if (o == WINDOW_MOVE) {
+            return "WINDOW_MOVE";
+        }
+        if (o == WINDOW_LOCK) {
+            return "WINDOW_LOCK";
+        }
+        if (o == VEHICLE_MAP_SERVICE) {
+            return "VEHICLE_MAP_SERVICE";
+        }
+        if (o == OBD2_LIVE_FRAME) {
+            return "OBD2_LIVE_FRAME";
+        }
+        if (o == OBD2_FREEZE_FRAME) {
+            return "OBD2_FREEZE_FRAME";
+        }
+        if (o == OBD2_FREEZE_FRAME_INFO) {
+            return "OBD2_FREEZE_FRAME_INFO";
+        }
+        if (o == OBD2_FREEZE_FRAME_CLEAR) {
+            return "OBD2_FREEZE_FRAME_CLEAR";
+        }
+        if (o == HEADLIGHTS_STATE) {
+            return "HEADLIGHTS_STATE";
+        }
+        if (o == HIGH_BEAM_LIGHTS_STATE) {
+            return "HIGH_BEAM_LIGHTS_STATE";
+        }
+        if (o == FOG_LIGHTS_STATE) {
+            return "FOG_LIGHTS_STATE";
+        }
+        if (o == HAZARD_LIGHTS_STATE) {
+            return "HAZARD_LIGHTS_STATE";
+        }
+        if (o == HEADLIGHTS_SWITCH) {
+            return "HEADLIGHTS_SWITCH";
+        }
+        if (o == HIGH_BEAM_LIGHTS_SWITCH) {
+            return "HIGH_BEAM_LIGHTS_SWITCH";
+        }
+        if (o == FOG_LIGHTS_SWITCH) {
+            return "FOG_LIGHTS_SWITCH";
+        }
+        if (o == HAZARD_LIGHTS_SWITCH) {
+            return "HAZARD_LIGHTS_SWITCH";
+        }
+        return "0x" + Integer.toHexString(o);
+    }
+}
diff --git a/car-lib/src/android/car/drivingstate/CarUxRestrictions.java b/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
index c6c22bc..87dfa3a 100644
--- a/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
+++ b/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
@@ -24,30 +24,32 @@
 import java.lang.annotation.RetentionPolicy;
 
 /**
- * Car UX Restrictions event.  This contains information on the set of UX restrictions
- * that is in place due to the car's driving state.
+ * Car UX Restrictions event.  This contains information on the set of UX restrictions that is in
+ * place due to the car's driving state.
  * <p>
  * The restriction information is organized as follows:
  * <ul>
  * <li> When there are no restrictions in place, for example when the car is parked,
  * <ul>
- * <li> {@link #mRequiresDistractionOptimization} is set to false.  Apps can display activities
+ * <li> {@link #isRequiresDistractionOptimization()} returns false.  Apps can display activities
  * that are not distraction optimized.
- * <li> {@link #mActiveRestrictions} should contain UX_RESTRICTIONS_UNRESTRICTED.  Apps don't
- * have to check for this since {@code mRequiresDistractionOptimization} is false.
+ * <li> When {@link #isRequiresDistractionOptimization()} returns false, apps don't have to call
+ * {@link #getActiveRestrictions()}, since there is no distraction optimization required.
  * </ul>
  * <li> When the driving state changes, causing the UX restrictions to come in effect,
  * <ul>
- * <li> {@code mRequiresDistractionOptimization} is set to true.  Apps can only display
- * activities that are distraction optimized.  Distraction optimized activities follow the base
- * design guidelines that provide a distraction free driving user experience.
- * <li> In addition, apps will have to check for the content of mActiveRestrictions.
- * {@code mActiveRestrictions} will have additional granular information on the set of UX
- * restrictions that are in place for the current driving state.  The content of
- * {@code mActiveRestrictions}, for the same driving state of the vehicle, could vary depending
- * on the car maker and the market.  For example, when the car is idling, the set of active
- * UX restrictions contained in the {@code mActiveRestrictions} will depend on the car maker
- * and the safety standards of the market that the vehicle is deployed in.
+ * <li> {@link #isRequiresDistractionOptimization()} returns true.  Apps can only display activities
+ * that are distraction optimized.  Distraction optimized activities must follow the base design
+ * guidelines to ensure a distraction free driving experience for the user.
+ * <li> When {@link #isRequiresDistractionOptimization()} returns true, apps must call
+ * {@link #getActiveRestrictions()}, to get the currently active UX restrictions to adhere to.
+ * {@link #getActiveRestrictions()} provides additional information on the set of UX
+ * restrictions that are in place for the current driving state.
+ * <p>
+ * The UX restrictions returned by {@link #getActiveRestrictions()}, for the same driving state of
+ * the vehicle, could vary depending on the OEM and the market.  For example, when the car is
+ * idling, the set of active UX restrictions will depend on the car maker and the safety standards
+ * of the market that the vehicle is deployed in.
  * </ul>
  * </ul>
  * <p>
diff --git a/car-support-lib/proguard-release.flags b/car-support-lib/proguard-release.flags
index 91cab7e..4f5f917 100644
--- a/car-support-lib/proguard-release.flags
+++ b/car-support-lib/proguard-release.flags
@@ -7201,6 +7201,7 @@
     public int enabledSetting;
     public int flags;
     public int fullBackupContent;
+    public boolean hiddenUntilInstalled;
     public int installLocation;
     public int largestWidthLimitDp;
     public long longVersionCode;
@@ -7646,6 +7647,8 @@
     public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
     public abstract void setPermissionEnforced(java.lang.String, boolean);
     public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
+    public abstract void setSystemAppHiddenUntilInstalled(java.lang.String, boolean);
+    public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
     public abstract void setUpdateAvailable(java.lang.String, boolean);
     public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
     public abstract void systemReady();
@@ -8589,6 +8592,7 @@
     public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
     public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
     public static int MATCH_FACTORY_ONLY;
+    public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
     public static int MATCH_INSTANT;
     public static int MATCH_KNOWN_PACKAGES;
     public static int MATCH_STATIC_SHARED_LIBRARIES;
@@ -17003,8 +17007,8 @@
 
     public boolean equals(java.lang.Object);
     public static android.view.DisplayCutout fromBoundingRect(int, int, int, int);
-    public static android.view.DisplayCutout fromBounds(android.graphics.Path);
-    public static android.view.DisplayCutout fromResources(android.content.res.Resources, int, int);
+    public static android.view.DisplayCutout fromBounds(android.graphics.Region);
+    public static android.view.DisplayCutout fromResourcesRectApproximation(android.content.res.Resources, int, int);
     public static android.view.DisplayCutout fromSpec(java.lang.String, int, int, float);
     public java.util.List getBoundingRects();
     public android.graphics.Region getBounds();
diff --git a/car_product/sepolicy/private/carservice_app.te b/car_product/sepolicy/private/carservice_app.te
index d02c377..fa2577f 100644
--- a/car_product/sepolicy/private/carservice_app.te
+++ b/car_product/sepolicy/private/carservice_app.te
@@ -28,12 +28,14 @@
     input_method_service
     input_service
     location_service
+    media_session_service
     network_management_service
     power_service
     procfsinspector_service
     sensorservice_service
     surfaceflinger_service
     uimode_service
+    voiceinteraction_service
 }:service_manager find;
 
 # Read and write /data/data subdirectory.
diff --git a/evs/app/RenderDirectView.cpp b/evs/app/RenderDirectView.cpp
index 24eb485..f0d26e4 100644
--- a/evs/app/RenderDirectView.cpp
+++ b/evs/app/RenderDirectView.cpp
@@ -133,6 +133,9 @@
     glDisableVertexAttribArray(1);
 
 
+    // Now that everything is submitted, release our hold on the texture resource
+    detachRenderTarget();
+
     // Wait for the rendering to finish
     glFinish();
 
diff --git a/evs/app/RenderTopView.cpp b/evs/app/RenderTopView.cpp
index bff2b3c..80ccb11 100644
--- a/evs/app/RenderTopView.cpp
+++ b/evs/app/RenderTopView.cpp
@@ -212,6 +212,9 @@
     // Draw the car image
     renderCarTopView();
 
+    // Now that everythign is submitted, release our hold on the texture resource
+    detachRenderTarget();
+
     // Wait for the rendering to finish
     glFinish();
 
diff --git a/evs/sampleDriver/GlWrapper.cpp b/evs/sampleDriver/GlWrapper.cpp
index 3055ba0..fbd36a2 100644
--- a/evs/sampleDriver/GlWrapper.cpp
+++ b/evs/sampleDriver/GlWrapper.cpp
@@ -308,6 +308,11 @@
         return false;
     }
 
+    // Turn off mip-mapping for the created texture surface
+    // (the inbound camera imagery doesn't have MIPs)
+    glBindTexture(GL_TEXTURE_2D, mTextureMap);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glBindTexture(GL_TEXTURE_2D, 0);
 
     return true;
 }
diff --git a/evs/sampleDriver/ServiceNames.h b/evs/sampleDriver/ServiceNames.h
index 1178da5..6458b1b 100644
--- a/evs/sampleDriver/ServiceNames.h
+++ b/evs/sampleDriver/ServiceNames.h
@@ -13,5 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#ifndef ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_SERVICENAMES_H
+#define ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_SERVICENAMES_H
 
 const static char kEnumeratorServiceName[] = "EvsEnumeratorHw";
+
+#endif // ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_SERVICENAMES_H
diff --git a/evs/sampleDriver/VideoCapture.h b/evs/sampleDriver/VideoCapture.h
index f2d1175..63305b9 100644
--- a/evs/sampleDriver/VideoCapture.h
+++ b/evs/sampleDriver/VideoCapture.h
@@ -13,6 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#ifndef ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_VIDEOCAPTURE_H
+#define ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_VIDEOCAPTURE_H
+
 #include <atomic>
 #include <thread>
 #include <functional>
@@ -73,3 +76,4 @@
     };
 };
 
+#endif // ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_0_VIDEOCAPTURE_
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 5212448..870ed10 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -27,11 +27,6 @@
         android:description="@string/car_permission_desc"
         android:label="@string/car_permission_label" />
     <permission
-        android:name="android.car.permission.ADJUST_CAR_CABIN"
-        android:protectionLevel="system|signature"
-        android:label="@string/car_permission_label_cabin"
-        android:description="@string/car_permission_desc_cabin" />
-    <permission
         android:name="android.car.permission.CAR_ENERGY"
         android:permissionGroup="android.car.permission-group.CAR_MONITORING"
         android:protectionLevel="dangerous"
diff --git a/service/src/com/android/car/CarUxRestrictionsManagerService.java b/service/src/com/android/car/CarUxRestrictionsManagerService.java
index 23c4d32..b90939b 100644
--- a/service/src/com/android/car/CarUxRestrictionsManagerService.java
+++ b/service/src/com/android/car/CarUxRestrictionsManagerService.java
@@ -27,11 +27,17 @@
 import android.car.hardware.property.CarPropertyEvent;
 import android.car.hardware.property.ICarPropertyEventListener;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.os.Binder;
+import android.os.Build;
 import android.os.IBinder;
+import android.os.Process;
 import android.os.RemoteException;
 import android.util.Log;
 
+import com.android.internal.annotations.GuardedBy;
+
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
@@ -60,6 +66,9 @@
     private CarUxRestrictions mCurrentUxRestrictions;
     private float mCurrentMovingSpeed;
     private boolean mFallbackToDefaults;
+    // Flag to disable broadcasting UXR changes - for development purposes
+    @GuardedBy("this")
+    private boolean mUxRChangeBroadcastEnabled = true;
     // For dumpsys logging
     private final LinkedList<Utils.TransitionLog> mTransitionLogs = new LinkedList<>();
 
@@ -224,6 +233,42 @@
     }
 
     /**
+     * Enable/disable UX restrictions change broadcast blocking.
+     * Setting this to true will stop broadcasts of UX restriction change to listeners.
+     * This method works only on debug builds and the caller of this method needs to have the same
+     * signature of the car service.
+     *
+     */
+    public synchronized void setUxRChangeBroadcastEnabled(boolean enable) {
+        if (!isDebugBuild()) {
+            Log.e(TAG, "Cannot set UX restriction change broadcast.");
+            return;
+        }
+        // Check if the caller has the same signature as that of the car service.
+        if (mContext.getPackageManager().checkSignatures(Process.myUid(), Binder.getCallingUid())
+                != PackageManager.SIGNATURE_MATCH) {
+            throw new SecurityException(
+                    "Caller " + mContext.getPackageManager().getNameForUid(Binder.getCallingUid())
+                            + " does not have the right signature");
+        }
+        if (enable) {
+            // if enabling it back, send the current restrictions
+            mUxRChangeBroadcastEnabled = enable;
+            handleDispatchUxRestrictions(mDrivingStateService.getCurrentDrivingState().eventValue,
+                    getCurrentSpeed());
+        } else {
+            // fake parked state, so if the system is currently restricted, the restrictions are
+            // relaxed.
+            handleDispatchUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED, 0);
+            mUxRChangeBroadcastEnabled = enable;
+        }
+    }
+
+    private boolean isDebugBuild() {
+        return Build.IS_USERDEBUG || Build.IS_ENG;
+    }
+
+    /**
      * Class that holds onto client related information - listener interface, process that hosts the
      * binder object etc.
      * It also registers for death notifications of the host.
@@ -282,6 +327,9 @@
         writer.println(
                 "Requires DO? " + mCurrentUxRestrictions.isRequiresDistractionOptimization());
         writer.println("Current UXR: " + mCurrentUxRestrictions.getActiveRestrictions());
+        if (isDebugBuild()) {
+            writer.println("mUxRChangeBroadcastEnabled? " + mUxRChangeBroadcastEnabled);
+        }
         mHelper.dump(writer);
         writer.println("UX Restriction change log:");
         for (Utils.TransitionLog tlog : mTransitionLogs) {
@@ -377,6 +425,11 @@
      */
     private synchronized void handleDispatchUxRestrictions(@CarDrivingState int currentDrivingState,
             float speed) {
+        if (isDebugBuild() && !mUxRChangeBroadcastEnabled) {
+            Log.d(TAG, "Not dispatching UX Restriction due to setting");
+            return;
+        }
+
         CarUxRestrictions uxRestrictions;
         // Get UX restrictions from the parsed configuration XML or fall back to defaults if not
         // available.
@@ -428,7 +481,7 @@
                 break;
             case CarDrivingStateEvent.DRIVING_STATE_IDLING:
                 restrictions = CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
-                requiresOpt = true;
+                requiresOpt = false;
                 break;
             case CarDrivingStateEvent.DRIVING_STATE_MOVING:
             default:
diff --git a/service/src/com/android/car/CarUxRestrictionsServiceHelper.java b/service/src/com/android/car/CarUxRestrictionsServiceHelper.java
index 236d915..348d3be 100644
--- a/service/src/com/android/car/CarUxRestrictionsServiceHelper.java
+++ b/service/src/com/android/car/CarUxRestrictionsServiceHelper.java
@@ -83,6 +83,10 @@
     public boolean loadUxRestrictionsFromXml() throws IOException, XmlPullParserException {
         mRestrictionsMap.clear();
         XmlResourceParser parser = mContext.getResources().getXml(mXmlResource);
+        if (parser == null) {
+            Log.e(TAG, "Invalid Xml resource");
+            return  false;
+        }
         AttributeSet attrs = Xml.asAttributeSet(parser);
         int type;
         // Traverse till we get to the first tag
diff --git a/service/src/com/android/car/pm/CarPackageManagerService.java b/service/src/com/android/car/pm/CarPackageManagerService.java
index 3f3f051..ed51a78 100644
--- a/service/src/com/android/car/pm/CarPackageManagerService.java
+++ b/service/src/com/android/car/pm/CarPackageManagerService.java
@@ -46,6 +46,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.Process;
+import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.util.ArraySet;
 import android.util.Log;
@@ -541,8 +542,10 @@
         // Add the blocking overlay activity to the whitelist, since that needs to run in a
         // restricted state to communicate the reason an app was blocked.
         Set<String> defaultActivity = new ArraySet<>();
-        defaultActivity.add(mActivityBlockingActivity.getClassName());
-        configWhitelist.put(mActivityBlockingActivity.getPackageName(), defaultActivity);
+        if (mActivityBlockingActivity != null) {
+            defaultActivity.add(mActivityBlockingActivity.getClassName());
+            configWhitelist.put(mActivityBlockingActivity.getPackageName(), defaultActivity);
+        }
 
         List<PackageInfo> packages = mPackageManager.getInstalledPackages(
                 PackageManager.GET_SIGNATURES | PackageManager.GET_ACTIVITIES
@@ -678,6 +681,11 @@
         }
 
         for (String pkg : configBlacklist.keySet()) {
+            if (TextUtils.isEmpty(pkg)) {
+                // This means there is nothing to blacklist
+                Log.d(CarLog.TAG_PACKAGE, "Empty string in blacklist pkg");
+                continue;
+            }
             int flags = 0;
             PackageInfo pkgInfo;
             String[] activities;
@@ -688,7 +696,7 @@
                                 | PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
             } catch (NameNotFoundException e) {
-                Log.e(CarLog.TAG_PACKAGE, pkg + " not found to blacklist " + e);
+                Log.e(CarLog.TAG_PACKAGE, pkg + " not found to blacklist ", e);
                 continue;
             }
 
@@ -977,8 +985,18 @@
         }
     }
 
+    /**
+     * Enable/Disable activity blocking by correspondingly enabling/disabling broadcasting UXR
+     * changes in {@link CarUxRestrictionsManagerService}. This is only available in
+     * engineering builds for development convenience.
+     *
+     */
     @Override
     public synchronized void setEnableActivityBlocking(boolean enable) {
+        if (!isDebugBuild()) {
+            Log.e(CarLog.TAG_PACKAGE, "Cannot enable/disable activity blocking");
+            return;
+        }
         // Check if the caller has the same signature as that of the car service.
         if (mPackageManager.checkSignatures(Process.myUid(), Binder.getCallingUid())
                 != PackageManager.SIGNATURE_MATCH) {
@@ -986,7 +1004,7 @@
                     "Caller " + mPackageManager.getNameForUid(Binder.getCallingUid())
                             + " does not have the right signature");
         }
-        mEnableActivityBlocking = enable;
+        mCarUxRestrictionsService.setUxRChangeBroadcastEnabled(enable);
     }
 
     /**
diff --git a/service/src/com/android/car/user/CarUserService.java b/service/src/com/android/car/user/CarUserService.java
index c63a2fd..82e981f 100644
--- a/service/src/com/android/car/user/CarUserService.java
+++ b/service/src/com/android/car/user/CarUserService.java
@@ -44,7 +44,7 @@
 public class CarUserService extends BroadcastReceiver implements CarServiceBase {
     // Place holder for user name of the first user created.
     @VisibleForTesting
-    static final String OWNER_NAME = "Owner";
+    static final String OWNER_NAME = "Driver";
     private static final String TAG = "CarUserService";
     private final Context mContext;
     private final CarUserManagerHelper mCarUserManagerHelper;
diff --git a/tests/carservice_test/AndroidManifest.xml b/tests/carservice_test/AndroidManifest.xml
index 2be5a83..19a5552 100644
--- a/tests/carservice_test/AndroidManifest.xml
+++ b/tests/carservice_test/AndroidManifest.xml
@@ -19,7 +19,10 @@
 
     <uses-permission android:name="android.Manifest.permission.MODIFY_AUDIO_ROUTING" />
     <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
-    <uses-permission android:name="android.car.permission.ADJUST_CAR_CABIN" />
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_DOORS" />
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_WINDOWS" />
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_MIRRORS" />
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_SEATS" />
     <uses-permission android:name="android.car.permission.CAR_ENERGY" />
     <uses-permission android:name="android.car.permission.CONTROL_APP_BLOCKING" />
     <uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_VOLUME" />
diff --git a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
index 3a50b45..c63c980 100644
--- a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
@@ -173,7 +173,7 @@
     protected MockContext getCarServiceContext() throws NameNotFoundException {
         if (mMockContext == null) {
             mMockContext = new MockContext(getContext()
-                .createPackageContext("com.android.car", Context.CONTEXT_IGNORE_SECURITY));
+                .createPackageContext("com.android.car.test", Context.CONTEXT_IGNORE_SECURITY));
         }
         return mMockContext;
     }