// Signature format: 2.0
package android.car {

  public final class Car {
    method @Deprecated public void connect() throws java.lang.IllegalStateException;
    method @Deprecated public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection, @Nullable android.os.Handler);
    method @Deprecated public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection);
    method @Nullable public static android.car.Car createCar(android.content.Context);
    method @Nullable public static android.car.Car createCar(android.content.Context, @Nullable android.os.Handler);
    method public void disconnect();
    method public int getCarConnectionType();
    method @Nullable public Object getCarManager(String);
    method public boolean isConnected();
    method public boolean isConnecting();
    field public static final String APP_FOCUS_SERVICE = "app_focus";
    field public static final String AUDIO_SERVICE = "audio";
    field public static final String CAR_CONFIGURATION_SERVICE = "configuration";
    field public static final String CAR_EXTRA_MEDIA_PACKAGE = "android.car.intent.extra.MEDIA_PACKAGE";
    field public static final String CAR_INTENT_ACTION_MEDIA_TEMPLATE = "android.car.intent.action.MEDIA_TEMPLATE";
    field public static final String CAR_NAVIGATION_SERVICE = "car_navigation_service";
    field public static final String CAR_UX_RESTRICTION_SERVICE = "uxrestriction";
    field public static final int CONNECTION_TYPE_EMBEDDED = 5; // 0x5
    field public static final String INFO_SERVICE = "info";
    field public static final String PACKAGE_SERVICE = "package";
    field public static final String PERMISSION_CAR_CONTROL_AUDIO_SETTINGS = "android.car.permission.CAR_CONTROL_AUDIO_SETTINGS";
    field public static final String PERMISSION_CAR_CONTROL_AUDIO_VOLUME = "android.car.permission.CAR_CONTROL_AUDIO_VOLUME";
    field public static final String PERMISSION_CAR_INFO = "android.car.permission.CAR_INFO";
    field public static final String PERMISSION_CAR_NAVIGATION_MANAGER = "android.car.permission.CAR_NAVIGATION_MANAGER";
    field public static final String PERMISSION_CONTROL_DISPLAY_UNITS = "android.car.permission.CONTROL_CAR_DISPLAY_UNITS";
    field public static final String PERMISSION_CONTROL_INTERIOR_LIGHTS = "android.car.permission.CONTROL_CAR_INTERIOR_LIGHTS";
    field public static final String PERMISSION_ENERGY = "android.car.permission.CAR_ENERGY";
    field public static final String PERMISSION_ENERGY_PORTS = "android.car.permission.CAR_ENERGY_PORTS";
    field public static final String PERMISSION_EXTERIOR_ENVIRONMENT = "android.car.permission.CAR_EXTERIOR_ENVIRONMENT";
    field public static final String PERMISSION_IDENTIFICATION = "android.car.permission.CAR_IDENTIFICATION";
    field public static final String PERMISSION_POWERTRAIN = "android.car.permission.CAR_POWERTRAIN";
    field public static final String PERMISSION_READ_DISPLAY_UNITS = "android.car.permission.READ_CAR_DISPLAY_UNITS";
    field public static final String PERMISSION_READ_INTERIOR_LIGHTS = "android.car.permission.READ_CAR_INTERIOR_LIGHTS";
    field public static final String PERMISSION_READ_STEERING_STATE = "android.car.permission.READ_CAR_STEERING";
    field public static final String PERMISSION_SPEED = "android.car.permission.CAR_SPEED";
    field public static final String SENSOR_SERVICE = "sensor";
  }

  public final class CarAppFocusManager {
    method public void abandonAppFocus(android.car.CarAppFocusManager.OnAppFocusOwnershipCallback, int);
    method public void abandonAppFocus(android.car.CarAppFocusManager.OnAppFocusOwnershipCallback);
    method public void addFocusListener(android.car.CarAppFocusManager.OnAppFocusChangedListener, int);
    method public boolean isOwningFocus(android.car.CarAppFocusManager.OnAppFocusOwnershipCallback, int);
    method public void removeFocusListener(android.car.CarAppFocusManager.OnAppFocusChangedListener, int);
    method public void removeFocusListener(android.car.CarAppFocusManager.OnAppFocusChangedListener);
    method public int requestAppFocus(int, android.car.CarAppFocusManager.OnAppFocusOwnershipCallback);
    field public static final int APP_FOCUS_REQUEST_FAILED = 0; // 0x0
    field public static final int APP_FOCUS_REQUEST_SUCCEEDED = 1; // 0x1
    field public static final int APP_FOCUS_TYPE_NAVIGATION = 1; // 0x1
    field public static final int APP_FOCUS_TYPE_VOICE_COMMAND = 2; // 0x2
  }

  public static interface CarAppFocusManager.OnAppFocusChangedListener {
    method public void onAppFocusChanged(int, boolean);
  }

  public static interface CarAppFocusManager.OnAppFocusOwnershipCallback {
    method public void onAppFocusOwnershipGranted(int);
    method public void onAppFocusOwnershipLost(int);
  }

  public final class CarInfoManager {
    method public int getDriverSeat();
    method public float getEvBatteryCapacity();
    method public int[] getEvConnectorTypes();
    method public int getEvPortLocation();
    method public float getFuelCapacity();
    method public int getFuelDoorLocation();
    method public int[] getFuelTypes();
    method @NonNull public String getManufacturer();
    method @NonNull public String getModel();
    method @NonNull public String getModelYear();
    method @Deprecated public String getVehicleId();
  }

  @Deprecated public class CarNotConnectedException extends java.lang.RuntimeException {
    ctor @Deprecated public CarNotConnectedException();
    ctor @Deprecated public CarNotConnectedException(String);
    ctor @Deprecated public CarNotConnectedException(String, Throwable);
    ctor @Deprecated public CarNotConnectedException(Exception);
  }

  public final class EvConnectorType {
    field public static final int CHADEMO = 3; // 0x3
    field public static final int COMBO_1 = 4; // 0x4
    field public static final int COMBO_2 = 5; // 0x5
    field public static final int GBT = 9; // 0x9
    field public static final int J1772 = 1; // 0x1
    field public static final int MENNEKES = 2; // 0x2
    field public static final int OTHER = 101; // 0x65
    field public static final int TESLA_HPWC = 7; // 0x7
    field public static final int TESLA_ROADSTER = 6; // 0x6
    field public static final int TESLA_SUPERCHARGER = 8; // 0x8
    field public static final int UNKNOWN = 0; // 0x0
  }

  public final class FuelType {
    field public static final int BIODIESEL = 5; // 0x5
    field public static final int CNG = 8; // 0x8
    field public static final int DIESEL_1 = 3; // 0x3
    field public static final int DIESEL_2 = 4; // 0x4
    field public static final int E85 = 6; // 0x6
    field public static final int ELECTRIC = 10; // 0xa
    field public static final int HYDROGEN = 11; // 0xb
    field public static final int LEADED = 2; // 0x2
    field public static final int LNG = 9; // 0x9
    field public static final int LPG = 7; // 0x7
    field public static final int OTHER = 12; // 0xc
    field public static final int UNKNOWN = 0; // 0x0
    field public static final int UNLEADED = 1; // 0x1
  }

  public final class PortLocationType {
    field public static final int FRONT = 5; // 0x5
    field public static final int FRONT_LEFT = 1; // 0x1
    field public static final int FRONT_RIGHT = 2; // 0x2
    field public static final int REAR = 6; // 0x6
    field public static final int REAR_LEFT = 4; // 0x4
    field public static final int REAR_RIGHT = 3; // 0x3
    field public static final int UNKNOWN = 0; // 0x0
  }

  public final class VehicleAreaSeat {
    field public static final int SEAT_ROW_1_CENTER = 2; // 0x2
    field public static final int SEAT_ROW_1_LEFT = 1; // 0x1
    field public static final int SEAT_ROW_1_RIGHT = 4; // 0x4
    field public static final int SEAT_ROW_2_CENTER = 32; // 0x20
    field public static final int SEAT_ROW_2_LEFT = 16; // 0x10
    field public static final int SEAT_ROW_2_RIGHT = 64; // 0x40
    field public static final int SEAT_ROW_3_CENTER = 512; // 0x200
    field public static final int SEAT_ROW_3_LEFT = 256; // 0x100
    field public static final int SEAT_ROW_3_RIGHT = 1024; // 0x400
    field public static final int SEAT_UNKNOWN = 0; // 0x0
  }

  public final class VehicleAreaType {
    field public static final int VEHICLE_AREA_TYPE_DOOR = 4; // 0x4
    field public static final int VEHICLE_AREA_TYPE_GLOBAL = 0; // 0x0
    field public static final int VEHICLE_AREA_TYPE_MIRROR = 5; // 0x5
    field public static final int VEHICLE_AREA_TYPE_SEAT = 3; // 0x3
    field public static final int VEHICLE_AREA_TYPE_WHEEL = 6; // 0x6
    field public static final int VEHICLE_AREA_TYPE_WINDOW = 2; // 0x2
  }

  public final class VehiclePropertyIds {
    ctor public VehiclePropertyIds();
    method public static 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 CABIN_LIGHTS_STATE = 289410817; // 0x11400f01
    field public static final int CABIN_LIGHTS_SWITCH = 289410818; // 0x11400f02
    field public static final int CURRENT_GEAR = 289408001; // 0x11400401
    field public static final int DISPLAY_BRIGHTNESS = 289409539; // 0x11400a03
    field public static final int DISTANCE_DISPLAY_UNITS = 289408512; // 0x11400600
    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_DISPLAY_UNITS = 289408515; // 0x11400603
    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_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME = 287311364; // 0x11200604
    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 FUEL_VOLUME_DISPLAY_UNITS = 289408513; // 0x11400601
    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_STEERING_ANGLE = 291504649; // 0x11600209
    field public static final int PERF_VEHICLE_SPEED = 291504647; // 0x11600207
    field public static final int PERF_VEHICLE_SPEED_DISPLAY = 291504648; // 0x11600208
    field public static final int RANGE_REMAINING = 291504904; // 0x11600308
    field public static final int READING_LIGHTS_STATE = 356519683; // 0x15400f03
    field public static final int READING_LIGHTS_SWITCH = 356519684; // 0x15400f04
    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_OCCUPANCY = 356518832; // 0x15400bb0
    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 TIRE_PRESSURE_DISPLAY_UNITS = 289408514; // 0x11400602
    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.content.pm {

  public final class CarPackageManager {
    method public boolean isActivityDistractionOptimized(String, String);
    method public boolean isServiceDistractionOptimized(String, String);
  }

}

package android.car.drivingstate {

  public final class CarUxRestrictions implements android.os.Parcelable {
    ctor public CarUxRestrictions(android.car.drivingstate.CarUxRestrictions);
    method public int describeContents();
    method @android.car.drivingstate.CarUxRestrictions.CarUxRestrictionsInfo public int getActiveRestrictions();
    method public int getMaxContentDepth();
    method public int getMaxCumulativeContentItems();
    method public int getMaxRestrictedStringLength();
    method public long getTimeStamp();
    method public boolean isRequiresDistractionOptimization();
    method public boolean isSameRestrictions(android.car.drivingstate.CarUxRestrictions);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.drivingstate.CarUxRestrictions> CREATOR;
    field public static final int UX_RESTRICTIONS_BASELINE = 0; // 0x0
    field public static final int UX_RESTRICTIONS_FULLY_RESTRICTED = 511; // 0x1ff
    field public static final int UX_RESTRICTIONS_LIMIT_CONTENT = 32; // 0x20
    field public static final int UX_RESTRICTIONS_LIMIT_STRING_LENGTH = 4; // 0x4
    field public static final int UX_RESTRICTIONS_NO_DIALPAD = 1; // 0x1
    field public static final int UX_RESTRICTIONS_NO_FILTERING = 2; // 0x2
    field public static final int UX_RESTRICTIONS_NO_KEYBOARD = 8; // 0x8
    field public static final int UX_RESTRICTIONS_NO_SETUP = 64; // 0x40
    field public static final int UX_RESTRICTIONS_NO_TEXT_MESSAGE = 128; // 0x80
    field public static final int UX_RESTRICTIONS_NO_VIDEO = 16; // 0x10
    field public static final int UX_RESTRICTIONS_NO_VOICE_TRANSCRIPTION = 256; // 0x100
  }

  public static class CarUxRestrictions.Builder {
    ctor public CarUxRestrictions.Builder(boolean, @android.car.drivingstate.CarUxRestrictions.CarUxRestrictionsInfo int, long);
    method public android.car.drivingstate.CarUxRestrictions build();
    method public android.car.drivingstate.CarUxRestrictions.Builder setMaxContentDepth(int);
    method public android.car.drivingstate.CarUxRestrictions.Builder setMaxCumulativeContentItems(int);
    method public android.car.drivingstate.CarUxRestrictions.Builder setMaxStringLength(int);
  }

  @IntDef(flag=true, prefix={"UX_RESTRICTIONS_"}, value={android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_BASELINE, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_DIALPAD, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_FILTERING, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_LIMIT_STRING_LENGTH, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_KEYBOARD, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_LIMIT_CONTENT, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_TEXT_MESSAGE, android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_VOICE_TRANSCRIPTION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CarUxRestrictions.CarUxRestrictionsInfo {
  }

  public final class CarUxRestrictionsManager {
    method @Nullable public android.car.drivingstate.CarUxRestrictions getCurrentCarUxRestrictions();
    method public void registerListener(@NonNull android.car.drivingstate.CarUxRestrictionsManager.OnUxRestrictionsChangedListener);
    method public void unregisterListener();
  }

  public static interface CarUxRestrictionsManager.OnUxRestrictionsChangedListener {
    method public void onUxRestrictionsChanged(android.car.drivingstate.CarUxRestrictions);
  }

}

package android.car.hardware {

  public final class CarPropertyConfig<T> implements android.os.Parcelable {
    method public int describeContents();
    method public int getAccess();
    method @NonNull public int[] getAreaIds();
    method public int getAreaType();
    method public int getChangeMode();
    method @NonNull public java.util.List<java.lang.Integer> getConfigArray();
    method public float getMaxSampleRate();
    method @Nullable public T getMaxValue(int);
    method @Nullable public T getMaxValue();
    method public float getMinSampleRate();
    method @Nullable public T getMinValue(int);
    method @Nullable public T getMinValue();
    method public int getPropertyId();
    method public boolean isGlobalProperty();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.hardware.CarPropertyConfig> CREATOR;
    field public static final int VEHICLE_PROPERTY_ACCESS_NONE = 0; // 0x0
    field public static final int VEHICLE_PROPERTY_ACCESS_READ = 1; // 0x1
    field public static final int VEHICLE_PROPERTY_ACCESS_READ_WRITE = 3; // 0x3
    field public static final int VEHICLE_PROPERTY_ACCESS_WRITE = 2; // 0x2
    field public static final int VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS = 2; // 0x2
    field public static final int VEHICLE_PROPERTY_CHANGE_MODE_ONCHANGE = 1; // 0x1
    field public static final int VEHICLE_PROPERTY_CHANGE_MODE_STATIC = 0; // 0x0
  }

  public final class CarPropertyValue<T> implements android.os.Parcelable {
    method public int describeContents();
    method public int getAreaId();
    method public int getPropertyId();
    method @android.car.hardware.CarPropertyValue.PropertyStatus public int getStatus();
    method public long getTimestamp();
    method @NonNull public T getValue();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.hardware.CarPropertyValue> CREATOR;
    field public static final int STATUS_AVAILABLE = 0; // 0x0
    field public static final int STATUS_ERROR = 2; // 0x2
    field public static final int STATUS_UNAVAILABLE = 1; // 0x1
  }

  @IntDef({android.car.hardware.CarPropertyValue.STATUS_AVAILABLE, android.car.hardware.CarPropertyValue.STATUS_UNAVAILABLE, android.car.hardware.CarPropertyValue.STATUS_ERROR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CarPropertyValue.PropertyStatus {
  }

  @Deprecated public class CarSensorEvent implements android.os.Parcelable {
    method @Deprecated public int describeContents();
    method @Deprecated public void writeToParcel(android.os.Parcel, int);
    field @Deprecated public static final android.os.Parcelable.Creator<android.car.hardware.CarSensorEvent> CREATOR;
    field @Deprecated public static final int GEAR_DRIVE = 8; // 0x8
    field @Deprecated public static final int GEAR_EIGHTH = 2048; // 0x800
    field @Deprecated public static final int GEAR_FIFTH = 256; // 0x100
    field @Deprecated public static final int GEAR_FIRST = 16; // 0x10
    field @Deprecated public static final int GEAR_FOURTH = 128; // 0x80
    field @Deprecated public static final int GEAR_NEUTRAL = 1; // 0x1
    field @Deprecated public static final int GEAR_NINTH = 4096; // 0x1000
    field @Deprecated public static final int GEAR_PARK = 4; // 0x4
    field @Deprecated public static final int GEAR_REVERSE = 2; // 0x2
    field @Deprecated public static final int GEAR_SECOND = 32; // 0x20
    field @Deprecated public static final int GEAR_SEVENTH = 1024; // 0x400
    field @Deprecated public static final int GEAR_SIXTH = 512; // 0x200
    field @Deprecated public static final int GEAR_TENTH = 8192; // 0x2000
    field @Deprecated public static final int GEAR_THIRD = 64; // 0x40
    field @Deprecated public static final int IGNITION_STATE_ACC = 3; // 0x3
    field @Deprecated public static final int IGNITION_STATE_LOCK = 1; // 0x1
    field @Deprecated public static final int IGNITION_STATE_OFF = 2; // 0x2
    field @Deprecated public static final int IGNITION_STATE_ON = 4; // 0x4
    field @Deprecated public static final int IGNITION_STATE_START = 5; // 0x5
    field @Deprecated public static final int IGNITION_STATE_UNDEFINED = 0; // 0x0
    field @Deprecated public static final int INDEX_ENVIRONMENT_TEMPERATURE = 0; // 0x0
    field @Deprecated public static final int INDEX_WHEEL_DISTANCE_FRONT_LEFT = 1; // 0x1
    field @Deprecated public static final int INDEX_WHEEL_DISTANCE_FRONT_RIGHT = 2; // 0x2
    field @Deprecated public static final int INDEX_WHEEL_DISTANCE_REAR_LEFT = 4; // 0x4
    field @Deprecated public static final int INDEX_WHEEL_DISTANCE_REAR_RIGHT = 3; // 0x3
    field @Deprecated public static final int INDEX_WHEEL_DISTANCE_RESET_COUNT = 0; // 0x0
    field @Deprecated public final float[] floatValues;
    field @Deprecated public final int[] intValues;
    field @Deprecated public final long[] longValues;
    field @Deprecated public int sensorType;
    field @Deprecated public long timestamp;
  }

  @Deprecated public static class CarSensorEvent.EnvironmentData {
    field @Deprecated public float temperature;
    field @Deprecated public long timestamp;
  }

  @Deprecated public final class CarSensorManager {
    method @Deprecated @Nullable public android.car.hardware.CarSensorEvent getLatestSensorEvent(int);
    method @Deprecated @NonNull public java.util.List<android.car.hardware.CarPropertyConfig> getPropertyList();
    method @Deprecated @NonNull public int[] getSupportedSensors();
    method @Deprecated public boolean isSensorSupported(int);
    method @Deprecated @RequiresPermission(anyOf={android.car.Car.PERMISSION_SPEED, "android.car.permission.CAR_ENGINE_DETAILED", "android.car.permission.CAR_MILEAGE", android.car.Car.PERMISSION_ENERGY, android.car.Car.PERMISSION_POWERTRAIN, android.car.Car.PERMISSION_EXTERIOR_ENVIRONMENT, "android.car.permission.CAR_DYNAMICS_STATE", android.car.Car.PERMISSION_ENERGY_PORTS}, conditional=true) public boolean registerListener(@NonNull android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int);
    method @Deprecated public void unregisterListener(@NonNull android.car.hardware.CarSensorManager.OnSensorChangedListener);
    method @Deprecated public void unregisterListener(@NonNull android.car.hardware.CarSensorManager.OnSensorChangedListener, int);
    field @Deprecated public static final int SENSOR_RATE_FAST = 10; // 0xa
    field @Deprecated public static final int SENSOR_RATE_FASTEST = 100; // 0x64
    field @Deprecated public static final int SENSOR_RATE_NORMAL = 1; // 0x1
    field @Deprecated public static final int SENSOR_RATE_ONCHANGE = 0; // 0x0
    field @Deprecated public static final int SENSOR_RATE_UI = 5; // 0x5
    field @Deprecated public static final int SENSOR_TYPE_ABS_ACTIVE = 287310858; // 0x1120040a
    field @Deprecated public static final int SENSOR_TYPE_CAR_SPEED = 291504647; // 0x11600207
    field @Deprecated public static final int SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE = 291505923; // 0x11600703
    field @Deprecated public static final int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE = 291504908; // 0x1160030c
    field @Deprecated public static final int SENSOR_TYPE_EV_BATTERY_LEVEL = 291504905; // 0x11600309
    field @Deprecated public static final int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED = 287310603; // 0x1120030b
    field @Deprecated public static final int SENSOR_TYPE_EV_CHARGE_PORT_OPEN = 287310602; // 0x1120030a
    field @Deprecated public static final int SENSOR_TYPE_FUEL_DOOR_OPEN = 287310600; // 0x11200308
    field @Deprecated public static final int SENSOR_TYPE_FUEL_LEVEL = 291504903; // 0x11600307
    field @Deprecated public static final int SENSOR_TYPE_GEAR = 289408000; // 0x11400400
    field @Deprecated public static final int SENSOR_TYPE_IGNITION_STATE = 289408009; // 0x11400409
    field @Deprecated public static final int SENSOR_TYPE_NIGHT = 287310855; // 0x11200407
    field @Deprecated public static final int SENSOR_TYPE_ODOMETER = 291504644; // 0x11600204
    field @Deprecated public static final int SENSOR_TYPE_PARKING_BRAKE = 287310850; // 0x11200402
    field @Deprecated public static final int SENSOR_TYPE_RPM = 291504901; // 0x11600305
    field @Deprecated public static final int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE = 287310859; // 0x1120040b
    field @Deprecated public static final int SENSOR_TYPE_WHEEL_TICK_DISTANCE = 290521862; // 0x11510306
  }

  @Deprecated public static interface CarSensorManager.OnSensorChangedListener {
    method @Deprecated public void onSensorChanged(android.car.hardware.CarSensorEvent);
  }

}

package android.car.hardware.property {

  public class CarPropertyManager {
    method public boolean getBooleanProperty(int, int);
    method public float getFloatProperty(int, int);
    method @NonNull public int[] getIntArrayProperty(int, int);
    method public int getIntProperty(int, int);
    method @Nullable public <E> android.car.hardware.CarPropertyValue<E> getProperty(@NonNull Class<E>, int, int);
    method @Nullable public <E> android.car.hardware.CarPropertyValue<E> getProperty(int, int);
    method @NonNull public java.util.List<android.car.hardware.CarPropertyConfig> getPropertyList();
    method @NonNull public java.util.List<android.car.hardware.CarPropertyConfig> getPropertyList(@NonNull android.util.ArraySet<java.lang.Integer>);
    method public boolean isPropertyAvailable(int, int);
    method public boolean registerCallback(@NonNull android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback, int, @FloatRange(from=0.0, to=100.0) float);
    method public void setBooleanProperty(int, int, boolean);
    method public void setFloatProperty(int, int, float);
    method public void setIntProperty(int, int, int);
    method public <E> void setProperty(@NonNull Class<E>, int, int, @NonNull E);
    method public void unregisterCallback(@NonNull android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback);
    method public void unregisterCallback(@NonNull android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback, int);
    field public static final float SENSOR_RATE_FAST = 10.0f;
    field public static final float SENSOR_RATE_FASTEST = 100.0f;
    field public static final float SENSOR_RATE_NORMAL = 1.0f;
    field public static final float SENSOR_RATE_ONCHANGE = 0.0f;
    field public static final float SENSOR_RATE_UI = 5.0f;
  }

  public static interface CarPropertyManager.CarPropertyEventCallback {
    method public void onChangeEvent(android.car.hardware.CarPropertyValue);
    method public void onErrorEvent(int, int);
  }

}

package android.car.media {

  public final class CarAudioManager {
    method public void registerCarVolumeCallback(@NonNull android.car.media.CarAudioManager.CarVolumeCallback);
    method public void unregisterCarVolumeCallback(@NonNull android.car.media.CarAudioManager.CarVolumeCallback);
  }

  public abstract static class CarAudioManager.CarVolumeCallback {
    ctor public CarAudioManager.CarVolumeCallback();
    method public void onGroupVolumeChanged(int, int, int);
    method public void onMasterMuteChanged(int, int);
  }

}

package android.car.navigation {

  public final class CarNavigationStatusManager {
    method public android.car.navigation.CarNavigationInstrumentCluster getInstrumentClusterInfo();
    method public void sendEvent(int, android.os.Bundle);
  }

}

package android.car.settings {

  public class CarConfigurationManager {
    method public android.car.settings.SpeedBumpConfiguration getSpeedBumpConfiguration();
  }

  public class CarSettings {
    ctor public CarSettings();
  }

  public static final class CarSettings.Global {
    ctor public CarSettings.Global();
    field @Deprecated public static final String KEY_GARAGE_MODE_ENABLED = "android.car.GARAGE_MODE_ENABLED";
    field @Deprecated public static final String KEY_GARAGE_MODE_MAINTENANCE_WINDOW = "android.car.GARAGE_MODE_MAINTENANCE_WINDOW";
    field @Deprecated public static final String KEY_GARAGE_MODE_WAKE_UP_TIME = "android.car.GARAGE_MODE_WAKE_UP_TIME";
  }

  public final class SpeedBumpConfiguration implements android.os.Parcelable {
    ctor public SpeedBumpConfiguration(double, double, long);
    method public int describeContents();
    method public double getAcquiredPermitsPerSecond();
    method public double getMaxPermitPool();
    method public long getPermitFillDelay();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.settings.SpeedBumpConfiguration> CREATOR;
  }

}

