package android.car {

  public final class Car {
    field public static final java.lang.String CABIN_SERVICE = "cabin";
    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_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";
    field public static final java.lang.String PERMISSION_CAR_DYNAMICS_STATE = "android.car.permission.CAR_DYNAMICS_STATE";
    field public static final java.lang.String PERMISSION_CAR_ENGINE_DETAILED = "android.car.permission.CAR_ENGINE_DETAILED";
    field public static final java.lang.String PERMISSION_CAR_INSTRUMENT_CLUSTER_CONTROL = "android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL";
    field public static final java.lang.String PERMISSION_CAR_POWER = "android.car.permission.CAR_POWER";
    field public static final java.lang.String PERMISSION_CAR_PROJECTION = "android.car.permission.CAR_PROJECTION";
    field public static final java.lang.String PERMISSION_CAR_TEST_SERVICE = "android.car.permission.CAR_TEST_SERVICE";
    field public static final java.lang.String PERMISSION_CONTROL_APP_BLOCKING = "android.car.permission.CONTROL_APP_BLOCKING";
    field public static final java.lang.String PERMISSION_CONTROL_CAR_CLIMATE = "android.car.permission.CONTROL_CAR_CLIMATE";
    field public static final java.lang.String PERMISSION_CONTROL_CAR_DOORS = "android.car.permission.CONTROL_CAR_DOORS";
    field public static final java.lang.String PERMISSION_CONTROL_CAR_MIRRORS = "android.car.permission.CONTROL_CAR_MIRRORS";
    field public static final java.lang.String PERMISSION_CONTROL_CAR_SEATS = "android.car.permission.CONTROL_CAR_SEATS";
    field public static final java.lang.String PERMISSION_CONTROL_CAR_WINDOWS = "android.car.permission.CONTROL_CAR_WINDOWS";
    field public static final java.lang.String PERMISSION_CONTROL_EXTERIOR_LIGHTS = "android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS";
    field public static final java.lang.String PERMISSION_EXTERIOR_LIGHTS = "android.car.permission.CAR_EXTERIOR_LIGHTS";
    field public static final java.lang.String PERMISSION_MILEAGE = "android.car.permission.CAR_MILEAGE";
    field public static final deprecated java.lang.String PERMISSION_MOCK_VEHICLE_HAL = "android.car.permission.CAR_MOCK_VEHICLE_HAL";
    field public static final java.lang.String PERMISSION_STORAGE_MONITORING = "android.car.permission.STORAGE_MONITORING";
    field public static final java.lang.String PERMISSION_TIRES = "android.car.permission.CAR_TIRES";
    field public static final java.lang.String PERMISSION_VENDOR_EXTENSION = "android.car.permission.CAR_VENDOR_EXTENSION";
    field public static final java.lang.String PERMISSION_VMS_PUBLISHER = "android.car.permission.VMS_PUBLISHER";
    field public static final java.lang.String PERMISSION_VMS_SUBSCRIBER = "android.car.permission.VMS_SUBSCRIBER";
    field public static final java.lang.String POWER_SERVICE = "power";
    field public static final java.lang.String PROJECTION_SERVICE = "projection";
    field public static final java.lang.String PROPERTY_SERVICE = "property";
    field public static final java.lang.String STORAGE_MONITORING_SERVICE = "storage_monitoring";
    field public static final java.lang.String TEST_SERVICE = "car-service-test";
    field public static final java.lang.String VENDOR_EXTENSION_SERVICE = "vendor_extension";
    field public static final java.lang.String VMS_SUBSCRIBER_SERVICE = "vehicle_map_subscriber_service";
  }

  public final class CarProjectionManager {
    method public void onCarDisconnected();
    method public void registerProjectionListener(android.car.CarProjectionManager.CarProjectionListener, int) throws android.car.CarNotConnectedException;
    method public void registerProjectionRunner(android.content.Intent) throws android.car.CarNotConnectedException;
    method public void startProjectionAccessPoint(android.car.CarProjectionManager.ProjectionAccessPointCallback);
    method public void stopProjectionAccessPoint();
    method public void unregisterProjectionListener();
    method public void unregisterProjectionRunner(android.content.Intent);
    field public static final int PROJECTION_LONG_PRESS_VOICE_SEARCH = 2; // 0x2
    field public static final int PROJECTION_VOICE_SEARCH = 1; // 0x1
  }

  public static abstract interface CarProjectionManager.CarProjectionListener {
    method public abstract void onVoiceAssistantRequest(boolean);
  }

  public static abstract class CarProjectionManager.ProjectionAccessPointCallback {
    ctor public CarProjectionManager.ProjectionAccessPointCallback();
    method public void onFailed(int);
    method public void onStarted(android.net.wifi.WifiConfiguration);
    method public void onStopped();
    field public static final int ERROR_GENERIC = 2; // 0x2
    field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
    field public static final int ERROR_NO_CHANNEL = 1; // 0x1
    field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
  }

  public final class VehicleAreaDoor {
    field public static final int DOOR_HOOD = 268435456; // 0x10000000
    field public static final int DOOR_REAR = 536870912; // 0x20000000
    field public static final int DOOR_ROW_1_LEFT = 1; // 0x1
    field public static final int DOOR_ROW_1_RIGHT = 4; // 0x4
    field public static final int DOOR_ROW_2_LEFT = 16; // 0x10
    field public static final int DOOR_ROW_2_RIGHT = 64; // 0x40
    field public static final int DOOR_ROW_3_LEFT = 256; // 0x100
    field public static final int DOOR_ROW_3_RIGHT = 1024; // 0x400
  }

  public final class VehicleAreaMirror {
    field public static final int MIRROR_DRIVER_CENTER = 4; // 0x4
    field public static final int MIRROR_DRIVER_LEFT = 1; // 0x1
    field public static final int MIRROR_DRIVER_RIGHT = 2; // 0x2
  }

  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
  }

  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 VehicleAreaWheel {
    field public static final int WHEEL_LEFT_FRONT = 1; // 0x1
    field public static final int WHEEL_LEFT_REAR = 4; // 0x4
    field public static final int WHEEL_RIGHT_FRONT = 2; // 0x2
    field public static final int WHEEL_RIGHT_REAR = 8; // 0x8
    field public static final int WHEEL_UNKNOWN = 0; // 0x0
  }

  public final class VehicleAreaWindow {
    field public static final int WINDOW_FRONT_WINDSHIELD = 1; // 0x1
    field public static final int WINDOW_REAR_WINDSHIELD = 2; // 0x2
    field public static final int WINDOW_ROOF_TOP_1 = 65536; // 0x10000
    field public static final int WINDOW_ROOF_TOP_2 = 131072; // 0x20000
    field public static final int WINDOW_ROW_1_LEFT = 16; // 0x10
    field public static final int WINDOW_ROW_1_RIGHT = 64; // 0x40
    field public static final int WINDOW_ROW_2_LEFT = 256; // 0x100
    field public static final int WINDOW_ROW_2_RIGHT = 1024; // 0x400
    field public static final int WINDOW_ROW_3_LEFT = 4096; // 0x1000
    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 {

  public class CarInstrumentClusterManager {
    method public void registerCallback(java.lang.String, android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
    method public void startActivity(android.content.Intent) throws android.car.CarNotConnectedException;
    method public void unregisterCallback(android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
    field public static final java.lang.String CATEGORY_NAVIGATION = "android.car.cluster.NAVIGATION";
    field public static final java.lang.String KEY_EXTRA_ACTIVITY_STATE = "android.car.cluster.ClusterActivityState";
  }

  public static abstract interface CarInstrumentClusterManager.Callback {
    method public abstract void onClusterActivityStateChanged(java.lang.String, android.os.Bundle);
  }

}

package android.car.cluster.renderer {

  public abstract class InstrumentClusterRenderer {
    ctor public InstrumentClusterRenderer();
    method protected abstract android.car.cluster.renderer.NavigationRenderer createNavigationRenderer();
    method public synchronized android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
    method public final synchronized void initialize();
    method public abstract void onCreate(android.content.Context);
    method public abstract void onStart();
    method public abstract void onStop();
  }

  public abstract class InstrumentClusterRenderingService extends android.app.Service {
    ctor public InstrumentClusterRenderingService();
    method protected abstract android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
    method public android.os.IBinder onBind(android.content.Intent);
    method protected void onKeyEvent(android.view.KeyEvent);
  }

  public abstract class NavigationRenderer {
    ctor public NavigationRenderer();
    method public abstract android.car.navigation.CarNavigationInstrumentCluster getNavigationProperties();
    method public abstract void onEvent(int, android.os.Bundle);
  }

}

package android.car.content.pm {

  public class AppBlockingPackageInfo implements android.os.Parcelable {
    ctor public AppBlockingPackageInfo(java.lang.String, int, int, int, android.content.pm.Signature[], java.lang.String[]);
    ctor public AppBlockingPackageInfo(android.os.Parcel);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.content.pm.AppBlockingPackageInfo> CREATOR;
    field public static final int FLAG_SYSTEM_APP = 1; // 0x1
    field public static final int FLAG_WHOLE_ACTIVITY = 2; // 0x2
    field public final java.lang.String[] activities;
    field public final int flags;
    field public final int maxRevisionCode;
    field public final int minRevisionCode;
    field public final java.lang.String packageName;
    field public final android.content.pm.Signature[] signatures;
  }

  public class CarAppBlockingPolicy implements android.os.Parcelable {
    ctor public CarAppBlockingPolicy(android.car.content.pm.AppBlockingPackageInfo[], android.car.content.pm.AppBlockingPackageInfo[]);
    ctor public CarAppBlockingPolicy(android.os.Parcel);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.content.pm.CarAppBlockingPolicy> CREATOR;
    field public final android.car.content.pm.AppBlockingPackageInfo[] blacklists;
    field public final android.car.content.pm.AppBlockingPackageInfo[] whitelists;
  }

  public abstract class CarAppBlockingPolicyService extends android.app.Service {
    ctor public CarAppBlockingPolicyService();
    method protected abstract android.car.content.pm.CarAppBlockingPolicy getAppBlockingPolicy();
    method public android.os.IBinder onBind(android.content.Intent);
    field public static final java.lang.String SERVICE_INTERFACE = "android.car.content.pm.CarAppBlockingPolicyService";
  }

  public final class CarPackageManager {
    method public boolean isActivityBackedBySafeActivity(android.content.ComponentName) throws android.car.CarNotConnectedException;
    method public void setAppBlockingPolicy(java.lang.String, android.car.content.pm.CarAppBlockingPolicy, int) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException, java.lang.SecurityException;
    field public static final int FLAG_SET_POLICY_ADD = 2; // 0x2
    field public static final int FLAG_SET_POLICY_REMOVE = 4; // 0x4
    field public static final int FLAG_SET_POLICY_WAIT_FOR_CHANGE = 1; // 0x1
  }

}

package android.car.diagnostic {

  public class CarDiagnosticEvent implements android.os.Parcelable {
    ctor public CarDiagnosticEvent(android.os.Parcel);
    method public int describeContents();
    method public java.lang.Integer getFuelSystemStatus();
    method public java.lang.Integer getFuelType();
    method public android.car.diagnostic.CarDiagnosticEvent.CommonIgnitionMonitors getIgnitionMonitors();
    method public java.lang.Integer getSecondaryAirStatus();
    method public float getSystemFloatSensor(int, float);
    method public java.lang.Float getSystemFloatSensor(int);
    method public int getSystemIntegerSensor(int, int);
    method public java.lang.Integer getSystemIntegerSensor(int);
    method public float getVendorFloatSensor(int, float);
    method public java.lang.Float getVendorFloatSensor(int);
    method public int getVendorIntegerSensor(int, int);
    method public java.lang.Integer getVendorIntegerSensor(int);
    method public boolean isFreezeFrame();
    method public boolean isLiveFrame();
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.diagnostic.CarDiagnosticEvent> CREATOR;
    field public final java.lang.String dtc;
    field public final int frameType;
    field public final long timestamp;
  }

  public static class CarDiagnosticEvent.Builder {
    method public android.car.diagnostic.CarDiagnosticEvent.Builder atTimestamp(long);
    method public android.car.diagnostic.CarDiagnosticEvent build();
    method public static android.car.diagnostic.CarDiagnosticEvent.Builder newFreezeFrameBuilder();
    method public static android.car.diagnostic.CarDiagnosticEvent.Builder newLiveFrameBuilder();
    method public android.car.diagnostic.CarDiagnosticEvent.Builder withDtc(java.lang.String);
    method public android.car.diagnostic.CarDiagnosticEvent.Builder withFloatValue(int, float);
    method public android.car.diagnostic.CarDiagnosticEvent.Builder withIntValue(int, int);
  }

  public static class CarDiagnosticEvent.CommonIgnitionMonitors {
    method public android.car.diagnostic.CarDiagnosticEvent.CompressionIgnitionMonitors asCompressionIgnitionMonitors();
    method public android.car.diagnostic.CarDiagnosticEvent.SparkIgnitionMonitors asSparkIgnitionMonitors();
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor components;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor fuelSystem;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor misfire;
  }

  public static final class CarDiagnosticEvent.CompressionIgnitionMonitors extends android.car.diagnostic.CarDiagnosticEvent.CommonIgnitionMonitors {
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor EGROrVVT;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor NMHCCatalyst;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor NOxSCR;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor PMFilter;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor boostPressure;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor exhaustGasSensor;
  }

  public static final class CarDiagnosticEvent.FuelSystemStatus {
    field public static final int CLOSED_LOOP = 2; // 0x2
    field public static final int CLOSED_LOOP_BUT_FEEDBACK_FAULT = 16; // 0x10
    field public static final int OPEN_ENGINE_LOAD_OR_DECELERATION = 4; // 0x4
    field public static final int OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1; // 0x1
    field public static final int OPEN_SYSTEM_FAILURE = 8; // 0x8
  }

  public static abstract class CarDiagnosticEvent.FuelSystemStatus.Status implements java.lang.annotation.Annotation {
  }

  public static final class CarDiagnosticEvent.FuelType {
    field public static final int BIFUEL_RUNNING_CNG = 13; // 0xd
    field public static final int BIFUEL_RUNNING_DIESEL = 23; // 0x17
    field public static final int BIFUEL_RUNNING_ELECTRIC = 15; // 0xf
    field public static final int BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION = 16; // 0x10
    field public static final int BIFUEL_RUNNING_ETHANOL = 11; // 0xb
    field public static final int BIFUEL_RUNNING_GASOLINE = 9; // 0x9
    field public static final int BIFUEL_RUNNING_LPG = 12; // 0xc
    field public static final int BIFUEL_RUNNING_METHANOL = 10; // 0xa
    field public static final int BIFUEL_RUNNING_PROPANE = 14; // 0xe
    field public static final int CNG = 6; // 0x6
    field public static final int DIESEL = 4; // 0x4
    field public static final int ELECTRIC = 8; // 0x8
    field public static final int ETHANOL = 3; // 0x3
    field public static final int GASOLINE = 1; // 0x1
    field public static final int HYBRID_DIESEL = 19; // 0x13
    field public static final int HYBRID_ELECTRIC = 20; // 0x14
    field public static final int HYBRID_ETHANOL = 18; // 0x12
    field public static final int HYBRID_GASOLINE = 17; // 0x11
    field public static final int HYBRID_REGENERATIVE = 22; // 0x16
    field public static final int HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION = 21; // 0x15
    field public static final int LPG = 5; // 0x5
    field public static final int METHANOL = 2; // 0x2
    field public static final int NOT_AVAILABLE = 0; // 0x0
    field public static final int PROPANE = 7; // 0x7
  }

  public static abstract class CarDiagnosticEvent.FuelType.Type implements java.lang.annotation.Annotation {
  }

  public static final class CarDiagnosticEvent.IgnitionMonitor {
    field public final boolean available;
    field public final boolean incomplete;
  }

  public static final class CarDiagnosticEvent.SecondaryAirStatus {
    field public static final int DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2; // 0x2
    field public static final int FROM_OUTSIDE_OR_OFF = 4; // 0x4
    field public static final int PUMP_ON_FOR_DIAGNOSTICS = 8; // 0x8
    field public static final int UPSTREAM = 1; // 0x1
  }

  public static abstract class CarDiagnosticEvent.SecondaryAirStatus.Status implements java.lang.annotation.Annotation {
  }

  public static final class CarDiagnosticEvent.SparkIgnitionMonitors extends android.car.diagnostic.CarDiagnosticEvent.CommonIgnitionMonitors {
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor ACRefrigerant;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor EGR;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor catalyst;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor evaporativeSystem;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor heatedCatalyst;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor oxygenSensor;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor oxygenSensorHeater;
    field public final android.car.diagnostic.CarDiagnosticEvent.IgnitionMonitor secondaryAirSystem;
  }

  public final class CarDiagnosticManager {
    method public boolean clearFreezeFrames(long...) throws android.car.CarNotConnectedException;
    method public android.car.diagnostic.CarDiagnosticEvent getFreezeFrame(long) throws android.car.CarNotConnectedException;
    method public long[] getFreezeFrameTimestamps() throws android.car.CarNotConnectedException;
    method public android.car.diagnostic.CarDiagnosticEvent getLatestLiveFrame() throws android.car.CarNotConnectedException;
    method public boolean isClearFreezeFramesSupported() throws android.car.CarNotConnectedException;
    method public boolean isFreezeFrameNotificationSupported() throws android.car.CarNotConnectedException;
    method public boolean isGetFreezeFrameSupported() throws android.car.CarNotConnectedException;
    method public boolean isLiveFrameSupported() throws android.car.CarNotConnectedException;
    method public boolean isSelectiveClearFreezeFramesSupported() throws android.car.CarNotConnectedException;
    method public void onCarDisconnected();
    method public boolean registerListener(android.car.diagnostic.CarDiagnosticManager.OnDiagnosticEventListener, int, int) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException;
    method public void unregisterListener(android.car.diagnostic.CarDiagnosticManager.OnDiagnosticEventListener);
    field public static final int FRAME_TYPE_FREEZE = 1; // 0x1
    field public static final int FRAME_TYPE_LIVE = 0; // 0x0
  }

  public static abstract class CarDiagnosticManager.FrameType implements java.lang.annotation.Annotation {
  }

  public static abstract interface CarDiagnosticManager.OnDiagnosticEventListener {
    method public abstract void onDiagnosticEvent(android.car.diagnostic.CarDiagnosticEvent);
  }

  public final class FloatSensorIndex {
    field public static final int ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58; // 0x3a
    field public static final int ABSOLUTE_LOAD_VALUE = 48; // 0x30
    field public static final int ABSOLUTE_THROTTLE_POSITION_B = 51; // 0x33
    field public static final int ABSOLUTE_THROTTLE_POSITION_C = 52; // 0x34
    field public static final int ACCELERATOR_PEDAL_POSITION_D = 53; // 0x35
    field public static final int ACCELERATOR_PEDAL_POSITION_E = 54; // 0x36
    field public static final int ACCELERATOR_PEDAL_POSITION_F = 55; // 0x37
    field public static final int CALCULATED_ENGINE_LOAD = 0; // 0x0
    field public static final int CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44; // 0x2c
    field public static final int CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46; // 0x2e
    field public static final int CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45; // 0x2d
    field public static final int CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47; // 0x2f
    field public static final int COMMANDED_EVAPORATIVE_PURGE = 41; // 0x29
    field public static final int COMMANDED_EXHAUST_GAS_RECIRCULATION = 39; // 0x27
    field public static final int COMMANDED_THROTTLE_ACTUATOR = 56; // 0x38
    field public static final int ENGINE_COOLANT_TEMPERATURE = 1; // 0x1
    field public static final int ENGINE_FUEL_RATE = 70; // 0x46
    field public static final int ENGINE_RPM = 8; // 0x8
    field public static final int ETHANOL_FUEL_PERCENTAGE = 57; // 0x39
    field public static final int EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43; // 0x2b
    field public static final int EXHAUST_GAS_RECIRCULATION_ERROR = 40; // 0x28
    field public static final int FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49; // 0x31
    field public static final int FUEL_INJECTION_TIMING = 69; // 0x45
    field public static final int FUEL_PRESSURE = 6; // 0x6
    field public static final int FUEL_RAIL_GAUGE_PRESSURE = 38; // 0x26
    field public static final int FUEL_RAIL_PRESSURE = 37; // 0x25
    field public static final int FUEL_TANK_LEVEL_INPUT = 42; // 0x2a
    field public static final int HYBRID_BATTERY_PACK_REMAINING_LIFE = 68; // 0x44
    field public static final int INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7; // 0x7
    field public static final int LAST_SYSTEM = 70; // 0x46
    field public static final int LONG_TERM_FUEL_TRIM_BANK1 = 3; // 0x3
    field public static final int LONG_TERM_FUEL_TRIM_BANK2 = 5; // 0x5
    field public static final int LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63; // 0x3f
    field public static final int LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64; // 0x40
    field public static final int LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65; // 0x41
    field public static final int LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66; // 0x42
    field public static final int MAF_AIR_FLOW_RATE = 11; // 0xb
    field public static final int OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15; // 0xf
    field public static final int OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14; // 0xe
    field public static final int OXYGEN_SENSOR1_VOLTAGE = 13; // 0xd
    field public static final int OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18; // 0x12
    field public static final int OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17; // 0x11
    field public static final int OXYGEN_SENSOR2_VOLTAGE = 16; // 0x10
    field public static final int OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21; // 0x15
    field public static final int OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20; // 0x14
    field public static final int OXYGEN_SENSOR3_VOLTAGE = 19; // 0x13
    field public static final int OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24; // 0x18
    field public static final int OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23; // 0x17
    field public static final int OXYGEN_SENSOR4_VOLTAGE = 22; // 0x16
    field public static final int OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27; // 0x1b
    field public static final int OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26; // 0x1a
    field public static final int OXYGEN_SENSOR5_VOLTAGE = 25; // 0x19
    field public static final int OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30; // 0x1e
    field public static final int OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29; // 0x1d
    field public static final int OXYGEN_SENSOR6_VOLTAGE = 28; // 0x1c
    field public static final int OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33; // 0x21
    field public static final int OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32; // 0x20
    field public static final int OXYGEN_SENSOR7_VOLTAGE = 31; // 0x1f
    field public static final int OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36; // 0x24
    field public static final int OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35; // 0x23
    field public static final int OXYGEN_SENSOR8_VOLTAGE = 34; // 0x22
    field public static final int RELATIVE_ACCELERATOR_PEDAL_POSITION = 67; // 0x43
    field public static final int RELATIVE_THROTTLE_POSITION = 50; // 0x32
    field public static final int SHORT_TERM_FUEL_TRIM_BANK1 = 2; // 0x2
    field public static final int SHORT_TERM_FUEL_TRIM_BANK2 = 4; // 0x4
    field public static final int SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59; // 0x3b
    field public static final int SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60; // 0x3c
    field public static final int SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61; // 0x3d
    field public static final int SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62; // 0x3e
    field public static final int THROTTLE_POSITION = 12; // 0xc
    field public static final int TIMING_ADVANCE = 10; // 0xa
    field public static final int VEHICLE_SPEED = 9; // 0x9
    field public static final int VENDOR_START = 71; // 0x47
  }

  public final class IntegerSensorIndex {
    field public static final int ABSOLUTE_BAROMETRIC_PRESSURE = 11; // 0xb
    field public static final int AMBIENT_AIR_TEMPERATURE = 13; // 0xd
    field public static final int COMMANDED_SECONDARY_AIR_STATUS = 5; // 0x5
    field public static final int CONTROL_MODULE_VOLTAGE = 12; // 0xc
    field public static final int DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10; // 0xa
    field public static final int DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8; // 0x8
    field public static final int DRIVER_DEMAND_PERCENT_TORQUE = 24; // 0x18
    field public static final int ENGINE_ACTUAL_PERCENT_TORQUE = 25; // 0x19
    field public static final int ENGINE_OIL_TEMPERATURE = 23; // 0x17
    field public static final int ENGINE_PERCENT_TORQUE_DATA_IDLE = 27; // 0x1b
    field public static final int ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28; // 0x1c
    field public static final int ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29; // 0x1d
    field public static final int ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30; // 0x1e
    field public static final int ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31; // 0x1f
    field public static final int ENGINE_REFERENCE_PERCENT_TORQUE = 26; // 0x1a
    field public static final int FUEL_RAIL_ABSOLUTE_PRESSURE = 22; // 0x16
    field public static final int FUEL_SYSTEM_STATUS = 0; // 0x0
    field public static final int FUEL_TYPE = 21; // 0x15
    field public static final int IGNITION_MONITORS_SUPPORTED = 2; // 0x2
    field public static final int IGNITION_SPECIFIC_MONITORS = 3; // 0x3
    field public static final int INTAKE_AIR_TEMPERATURE = 4; // 0x4
    field public static final int LAST_SYSTEM = 31; // 0x1f
    field public static final int MALFUNCTION_INDICATOR_LIGHT_ON = 1; // 0x1
    field public static final int MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20; // 0x14
    field public static final int MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16; // 0x10
    field public static final int MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19; // 0x13
    field public static final int MAX_OXYGEN_SENSOR_CURRENT = 18; // 0x12
    field public static final int MAX_OXYGEN_SENSOR_VOLTAGE = 17; // 0x11
    field public static final int NUM_OXYGEN_SENSORS_PRESENT = 6; // 0x6
    field public static final int RUNTIME_SINCE_ENGINE_START = 7; // 0x7
    field public static final int TIME_SINCE_TROUBLE_CODES_CLEARED = 15; // 0xf
    field public static final int TIME_WITH_MALFUNCTION_LIGHT_ON = 14; // 0xe
    field public static final int VENDOR_START = 32; // 0x20
    field public static final int WARMUPS_SINCE_CODES_CLEARED = 9; // 0x9
  }

}

package android.car.drivingstate {

  public class CarDrivingStateEvent implements android.os.Parcelable {
    ctor public CarDrivingStateEvent(int, long);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.drivingstate.CarDrivingStateEvent> CREATOR;
    field public static final int DRIVING_STATE_IDLING = 1; // 0x1
    field public static final int DRIVING_STATE_MOVING = 2; // 0x2
    field public static final int DRIVING_STATE_PARKED = 0; // 0x0
    field public static final int DRIVING_STATE_UNKNOWN = -1; // 0xffffffff
    field public final int eventValue;
    field public final long timeStamp;
  }

  public final class CarDrivingStateManager {
    method public android.car.drivingstate.CarDrivingStateEvent getCurrentCarDrivingState() throws android.car.CarNotConnectedException;
    method public synchronized void registerListener(android.car.drivingstate.CarDrivingStateManager.CarDrivingStateEventListener) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException;
    method public synchronized void unregisterListener() throws android.car.CarNotConnectedException;
  }

  public static abstract interface CarDrivingStateManager.CarDrivingStateEventListener {
    method public abstract void onDrivingStateChanged(android.car.drivingstate.CarDrivingStateEvent);
  }

}

package android.car.hardware {

  public class CarPropertyConfig<T> implements android.os.Parcelable {
    method public int describeContents();
    method public int getAccess();
    method public int getAreaCount();
    method public int[] getAreaIds();
    method public int getAreaType();
    method public int getChangeMode();
    method public java.util.List<java.lang.Integer> getConfigArray();
    method public java.lang.String getConfigString();
    method public int getFirstAndOnlyAreaId();
    method public float getMaxSampleRate();
    method public T getMaxValue(int);
    method public T getMaxValue();
    method public float getMinSampleRate();
    method public T getMinValue(int);
    method public T getMinValue();
    method public int getPropertyId();
    method public java.lang.Class<T> getPropertyType();
    method public boolean hasArea(int);
    method public boolean isGlobalProperty();
    method public static <T> android.car.hardware.CarPropertyConfig.Builder<T> newBuilder(java.lang.Class<T>, int, int, int);
    method public static <T> android.car.hardware.CarPropertyConfig.Builder<T> newBuilder(java.lang.Class<T>, int, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.hardware.CarPropertyConfig> CREATOR;
  }

  public static class CarPropertyConfig.AreaConfig<T> implements android.os.Parcelable {
    method public int describeContents();
    method public T getMaxValue();
    method public T getMinValue();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.hardware.CarPropertyConfig.AreaConfig<java.lang.Object>> CREATOR;
  }

  public static class CarPropertyConfig.Builder<T> {
    method public android.car.hardware.CarPropertyConfig.Builder<T> addArea(int);
    method public android.car.hardware.CarPropertyConfig.Builder<T> addAreaConfig(int, T, T);
    method public android.car.hardware.CarPropertyConfig.Builder<T> addAreas(int[]);
    method public android.car.hardware.CarPropertyConfig<T> build();
    method public android.car.hardware.CarPropertyConfig.Builder<T> setAccess(int);
    method public android.car.hardware.CarPropertyConfig.Builder<T> setChangeMode(int);
    method public android.car.hardware.CarPropertyConfig.Builder<T> setConfigArray(java.util.ArrayList<java.lang.Integer>);
    method public android.car.hardware.CarPropertyConfig.Builder<T> setConfigString(java.lang.String);
    method public android.car.hardware.CarPropertyConfig.Builder<T> setMaxSampleRate(float);
    method public android.car.hardware.CarPropertyConfig.Builder<T> setMinSampleRate(float);
  }

  public class CarPropertyValue<T> implements android.os.Parcelable {
    ctor public CarPropertyValue(int, int, T);
    ctor public CarPropertyValue(int, int, int, long, T);
    ctor public CarPropertyValue(android.os.Parcel);
    method public int describeContents();
    method public int getAreaId();
    method public int getPropertyId();
    method public int getStatus();
    method public long getTimestamp();
    method public T getValue();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.hardware.CarPropertyValue> CREATOR;
  }

  public final class CarVendorExtensionManager {
    method public <E> E getGlobalProperty(java.lang.Class<E>, int) throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.hardware.CarPropertyConfig> getProperties() throws android.car.CarNotConnectedException;
    method public <E> E getProperty(java.lang.Class<E>, int, int) throws android.car.CarNotConnectedException;
    method public boolean isPropertyAvailable(int, int) throws android.car.CarNotConnectedException;
    method public void registerCallback(android.car.hardware.CarVendorExtensionManager.CarVendorExtensionCallback) throws android.car.CarNotConnectedException;
    method public <E> void setGlobalProperty(java.lang.Class<E>, int, E) throws android.car.CarNotConnectedException;
    method public <E> void setProperty(java.lang.Class<E>, int, int, E) throws android.car.CarNotConnectedException;
    method public void unregisterCallback(android.car.hardware.CarVendorExtensionManager.CarVendorExtensionCallback) throws android.car.CarNotConnectedException;
  }

  public static abstract interface CarVendorExtensionManager.CarVendorExtensionCallback {
    method public abstract void onChangeEvent(android.car.hardware.CarPropertyValue);
    method public abstract void onErrorEvent(int, int);
  }

}

package android.car.hardware.cabin {

  public final class CarCabinManager {
    method public boolean getBooleanProperty(int, int) throws android.car.CarNotConnectedException;
    method public float getFloatProperty(int, int) throws android.car.CarNotConnectedException;
    method public int getIntProperty(int, int) throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.hardware.CarPropertyConfig> getPropertyList() throws android.car.CarNotConnectedException;
    method public static boolean isZonedProperty(int);
    method public synchronized void registerCallback(android.car.hardware.cabin.CarCabinManager.CarCabinEventCallback) throws android.car.CarNotConnectedException;
    method public void setBooleanProperty(int, int, boolean) throws android.car.CarNotConnectedException;
    method public void setFloatProperty(int, int, float) throws android.car.CarNotConnectedException;
    method public void setIntProperty(int, int, int) throws android.car.CarNotConnectedException;
    method public synchronized void unregisterCallback(android.car.hardware.cabin.CarCabinManager.CarCabinEventCallback) throws android.car.CarNotConnectedException;
    field public static final int ID_DOOR_LOCK = 371198722; // 0x16200b02
    field public static final int ID_DOOR_MOVE = 373295873; // 0x16400b01
    field public static final int ID_DOOR_POS = 373295872; // 0x16400b00
    field public static final int ID_MIRROR_FOLD = 287312709; // 0x11200b45
    field public static final int ID_MIRROR_LOCK = 287312708; // 0x11200b44
    field public static final int ID_MIRROR_Y_MOVE = 339741507; // 0x14400b43
    field public static final int ID_MIRROR_Y_POS = 339741506; // 0x14400b42
    field public static final int ID_MIRROR_Z_MOVE = 339741505; // 0x14400b41
    field public static final int ID_MIRROR_Z_POS = 339741504; // 0x14400b40
    field public static final int ID_SEAT_BACKREST_ANGLE_1_MOVE = 356518792; // 0x15400b88
    field public static final int ID_SEAT_BACKREST_ANGLE_1_POS = 356518791; // 0x15400b87
    field public static final int ID_SEAT_BACKREST_ANGLE_2_MOVE = 356518794; // 0x15400b8a
    field public static final int ID_SEAT_BACKREST_ANGLE_2_POS = 356518793; // 0x15400b89
    field public static final int ID_SEAT_BELT_BUCKLED = 354421634; // 0x15200b82
    field public static final int ID_SEAT_BELT_HEIGHT_MOVE = 356518788; // 0x15400b84
    field public static final int ID_SEAT_BELT_HEIGHT_POS = 356518787; // 0x15400b83
    field public static final int ID_SEAT_DEPTH_MOVE = 356518798; // 0x15400b8e
    field public static final int ID_SEAT_DEPTH_POS = 356518797; // 0x15400b8d
    field public static final int ID_SEAT_FORE_AFT_MOVE = 356518790; // 0x15400b86
    field public static final int ID_SEAT_FORE_AFT_POS = 356518789; // 0x15400b85
    field public static final int ID_SEAT_HEADREST_ANGLE_MOVE = 356518808; // 0x15400b98
    field public static final int ID_SEAT_HEADREST_ANGLE_POS = 356518807; // 0x15400b97
    field public static final int ID_SEAT_HEADREST_FORE_AFT_MOVE = 356518810; // 0x15400b9a
    field public static final int ID_SEAT_HEADREST_FORE_AFT_POS = 356518809; // 0x15400b99
    field public static final int ID_SEAT_HEADREST_HEIGHT_MOVE = 356518806; // 0x15400b96
    field public static final int ID_SEAT_HEADREST_HEIGHT_POS = 356518805; // 0x15400b95
    field public static final int ID_SEAT_HEIGHT_MOVE = 356518796; // 0x15400b8c
    field public static final int ID_SEAT_HEIGHT_POS = 356518795; // 0x15400b8b
    field public static final int ID_SEAT_LUMBAR_FORE_AFT_MOVE = 356518802; // 0x15400b92
    field public static final int ID_SEAT_LUMBAR_FORE_AFT_POS = 356518801; // 0x15400b91
    field public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 356518804; // 0x15400b94
    field public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_POS = 356518803; // 0x15400b93
    field public static final int ID_SEAT_MEMORY_SELECT = 356518784; // 0x15400b80
    field public static final int ID_SEAT_MEMORY_SET = 356518785; // 0x15400b81
    field public static final int ID_SEAT_TILT_MOVE = 356518800; // 0x15400b90
    field public static final int ID_SEAT_TILT_POS = 356518799; // 0x15400b8f
    field public static final int ID_WINDOW_LOCK = 322964420; // 0x13400bc4
    field public static final int ID_WINDOW_MOVE = 322964417; // 0x13400bc1
    field public static final int ID_WINDOW_POS = 322964416; // 0x13400bc0
  }

  public static abstract interface CarCabinManager.CarCabinEventCallback {
    method public abstract void onChangeEvent(android.car.hardware.CarPropertyValue);
    method public abstract void onErrorEvent(int, int);
  }

}

package android.car.hardware.hvac {

  public final class CarHvacManager {
    method public boolean getBooleanProperty(int, int) throws android.car.CarNotConnectedException;
    method public float getFloatProperty(int, int) throws android.car.CarNotConnectedException;
    method public int getIntProperty(int, int) throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.hardware.CarPropertyConfig> getPropertyList() throws android.car.CarNotConnectedException;
    method public boolean isPropertyAvailable(int, int) throws android.car.CarNotConnectedException;
    method public synchronized void registerCallback(android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback) throws android.car.CarNotConnectedException;
    method public void setBooleanProperty(int, int, boolean) throws android.car.CarNotConnectedException;
    method public void setFloatProperty(int, int, float) throws android.car.CarNotConnectedException;
    method public void setIntProperty(int, int, int) throws android.car.CarNotConnectedException;
    method public synchronized void unregisterCallback(android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback);
    field public static final int FAN_DIRECTION_DEFROST = 4; // 0x4
    field public static final int FAN_DIRECTION_FACE = 1; // 0x1
    field public static final int FAN_DIRECTION_FLOOR = 2; // 0x2
    field public static final int ID_MIRROR_DEFROSTER_ON = 339739916; // 0x1440050c
    field public static final int ID_OUTSIDE_AIR_TEMP = 291505923; // 0x11600703
    field public static final int ID_STEERING_WHEEL_HEAT = 289408269; // 0x1140050d
    field public static final int ID_TEMPERATURE_DISPLAY_UNITS = 289408270; // 0x1140050e
    field public static final int ID_WINDOW_DEFROSTER_ON = 320865540; // 0x13200504
    field public static final int ID_ZONED_AC_ON = 354419973; // 0x15200505
    field public static final int ID_ZONED_AIR_RECIRCULATION_ON = 354419976; // 0x15200508
    field public static final int ID_ZONED_AUTOMATIC_MODE_ON = 354419978; // 0x1520050a
    field public static final int ID_ZONED_DUAL_ZONE_ON = 354419977; // 0x15200509
    field public static final int ID_ZONED_FAN_DIRECTION = 356517121; // 0x15400501
    field public static final int ID_ZONED_FAN_DIRECTION_AVAILABLE = 356582673; // 0x15410511
    field public static final int ID_ZONED_FAN_SPEED_RPM = 356517135; // 0x1540050f
    field public static final int ID_ZONED_FAN_SPEED_SETPOINT = 356517120; // 0x15400500
    field public static final int ID_ZONED_HVAC_AUTO_RECIRC_ON = 354419986; // 0x15200512
    field public static final int ID_ZONED_HVAC_POWER_ON = 354419984; // 0x15200510
    field public static final int ID_ZONED_MAX_AC_ON = 354419974; // 0x15200506
    field public static final int ID_ZONED_MAX_DEFROST_ON = 354419975; // 0x15200507
    field public static final int ID_ZONED_SEAT_TEMP = 356517131; // 0x1540050b
    field public static final int ID_ZONED_TEMP_ACTUAL = 358614274; // 0x15600502
    field public static final int ID_ZONED_TEMP_SETPOINT = 358614275; // 0x15600503
  }

  public static abstract interface CarHvacManager.CarHvacEventCallback {
    method public abstract void onChangeEvent(android.car.hardware.CarPropertyValue);
    method public abstract void onErrorEvent(int, int);
  }

}

package android.car.hardware.power {

  public class CarPowerManager {
  }

  public static abstract interface CarPowerManager.CarPowerStateListener {
    method public abstract void onStateChanged(int, java.util.concurrent.CompletableFuture<java.lang.Void>);
    field public static final int ON = 6; // 0x6
    field public static final int SHUTDOWN_CANCELLED = 8; // 0x8
    field public static final int SHUTDOWN_ENTER = 5; // 0x5
    field public static final int SHUTDOWN_PREPARE = 7; // 0x7
    field public static final int SUSPEND_ENTER = 2; // 0x2
    field public static final int SUSPEND_EXIT = 3; // 0x3
  }

}

package android.car.input {

  public abstract class CarInputHandlingService extends android.app.Service {
    ctor protected CarInputHandlingService(android.car.input.CarInputHandlingService.InputFilter[]);
    method public android.os.IBinder onBind(android.content.Intent);
    method protected abstract void onKeyEvent(android.view.KeyEvent, int);
    field public static final int INPUT_CALLBACK_BINDER_CODE = 1; // 0x1
    field public static final java.lang.String INPUT_CALLBACK_BINDER_KEY = "callback_binder";
  }

  public static class CarInputHandlingService.InputFilter implements android.os.Parcelable {
    ctor public CarInputHandlingService.InputFilter(int, int);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public final int mKeyCode;
    field public final int mTargetDisplay;
  }

}

package android.car.media {

  public final class CarAudioManager {
    method public android.car.media.CarAudioPatchHandle createAudioPatch(java.lang.String, int, int) throws android.car.CarNotConnectedException;
    method public java.lang.String[] getExternalSources() throws android.car.CarNotConnectedException;
    method public int getGroupMaxVolume(int) throws android.car.CarNotConnectedException;
    method public int getGroupMinVolume(int) throws android.car.CarNotConnectedException;
    method public int getGroupVolume(int) throws android.car.CarNotConnectedException;
    method public int[] getUsagesForVolumeGroupId(int) throws android.car.CarNotConnectedException;
    method public int getVolumeGroupCount() throws android.car.CarNotConnectedException;
    method public int getVolumeGroupIdForUsage(int) throws android.car.CarNotConnectedException;
    method public void registerVolumeCallback(android.os.IBinder) throws android.car.CarNotConnectedException;
    method public void registerVolumeChangeObserver(android.database.ContentObserver);
    method public void releaseAudioPatch(android.car.media.CarAudioPatchHandle) throws android.car.CarNotConnectedException;
    method public void setBalanceTowardRight(float) throws android.car.CarNotConnectedException;
    method public void setFadeTowardFront(float) throws android.car.CarNotConnectedException;
    method public void setGroupVolume(int, int, int) throws android.car.CarNotConnectedException;
    method public void unregisterVolumeCallback(android.os.IBinder) throws android.car.CarNotConnectedException;
    method public void unregisterVolumeChangeObserver(android.database.ContentObserver);
  }

}

package android.car.navigation {

  public class CarNavigationInstrumentCluster implements android.os.Parcelable {
    ctor public CarNavigationInstrumentCluster(android.car.navigation.CarNavigationInstrumentCluster);
    method public static android.car.navigation.CarNavigationInstrumentCluster createCluster(int);
    method public static android.car.navigation.CarNavigationInstrumentCluster createCustomImageCluster(int, int, int, int);
    method public int describeContents();
    method public int getImageColorDepthBits();
    method public int getImageHeight();
    method public int getImageWidth();
    method public int getMinIntervalMillis();
    method public int getType();
    method public boolean supportsCustomImages();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED = 1; // 0x1
    field public static final int CLUSTER_TYPE_IMAGE_CODES_ONLY = 2; // 0x2
    field public static final android.os.Parcelable.Creator<android.car.navigation.CarNavigationInstrumentCluster> CREATOR;
  }

}

package android.car.storagemonitoring {

  public final class CarStorageMonitoringManager {
    method public java.util.List<android.car.storagemonitoring.IoStatsEntry> getAggregateIoStats() throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.storagemonitoring.IoStatsEntry> getBootIoStats() throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.storagemonitoring.IoStats> getIoStatsDeltas() throws android.car.CarNotConnectedException;
    method public int getPreEolIndicatorStatus() throws android.car.CarNotConnectedException;
    method public long getShutdownDiskWriteAmount() throws android.car.CarNotConnectedException;
    method public android.car.storagemonitoring.WearEstimate getWearEstimate() throws android.car.CarNotConnectedException;
    method public java.util.List<android.car.storagemonitoring.WearEstimateChange> getWearEstimateHistory() throws android.car.CarNotConnectedException;
    method public void registerListener(android.car.storagemonitoring.CarStorageMonitoringManager.IoStatsListener) throws android.car.CarNotConnectedException;
    method public void unregisterListener(android.car.storagemonitoring.CarStorageMonitoringManager.IoStatsListener) throws android.car.CarNotConnectedException;
    field public static final java.lang.String INTENT_EXCESSIVE_IO = "android.car.storagemonitoring.EXCESSIVE_IO";
    field public static final int PRE_EOL_INFO_NORMAL = 1; // 0x1
    field public static final int PRE_EOL_INFO_UNKNOWN = 0; // 0x0
    field public static final int PRE_EOL_INFO_URGENT = 3; // 0x3
    field public static final int PRE_EOL_INFO_WARNING = 2; // 0x2
    field public static final long SHUTDOWN_COST_INFO_MISSING = -1L; // 0xffffffffffffffffL
  }

  public static abstract interface CarStorageMonitoringManager.IoStatsListener {
    method public abstract void onSnapshot(android.car.storagemonitoring.IoStats);
  }

  public class IoStats implements android.os.Parcelable {
    ctor public IoStats(java.util.List<android.car.storagemonitoring.IoStatsEntry>, long);
    ctor public IoStats(android.os.Parcel);
    ctor public IoStats(org.json.JSONObject) throws org.json.JSONException;
    method public int describeContents();
    method public android.car.storagemonitoring.IoStatsEntry.Metrics getBackgroundTotals();
    method public android.car.storagemonitoring.IoStatsEntry.Metrics getForegroundTotals();
    method public java.util.List<android.car.storagemonitoring.IoStatsEntry> getStats();
    method public long getTimestamp();
    method public android.car.storagemonitoring.IoStatsEntry.Metrics getTotals();
    method public android.car.storagemonitoring.IoStatsEntry getUserIdStats(int);
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.IoStats> CREATOR;
  }

  public final class IoStatsEntry implements android.os.Parcelable {
    ctor public IoStatsEntry(int, long, android.car.storagemonitoring.IoStatsEntry.Metrics, android.car.storagemonitoring.IoStatsEntry.Metrics);
    ctor public IoStatsEntry(android.os.Parcel);
    ctor public IoStatsEntry(android.car.storagemonitoring.UidIoRecord, long);
    ctor public IoStatsEntry(org.json.JSONObject) throws org.json.JSONException;
    method public int describeContents();
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.IoStatsEntry> CREATOR;
    field public final android.car.storagemonitoring.IoStatsEntry.Metrics background;
    field public final android.car.storagemonitoring.IoStatsEntry.Metrics foreground;
    field public final long runtimeMillis;
    field public final int uid;
  }

  public static final class IoStatsEntry.Metrics implements android.os.Parcelable {
    ctor public IoStatsEntry.Metrics(long, long, long, long, long);
    ctor public IoStatsEntry.Metrics(android.os.Parcel);
    ctor public IoStatsEntry.Metrics(org.json.JSONObject) throws org.json.JSONException;
    method public int describeContents();
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.IoStatsEntry.Metrics> CREATOR;
    field public final long bytesRead;
    field public final long bytesReadFromStorage;
    field public final long bytesWritten;
    field public final long bytesWrittenToStorage;
    field public final long fsyncCalls;
  }

  public class LifetimeWriteInfo implements android.os.Parcelable {
    ctor public LifetimeWriteInfo(java.lang.String, java.lang.String, long);
    ctor public LifetimeWriteInfo(android.os.Parcel);
    ctor public LifetimeWriteInfo(org.json.JSONObject) throws org.json.JSONException;
    method public int describeContents();
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.IoStats> CREATOR;
    field public final java.lang.String fstype;
    field public final java.lang.String partition;
    field public final long writtenBytes;
  }

  public final class UidIoRecord {
    ctor public UidIoRecord(int, long, long, long, long, long, long, long, long, long, long);
    field public final long background_fsync;
    field public final long background_rchar;
    field public final long background_read_bytes;
    field public final long background_wchar;
    field public final long background_write_bytes;
    field public final long foreground_fsync;
    field public final long foreground_rchar;
    field public final long foreground_read_bytes;
    field public final long foreground_wchar;
    field public final long foreground_write_bytes;
    field public final int uid;
  }

  public class WearEstimate implements android.os.Parcelable {
    ctor public WearEstimate(int, int);
    ctor public WearEstimate(android.os.Parcel);
    ctor public WearEstimate(android.util.JsonReader) throws java.io.IOException;
    method public int describeContents();
    method public void writeToJson(android.util.JsonWriter) throws java.io.IOException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.WearEstimate> CREATOR;
    field public static final int UNKNOWN = -1; // 0xffffffff
    field public final int typeA;
    field public final int typeB;
  }

  public class WearEstimateChange implements android.os.Parcelable {
    ctor public WearEstimateChange(android.car.storagemonitoring.WearEstimate, android.car.storagemonitoring.WearEstimate, long, java.time.Instant, boolean);
    ctor public WearEstimateChange(android.os.Parcel);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.storagemonitoring.WearEstimateChange> CREATOR;
    field public final java.time.Instant dateAtChange;
    field public final boolean isAcceptableDegradation;
    field public final android.car.storagemonitoring.WearEstimate newEstimate;
    field public final android.car.storagemonitoring.WearEstimate oldEstimate;
    field public final long uptimeAtChange;
  }

}

package android.car.test {

  public class CarTestManagerBinderWrapper {
    ctor public CarTestManagerBinderWrapper(android.os.IBinder);
    method public void onCarDisconnected();
    field public final android.os.IBinder binder;
  }

}

package android.car.vms {

  public final class VmsAvailableLayers implements android.os.Parcelable {
    ctor public VmsAvailableLayers(java.util.Set<android.car.vms.VmsAssociatedLayer>, int);
    method public int describeContents();
    method public java.util.Set<android.car.vms.VmsAssociatedLayer> getAssociatedLayers();
    method public int getSequence();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.vms.VmsAvailableLayers> CREATOR;
  }

  public final class VmsLayer implements android.os.Parcelable {
    ctor public VmsLayer(int, int, int);
    method public int describeContents();
    method public int getSubtype();
    method public int getType();
    method public int getVersion();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.vms.VmsLayer> CREATOR;
  }

  public final class VmsLayerDependency implements android.os.Parcelable {
    ctor public VmsLayerDependency(android.car.vms.VmsLayer, java.util.Set<android.car.vms.VmsLayer>);
    ctor public VmsLayerDependency(android.car.vms.VmsLayer);
    method public int describeContents();
    method public java.util.Set<android.car.vms.VmsLayer> getDependencies();
    method public android.car.vms.VmsLayer getLayer();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.vms.VmsLayerDependency> CREATOR;
  }

  public final class VmsLayersOffering implements android.os.Parcelable {
    ctor public VmsLayersOffering(java.util.Set<android.car.vms.VmsLayerDependency>, int);
    method public int describeContents();
    method public java.util.Set<android.car.vms.VmsLayerDependency> getDependencies();
    method public int getPublisherId();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.car.vms.VmsLayersOffering> CREATOR;
  }

  public final class VmsOperationRecorder {
    ctor public VmsOperationRecorder(android.car.vms.VmsOperationRecorder.Writer);
    method public void addHalSubscription(int, android.car.vms.VmsLayer);
    method public void addPromiscuousSubscription(int);
    method public void addSubscription(int, android.car.vms.VmsLayer);
    method public static android.car.vms.VmsOperationRecorder get();
    method public void getPublisherId(int);
    method public void removeHalSubscription(int, android.car.vms.VmsLayer);
    method public void removePromiscuousSubscription(int);
    method public void removeSubscription(int, android.car.vms.VmsLayer);
    method public void setHalPublisherLayersOffering(android.car.vms.VmsLayersOffering);
    method public void setLayersOffering(android.car.vms.VmsLayersOffering);
    method public void setPublisherLayersOffering(android.car.vms.VmsLayersOffering);
    method public void startMonitoring();
    method public void stopMonitoring();
    method public void subscribe(android.car.vms.VmsLayer);
    method public void subscribe(android.car.vms.VmsLayer, int);
    method public void unsubscribe(android.car.vms.VmsLayer);
    method public void unsubscribe(android.car.vms.VmsLayer, int);
  }

  public abstract class VmsPublisherClientService extends android.app.Service {
    ctor public VmsPublisherClientService();
    method public final int getPublisherId(byte[]);
    method public final android.car.vms.VmsSubscriptionState getSubscriptions();
    method public android.os.IBinder onBind(android.content.Intent);
    method protected abstract void onVmsPublisherServiceReady();
    method public abstract void onVmsSubscriptionChange(android.car.vms.VmsSubscriptionState);
    method public final void publish(android.car.vms.VmsLayer, int, byte[]);
    method public final void setLayersOffering(android.car.vms.VmsLayersOffering);
  }

  public final class VmsSubscriberManager {
    method public void clearVmsSubscriberClientCallback() throws android.car.CarNotConnectedException;
    method public android.car.vms.VmsAvailableLayers getAvailableLayers() throws android.car.CarNotConnectedException, java.lang.IllegalStateException;
    method public byte[] getPublisherInfo(int) throws android.car.CarNotConnectedException, java.lang.IllegalStateException;
    method public void setVmsSubscriberClientCallback(java.util.concurrent.Executor, android.car.vms.VmsSubscriberManager.VmsSubscriberClientCallback) throws android.car.CarNotConnectedException;
    method public void startMonitoring() throws android.car.CarNotConnectedException;
    method public void stopMonitoring();
    method public void subscribe(android.car.vms.VmsLayer) throws android.car.CarNotConnectedException;
    method public void subscribe(android.car.vms.VmsLayer, int) throws android.car.CarNotConnectedException;
    method public void unsubscribe(android.car.vms.VmsLayer);
    method public void unsubscribe(android.car.vms.VmsLayer, int);
  }

  public static abstract interface VmsSubscriberManager.VmsSubscriberClientCallback {
    method public abstract void onLayersAvailabilityChanged(android.car.vms.VmsAvailableLayers);
    method public abstract void onVmsMessageReceived(android.car.vms.VmsLayer, byte[]);
  }

}

