1e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park/*
2e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * Copyright (C) 2015 The Android Open Source Project
3e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park *
4e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * Licensed under the Apache License, Version 2.0 (the "License");
5e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * you may not use this file except in compliance with the License.
6e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * You may obtain a copy of the License at
7e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park *
8e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park *      http://www.apache.org/licenses/LICENSE-2.0
9e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park *
10e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * Unless required by applicable law or agreed to in writing, software
11e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * distributed under the License is distributed on an "AS IS" BASIS,
12e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * See the License for the specific language governing permissions and
14e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park * limitations under the License.
15e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park */
16e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
17e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage android.support.car.hardware;
18e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
19e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.Manifest;
20af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport android.support.annotation.IntDef;
21235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkivimport android.support.annotation.RequiresPermission;
22e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.support.car.Car;
23e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.support.car.CarManagerBase;
24e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.support.car.CarNotConnectedException;
25e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
26af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport java.lang.annotation.Retention;
27af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport java.lang.annotation.RetentionPolicy;
28af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park
29e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park/**
3019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham *  Enables applications to monitor car sensor data. Applications register listeners to this
3119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham *  manager to subscribe to individual sensor streams using the SENSOR_TYPE_* constants as the
3219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham *  keys. Data points are returned as {@link CarSensorEvent} objects that have translations for
3319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham *  many built-in data types. For vendor extension streams, interpret data based on
3419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham *  vendor-provided documentation.
35e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park */
36e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpublic abstract class CarSensorManager implements CarManagerBase {
37e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
3819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the direction of the car as an angle in degrees measured clockwise with 0 degree
3919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * pointing North. Sensor data in {@link CarSensorEvent} is a float (floatValues[0]).
40e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
419eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_COMPASS = 1;
42e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
4319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent vehicle speed in meters per second (m/s). Sensor data in
4419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * {@link CarSensorEvent} is a float >= 0. Requires {@link Car#PERMISSION_SPEED} permission.
459aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
46e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
479eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_CAR_SPEED = 2;
48e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
4919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the engine RPM of the car. Sensor data in {@link CarSensorEvent} is a float.
509aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
51e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
529eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RPM = 3;
53e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
5419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the total travel distance of the car in kilometers. Sensor data is a float.
5519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Requires {@link Car#PERMISSION_MILEAGE} permission.
569aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
57e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
589eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_ODOMETER = 4;
59e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
6019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the fuel level of the car. In {@link CarSensorEvent}, floatValues[{@link
619eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup     * CarSensorEvent#INDEX_FUEL_LEVEL_IN_PERCENTILE}] represents fuel level in percentile (0 to
629eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup     * 100) while floatValues[{@link CarSensorEvent#INDEX_FUEL_LEVEL_IN_DISTANCE}] represents
6319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * estimated range in kilometers with the remaining fuel. The gas mileage used for the
6419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * estimation may not represent the current driving condition. Requires {@link
659eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup     * Car#PERMISSION_FUEL} permission.
669aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
67e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
689eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_FUEL_LEVEL = 5;
69e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
7019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the current status of parking brake. Sensor data in {@link CarSensorEvent} is in
7119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * intValues[0]. A value of 1 indicates the parking brake is engaged; a value of 0 indicates
72d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * the parking brake is not engaged.
73d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * For this sensor, rate in {@link #addListener(OnSensorChangedListener, int, int)} is
7419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * ignored and all changes are notified.
75e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
769eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_PARKING_BRAKE = 6;
77e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
7819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the current position of transmission gear. Sensor data in {@link
7919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * CarSensorEvent} is in intValues[0]. For the meaning of the value, check {@link
809eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup     * CarSensorEvent#GEAR_NEUTRAL} and other GEAR_*.
819aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
82e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
839eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_GEAR = 7;
849eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup
851e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    /** @hide */
869eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED8 = 8;
879eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup
88e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
8919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the current status of the day/night sensor. Sensor data is in intValues[0].
90e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
919eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_NIGHT = 9;
92e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
9319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the location. Sensor data is floatValues.
949aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
95e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
969eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_LOCATION = 10;
97e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
9819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Represent the current driving status of car. Different user interactions should be used
9919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * depending on the current driving status. Driving status is in intValues[0].
100e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
1019eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_DRIVING_STATUS = 11;
102e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
10319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Environment (such as temperature and pressure).
1049aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup     * @hide
105e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
1069eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_ENVIRONMENT = 12;
1079eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1089eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED13 = 13;
1099eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1109eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_ACCELEROMETER = 14;
1119eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1129eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED15 = 15;
1139eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1149eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED16 = 16;
1159eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1169eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_GPS_SATELLITE = 17;
1179eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    /** @hide */
1189eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_GYROSCOPE = 18;
119e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /** @hide */
1209eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED19 = 19;
121e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /** @hide */
1229eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED20 = 20;
123e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /** @hide */
1249eae32f8c09816d35ef28c14ed1f0c5fa39c21f1Jason Tholstrup    public static final int SENSOR_TYPE_RESERVED21 = 21;
1251e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    /** @hide */
1261e5a88bcaea73af4a140616b4e9ed5fcfa60d990Pavel Maltsev    public static final int SENSOR_TYPE_RESERVED22 = 22;
127289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    /**
128289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Represents wheel distance in millimeters.  Some cars may not have individual sensors on each
129289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * wheel.  If a value is not available, -1 will be reported.  The wheel distance accumulates
130289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * over time.
131289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Requires {@link Car#PERMISSION_MILEAGE} permission.
132289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     */
133289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    public static final int SENSOR_TYPE_WHEEL_TICK_DISTANCE         = 23;
134289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    /**
135289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Set to true when ABS is active.  This sensor is event driven.
136289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Requires {@link Car#PERMISSION_VEHICLE_DYNAMICS_STATE} permission.
137289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     */
138289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    public static final int SENSOR_TYPE_ABS_ACTIVE                  = 24;
139289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    /**
140289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Set to true when traction control is active.  This sensor is event driven.
141289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     * Requires {@link Car#PERMISSION_VEHICLE_DYNAMICS_STATE} permission.
142289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik     */
143289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik    public static final int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE     = 25;
144e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
145e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
146e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * Sensors defined in this range [{@link #SENSOR_TYPE_VENDOR_EXTENSION_START},
14719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * {@link #SENSOR_TYPE_VENDOR_EXTENSION_END}] are for vendors and should be used only
14819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * by the system app to access sensors not defined as standard types.
14919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Sensors supported in this range can vary depending on car models/manufacturers.
15019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Third-party apps should not use sensors in this range as they are not compatible across
15119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * all cars; third-party apps that attempt to access a sensor in this range trigger a
15219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * security exception (as access is restricted to system apps).
153e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     *
154e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * @hide
155e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
156e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_TYPE_VENDOR_EXTENSION_START = 0x60000000;
157d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup    /** @hide */
158e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_TYPE_VENDOR_EXTENSION_END   = 0x6fffffff;
159e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
160af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** @hide */
161af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @IntDef({
162af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_COMPASS,
163af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_CAR_SPEED,
164af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_RPM,
165af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_ODOMETER,
166af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_FUEL_LEVEL,
167af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_PARKING_BRAKE,
168af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_GEAR,
169af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_NIGHT,
170af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_LOCATION,
171af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_DRIVING_STATUS,
172af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_ENVIRONMENT,
173af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_ACCELEROMETER,
174af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_TYPE_GPS_SATELLITE,
175289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik        SENSOR_TYPE_GYROSCOPE,
176289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik        SENSOR_TYPE_WHEEL_TICK_DISTANCE,
177289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik        SENSOR_TYPE_ABS_ACTIVE,
178289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik        SENSOR_TYPE_TRACTION_CONTROL_ACTIVE
179af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    })
180af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @Retention(RetentionPolicy.SOURCE)
181af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public @interface SensorType {}
182af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park
18319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham    /** Read sensor at the default normal rate set for each sensors. This is default rate. */
184e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_RATE_NORMAL  = 3;
1851ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup    /**@hide*/
186e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_RATE_UI = 2;
1871ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup    /**@hide*/
188e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_RATE_FAST = 1;
189e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /** Read sensor at the maximum rate. Actual rate will be different depending on the sensor. */
190e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public static final int SENSOR_RATE_FASTEST = 0;
191e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
192af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** @hide */
193af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @IntDef({
194af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_RATE_NORMAL,
195af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_RATE_UI,
196af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_RATE_FAST,
197af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        SENSOR_RATE_FASTEST
198af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    })
199af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @Retention(RetentionPolicy.SOURCE)
200af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public @interface SensorRate {}
201af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park
202e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
203e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * Listener for car sensor data change.
204e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * Callbacks are called in the Looper context.
205e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
206d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup    public interface OnSensorChangedListener {
207e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park        /**
20819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham         * Called when there is new sensor data from car.
209d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup         * @param manager The manager the listener is attached to.  Useful if the app wished to
210d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup         * unregister.
211e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park         * @param event Incoming sensor event for the given sensor type.
212e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park         */
213d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup        void onSensorChanged(final CarSensorManager manager, final CarSensorEvent event);
214e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    }
215e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
216e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
21719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Get the list of CarSensors available in the connected car.
21819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @return Array of all sensor types supported.
219d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * @throws CarNotConnectedException if the connection to the car service has been lost.
220e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
221e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    public abstract int[] getSupportedSensors() throws CarNotConnectedException;
222e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
223e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
22419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Indicate support for a given sensor.
225e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * @param sensorType
22619c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @return Returns {@code true} if the sensor is supported.
227d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * @throws CarNotConnectedException if the connection to the car service has been lost.
228e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
229af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public abstract boolean isSensorSupported(@SensorType int sensorType)
230af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException;
231e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
232e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
233d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * Register {@link OnSensorChangedListener} to get repeated sensor updates. Can register
23419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * multiple listeners for a single sensor or use the same listener for different
23519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * sensors. If the same listener is registered again for the same sensor, it is ignored or
23619c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * updated (depending on the rate).
237e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * <p>
238d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * The {@link OnSensorChangedListener} is the identifier for the request and the same
239d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * instance must be passed into {@link #removeListener(OnSensorChangedListener)}.
240d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * <p>
241e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     *
24219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @param sensorType Sensor type to subscribe.
24319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @param rate How fast sensor events are delivered. Should be one of
24419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     *        {@link #SENSOR_RATE_FASTEST} or {@link #SENSOR_RATE_NORMAL}. Rate may not be
24519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     *        respected, especially when the same sensor is registered with a different listener
24619c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     *        and with different rates.
24719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @return Returns {@code true} if the sensor was successfully enabled.
248d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * @throws CarNotConnectedException if the connection to the car service has been lost.
24919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @throws IllegalArgumentException if wrong argument (such as wrong rate).
25019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @throws SecurityException if missing the appropriate permission.
251e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
252e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    @RequiresPermission(anyOf={Manifest.permission.ACCESS_FINE_LOCATION, Car.PERMISSION_SPEED,
253289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik            Car.PERMISSION_MILEAGE, Car.PERMISSION_FUEL, Car.PERMISSION_VEHICLE_DYNAMICS_STATE},
254289ab99688d226518e47a7e47c9ffc20f221f0a6Steve Paik            conditional=true)
255af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public abstract boolean addListener(OnSensorChangedListener listener,
256af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            @SensorType int sensorType, @SensorRate int rate)
257af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park                    throws CarNotConnectedException, IllegalArgumentException;
258e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
259e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
26019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Stop getting sensor updates for the given listener. If there are multiple registrations for
26119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * this listener, all listening is stopped.
2621ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup     * @param listener The listener to remove.
263e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
264150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park    public abstract  void removeListener(OnSensorChangedListener listener);
265e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
266e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
26719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * Stop getting sensor updates for the given listener and sensor. If the same listener is used
26819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * for other sensors, those subscriptions are not affected.
2691ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup     * @param listener The listener to remove.
2701ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup     * @param sensorType The type to stop receiving notifications for.
271e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
272af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public abstract  void removeListener(OnSensorChangedListener listener,
273150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park            @SensorType int sensorType);
274e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park
275e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park    /**
276e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     * Get the most recent CarSensorEvent for the given type.
27719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @param type A sensor to request.
27819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham     * @return null if no sensor update since connection to the car.
279d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup     * @throws CarNotConnectedException if the connection to the car service has been lost.
280e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park     */
281af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public abstract CarSensorEvent getLatestSensorEvent(@SensorType int type)
282af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException;
283a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik
284a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik    /**
285a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     * Get the config data for the given type.
286a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     * @param sensor type to request
287a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     * @return CarSensorConfig object
288a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     * @throws CarNotConnectedException if the connection to the car service has been lost.
289a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     * @hide
290a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik     */
291a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik    public abstract CarSensorConfig getSensorConfig(@SensorType int type)
292a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik            throws CarNotConnectedException;
293a2819901c1b4f56e4950dd5cb6bf6c9e8042cf4cSteve Paik
294e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park}
295