Merge "Add new purpose to the HAL layer."
diff --git a/include/hardware/bt_av.h b/include/hardware/bt_av.h
index 9b32216..e5f7b31 100644
--- a/include/hardware/bt_av.h
+++ b/include/hardware/bt_av.h
@@ -17,6 +17,10 @@
 #ifndef ANDROID_INCLUDE_BT_AV_H
 #define ANDROID_INCLUDE_BT_AV_H
 
+#include <vector>
+
+#include <hardware/bluetooth.h>
+
 __BEGIN_DECLS
 
 /* Bluetooth AV connection states */
@@ -34,6 +38,81 @@
     BTAV_AUDIO_STATE_STARTED,
 } btav_audio_state_t;
 
+/*
+ * Enum values for each A2DP supported codec.
+ * There should be a separate entry for each A2DP codec that is supported
+ * for encoding (SRC), and for decoding purpose (SINK).
+ */
+typedef enum {
+  BTAV_A2DP_CODEC_INDEX_SOURCE_MIN = 0,
+
+  // Add an entry for each source codec here.
+  // NOTE: The values should be same as those listed in the following file:
+  //   BluetoothCodecConfig.java
+  BTAV_A2DP_CODEC_INDEX_SOURCE_SBC = 0,
+  BTAV_A2DP_CODEC_INDEX_SOURCE_APTX,
+  BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD,
+  BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC,
+
+  BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
+
+  BTAV_A2DP_CODEC_INDEX_SINK_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
+
+  // Add an entry for each sink codec here
+  BTAV_A2DP_CODEC_INDEX_SINK_SBC = BTAV_A2DP_CODEC_INDEX_SINK_MIN,
+
+  BTAV_A2DP_CODEC_INDEX_SINK_MAX,
+
+  BTAV_A2DP_CODEC_INDEX_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MIN,
+  BTAV_A2DP_CODEC_INDEX_MAX = BTAV_A2DP_CODEC_INDEX_SINK_MAX
+} btav_a2dp_codec_index_t;
+
+typedef uint32_t btav_a2dp_codec_priority_t;
+
+typedef enum {
+  BTAV_A2DP_CODEC_SAMPLE_RATE_NONE   = 0x0,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_44100  = 0x1 << 0,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_48000  = 0x1 << 1,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_88200  = 0x1 << 2,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_96000  = 0x1 << 3,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_176400 = 0x1 << 4,
+  BTAV_A2DP_CODEC_SAMPLE_RATE_192000 = 0x1 << 5
+} btav_a2dp_codec_sample_rate_t;
+
+typedef enum {
+  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE = 0x0,
+  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16   = 0x1 << 0,
+  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24   = 0x1 << 1,
+  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32   = 0x1 << 2
+} btav_a2dp_codec_bits_per_sample_t;
+
+typedef enum {
+  BTAV_A2DP_CODEC_CHANNEL_MODE_NONE   = 0x0,
+  BTAV_A2DP_CODEC_CHANNEL_MODE_MONO   = 0x1 << 0,
+  BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO = 0x1 << 1
+} btav_a2dp_codec_channel_mode_t;
+
+/*
+ * Structure for representing codec capability or configuration.
+ * It is used for configuring A2DP codec preference, and for reporting back
+ * current configuration or codec capability.
+ * For codec capability, fields "sample_rate", "bits_per_sample" and
+ * "channel_mode" can contain bit-masks with all supported features.
+ */
+typedef struct {
+  btav_a2dp_codec_index_t codec_type;
+  btav_a2dp_codec_priority_t codec_priority; // Codec selection priority
+                                // relative to other codecs: larger value
+                                // means higher priority. If 0, reset to
+                                // default.
+  btav_a2dp_codec_sample_rate_t sample_rate;
+  btav_a2dp_codec_bits_per_sample_t bits_per_sample;
+  btav_a2dp_codec_channel_mode_t channel_mode;
+  int64_t codec_specific_1;     // Codec-specific value 1
+  int64_t codec_specific_2;     // Codec-specific value 2
+  int64_t codec_specific_3;     // Codec-specific value 3
+  int64_t codec_specific_4;     // Codec-specific value 4
+} btav_a2dp_codec_config_t;
 
 /** Callback for connection state change.
  *  state will have one of the values from btav_connection_state_t
@@ -48,23 +127,38 @@
                                                bt_bdaddr_t *bd_addr);
 
 /** Callback for audio configuration change.
- *  Used only for the A2DP sink interface.
- *  state will have one of the values from btav_audio_state_t
+ *  Used only for the A2DP Source interface.
+ */
+typedef void (* btav_audio_source_config_callback)(
+    btav_a2dp_codec_config_t codec_config,
+    std::vector<btav_a2dp_codec_config_t> codec_capabilities);
+
+/** Callback for audio configuration change.
+ *  Used only for the A2DP Sink interface.
  *  sample_rate: sample rate in Hz
  *  channel_count: number of channels (1 for mono, 2 for stereo)
  */
-typedef void (* btav_audio_config_callback)(bt_bdaddr_t *bd_addr,
-                                                uint32_t sample_rate,
-                                                uint8_t channel_count);
+typedef void (* btav_audio_sink_config_callback)(bt_bdaddr_t *bd_addr,
+                                                 uint32_t sample_rate,
+                                                 uint8_t channel_count);
 
-/** BT-AV callback structure. */
+/** BT-AV A2DP Source callback structure. */
 typedef struct {
-    /** set to sizeof(btav_callbacks_t) */
+    /** set to sizeof(btav_source_callbacks_t) */
     size_t      size;
     btav_connection_state_callback  connection_state_cb;
     btav_audio_state_callback audio_state_cb;
-    btav_audio_config_callback audio_config_cb;
-} btav_callbacks_t;
+    btav_audio_source_config_callback audio_config_cb;
+} btav_source_callbacks_t;
+
+/** BT-AV A2DP Source callback structure. */
+typedef struct {
+    /** set to sizeof(btav_sink_callbacks_t) */
+    size_t      size;
+    btav_connection_state_callback  connection_state_cb;
+    btav_audio_state_callback audio_state_cb;
+    btav_audio_sink_config_callback audio_config_cb;
+} btav_sink_callbacks_t;
 
 /**
  * NOTE:
@@ -76,17 +170,42 @@
  *    android_audio_hw library and the Bluetooth stack.
  *
  */
-/** Represents the standard BT-AV interface.
- *  Used for both the A2DP source and sink interfaces.
+
+/** Represents the standard BT-AV A2DP Source interface.
  */
 typedef struct {
 
-    /** set to sizeof(btav_interface_t) */
+    /** set to sizeof(btav_source_interface_t) */
     size_t          size;
     /**
      * Register the BtAv callbacks
      */
-    bt_status_t (*init)( btav_callbacks_t* callbacks );
+    bt_status_t (*init)( btav_source_callbacks_t* callbacks );
+
+    /** connect to headset */
+    bt_status_t (*connect)( bt_bdaddr_t *bd_addr );
+
+    /** dis-connect from headset */
+    bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr );
+
+    /** configure the codecs settings preferences */
+    bt_status_t (*config_codec)(std::vector<btav_a2dp_codec_config_t> codec_preferences);
+
+    /** Closes the interface. */
+    void  (*cleanup)( void );
+
+} btav_source_interface_t;
+
+/** Represents the standard BT-AV A2DP Sink interface.
+ */
+typedef struct {
+
+    /** set to sizeof(btav_sink_interface_t) */
+    size_t          size;
+    /**
+     * Register the BtAv callbacks
+     */
+    bt_status_t (*init)( btav_sink_callbacks_t* callbacks );
 
     /** connect to headset */
     bt_status_t (*connect)( bt_bdaddr_t *bd_addr );
@@ -102,7 +221,7 @@
 
     /** Sets the audio track gain. */
     void  (*set_audio_track_gain)( float gain );
-} btav_interface_t;
+} btav_sink_interface_t;
 
 __END_DECLS
 
diff --git a/include/hardware/bt_hd.h b/include/hardware/bt_hd.h
index 459751c..263f29f 100644
--- a/include/hardware/bt_hd.h
+++ b/include/hardware/bt_hd.h
@@ -105,7 +105,7 @@
     bt_status_t (*unregister_app)(void);
 
     /** connects to host with virtual cable */
-    bt_status_t (*connect)(void);
+    bt_status_t (*connect)(bt_bdaddr_t *bd_addr);
 
     /** disconnects from currently connected host */
     bt_status_t (*disconnect)(void);
diff --git a/include/hardware/camera_common.h b/include/hardware/camera_common.h
index c74d7bb..7bafa88 100644
--- a/include/hardware/camera_common.h
+++ b/include/hardware/camera_common.h
@@ -143,8 +143,8 @@
 #define CAMERA_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0) // DEPRECATED
 #define CAMERA_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0) // NO LONGER SUPPORTED
 #define CAMERA_DEVICE_API_VERSION_2_1 HARDWARE_DEVICE_API_VERSION(2, 1) // NO LONGER SUPPORTED
-#define CAMERA_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0)
-#define CAMERA_DEVICE_API_VERSION_3_1 HARDWARE_DEVICE_API_VERSION(3, 1)
+#define CAMERA_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0) // NO LONGER SUPPORTED
+#define CAMERA_DEVICE_API_VERSION_3_1 HARDWARE_DEVICE_API_VERSION(3, 1) // NO LONGER SUPPORTED
 #define CAMERA_DEVICE_API_VERSION_3_2 HARDWARE_DEVICE_API_VERSION(3, 2)
 #define CAMERA_DEVICE_API_VERSION_3_3 HARDWARE_DEVICE_API_VERSION(3, 3)
 #define CAMERA_DEVICE_API_VERSION_3_4 HARDWARE_DEVICE_API_VERSION(3, 4)
diff --git a/include/hardware/fingerprint.h b/include/hardware/fingerprint.h
index e7c825f..408fabd 100644
--- a/include/hardware/fingerprint.h
+++ b/include/hardware/fingerprint.h
@@ -52,6 +52,7 @@
     FINGERPRINT_ERROR_NO_SPACE = 4, /* No space available to store a template */
     FINGERPRINT_ERROR_CANCELED = 5, /* The current operation can't proceed. See above. */
     FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6, /* fingerprint with given id can't be removed */
+    FINGERPRINT_ERROR_LOCKOUT = 7, /* the fingerprint hardware is in lockout due to too many attempts */
     FINGERPRINT_ERROR_VENDOR_BASE = 1000 /* vendor-specific error messages start here */
 } fingerprint_error_t;
 
@@ -70,6 +71,8 @@
     FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3, /* sensor needs to be cleaned */
     FINGERPRINT_ACQUIRED_TOO_SLOW = 4, /* mostly swipe-type sensors; not enough data collected */
     FINGERPRINT_ACQUIRED_TOO_FAST = 5, /* for swipe and area sensors; tell user to slow down*/
+    FINGERPRINT_ACQUIRED_DETECTED = 6, /* when the finger is first detected. Used to optimize wakeup.
+                                          Should be followed by one of the above messages */
     FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000 /* vendor-specific acquisition messages start here */
 } fingerprint_acquired_info_t;
 
diff --git a/include/hardware/gralloc1.h b/include/hardware/gralloc1.h
index f58403c..e97126e 100644
--- a/include/hardware/gralloc1.h
+++ b/include/hardware/gralloc1.h
@@ -74,7 +74,7 @@
     GRALLOC1_CONSUMER_USAGE_FOREIGN_BUFFERS = 1ULL << 21,
 
     /* 1ULL << 22 */
-    /* 1ULL << 23 */
+    GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER = 1ULL << 23,
     /* 1ULL << 24 */
     /* 1ULL << 25 */
     /* 1ULL << 26 */
@@ -193,7 +193,7 @@
     /* 1ULL << 20 */
     /* 1ULL << 21 */
     GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER = 1ULL << 22,
-    /* 1ULL << 23 */
+    GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA = 1ULL << 23,
     /* 1ULL << 24 */
     /* 1ULL << 25 */
     /* 1ULL << 26 */
diff --git a/include/hardware/sensors-base.h b/include/hardware/sensors-base.h
index 465b85d..80ea3a7 100644
--- a/include/hardware/sensors-base.h
+++ b/include/hardware/sensors-base.h
@@ -16,7 +16,7 @@
 enum {
     SENSOR_TYPE_META_DATA = 0,
     SENSOR_TYPE_ACCELEROMETER = 1,
-    SENSOR_TYPE_GEOMAGNETIC_FIELD = 2,
+    SENSOR_TYPE_MAGNETIC_FIELD = 2,
     SENSOR_TYPE_ORIENTATION = 3,
     SENSOR_TYPE_GYROSCOPE = 4,
     SENSOR_TYPE_LIGHT = 5,
@@ -49,20 +49,35 @@
     SENSOR_TYPE_DYNAMIC_SENSOR_META = 32,
     SENSOR_TYPE_ADDITIONAL_INFO = 33,
     SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34,
+    SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED = 35,
     SENSOR_TYPE_DEVICE_PRIVATE_BASE = 65536, // 0x10000
 };
 
 enum {
-    SENSOR_FLAG_WAKE_UP = 1ull, // 1
-    SENSOR_FLAG_CONTINUOUS_MODE = 0ull, // 0
-    SENSOR_FLAG_ON_CHANGE_MODE = 2ull, // 2
-    SENSOR_FLAG_ONE_SHOT_MODE = 4ull, // 4
-    SENSOR_FLAG_SPECIAL_REPORTING_MODE = 6ull, // 6
-    SENSOR_FLAG_SUPPORTS_DATA_INJECTION = 16ull, // 0x10
-    SENSOR_FLAG_DYNAMIC_SENSOR = 32ull, // 0x20
-    SENSOR_FLAG_ADDITIONAL_INFO = 64ull, // 0x40
+    SENSOR_FLAG_WAKE_UP = 1u, // 1
+    SENSOR_FLAG_CONTINUOUS_MODE = 0u, // 0
+    SENSOR_FLAG_ON_CHANGE_MODE = 2u, // 2
+    SENSOR_FLAG_ONE_SHOT_MODE = 4u, // 4
+    SENSOR_FLAG_SPECIAL_REPORTING_MODE = 6u, // 6
+    SENSOR_FLAG_DATA_INJECTION = 16u, // 0x10
+    SENSOR_FLAG_DYNAMIC_SENSOR = 32u, // 0x20
+    SENSOR_FLAG_ADDITIONAL_INFO = 64u, // 0x40
+    SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM = 1024u, // 0x400
+    SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC = 2048u, // 0x800
+    SENSOR_FLAG_MASK_REPORTING_MODE = 14u, // 0xE
+    SENSOR_FLAG_MASK_DIRECT_REPORT = 896u, // 0x380
+    SENSOR_FLAG_MASK_DIRECT_CHANNEL = 3072u, // 0xC00
 };
 
+typedef enum {
+    SENSOR_FLAG_SHIFT_REPORTING_MODE = 1,
+    SENSOR_FLAG_SHIFT_DATA_INJECTION = 4,
+    SENSOR_FLAG_SHIFT_DYNAMIC_SENSOR = 5,
+    SENSOR_FLAG_SHIFT_ADDITIONAL_INFO = 6,
+    SENSOR_FLAG_SHIFT_DIRECT_REPORT = 7,
+    SENSOR_FLAG_SHIFT_DIRECT_CHANNEL = 10,
+} sensor_flag_shift_t;
+
 enum {
     SENSOR_STATUS_NO_CONTACT = -1, // (-1)
     SENSOR_STATUS_UNRELIABLE = 0,
@@ -89,10 +104,31 @@
     AINFO_CHANNEL_LINEAR_TRANSFORM = 131075u, // 131075
     AINFO_CHANNEL_NONLINEAR_MAP = 131076u, // 131076
     AINFO_CHANNEL_RESAMPLER = 131077u, // 131077
+    AINFO_LOCAL_GEOMAGNETIC_FIELD = 196608u, // 0x30000
+    AINFO_LOCAL_GRAVITY = 196609u, // 196609
+    AINFO_DOCK_STATE = 196610u, // 196610
+    AINFO_HIGH_PERFORMANCE_MODE = 196611u, // 196611
+    AINFO_MAGNETIC_FIELD_CALIBRATION = 196612u, // 196612
     AINFO_CUSTOM_START = 268435456u, // 0x10000000
     AINFO_DEBUGGING_START = 1073741824u, // 0x40000000
 } additional_info_type_t;
 
+typedef enum {
+    SENSOR_DIRECT_RATE_STOP = 0,
+    SENSOR_DIRECT_RATE_NORMAL = 1,
+    SENSOR_DIRECT_RATE_FAST = 2,
+    SENSOR_DIRECT_RATE_VERY_FAST = 3,
+} direct_rate_level_t;
+
+typedef enum {
+    SENSOR_DIRECT_MEM_TYPE_ASHMEM = 1,
+    SENSOR_DIRECT_MEM_TYPE_GRALLOC = 2,
+} direct_mem_type_t;
+
+typedef enum {
+    SENSOR_DIRECT_FMT_SENSORS_EVENT = 1,
+} direct_format_t;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/hardware/sensors.h b/include/hardware/sensors.h
index 08a65f8..8c5fa16 100644
--- a/include/hardware/sensors.h
+++ b/include/hardware/sensors.h
@@ -56,14 +56,15 @@
 #define SENSORS_HARDWARE_POLL       "poll"
 
 /**
- * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
- * A Handle identifies a given sensors. The handle is used to activate
- * and/or deactivate sensors.
- * In this version of the API there can only be 256 handles.
+ * Sensor handle is greater than 0 and less than INT32_MAX.
+ *
+ * **** Deprecated ****
+ * Defined values below are kept for code compatibility. Note sensor handle can be as large as
+ * INT32_MAX.
  */
 #define SENSORS_HANDLE_BASE             0
-#define SENSORS_HANDLE_BITS             8
-#define SENSORS_HANDLE_COUNT            (1<<SENSORS_HANDLE_BITS)
+#define SENSORS_HANDLE_BITS             31
+#define SENSORS_HANDLE_COUNT            (1ull<<SENSORS_HANDLE_BITS)
 
 
 /*
@@ -96,8 +97,10 @@
 #define SENSOR_PERMISSION_BODY_SENSORS "android.permission.BODY_SENSORS"
 
 /*
- * Availability: SENSORS_DEVICE_API_VERSION_1_4
- * Sensor HAL modes used in set_operation_mode method
+ * sensor flags legacy names
+ *
+ * please use SENSOR_FLAG_* directly for new implementation.
+ * @see sensor_t
  */
 
 #define SENSOR_FLAG_MASK(nbit, shift)   (((1<<(nbit))-1)<<(shift))
@@ -106,64 +109,82 @@
 /*
  * Mask and shift for reporting mode sensor flags defined above.
  */
-#define REPORTING_MODE_SHIFT            (1)
+#define REPORTING_MODE_SHIFT            SENSOR_FLAG_SHIFT_REPORTING_MODE
 #define REPORTING_MODE_NBIT             (3)
-#define REPORTING_MODE_MASK             SENSOR_FLAG_MASK(REPORTING_MODE_NBIT, REPORTING_MODE_SHIFT)
-                                        // 0xE
+#define REPORTING_MODE_MASK             SENSOR_FLAG_MASK_REPORTING_MODE
 
 /*
  * Mask and shift for data_injection mode sensor flags defined above.
  */
-#define DATA_INJECTION_SHIFT            (4)
-#define DATA_INJECTION_MASK             SENSOR_FLAG_MASK_1(DATA_INJECTION_SHIFT) //0x10
+#define DATA_INJECTION_SHIFT            SENSOR_FLAG_SHIFT_DATA_INJECTION
+#define DATA_INJECTION_MASK             SENSOR_FLAG_DATA_INJECTION
 
 /*
  * Mask and shift for dynamic sensor flag.
  */
-#define DYNAMIC_SENSOR_SHIFT            (5)
-#define DYNAMIC_SENSOR_MASK             SENSOR_FLAG_MASK_1(DYNAMIC_SENSOR_SHIFT) //0x20
+#define DYNAMIC_SENSOR_SHIFT            SENSOR_FLAG_SHIFT_DYNAMIC_SENSOR
+#define DYNAMIC_SENSOR_MASK             SENSOR_FLAG_DYNAMIC_SENSOR
 
 /*
  * Mask and shift for sensor additional information support.
  */
-#define ADDITIONAL_INFO_SHIFT           (6)
-#define ADDITIONAL_INFO_MASK            SENSOR_FLAG_MASK_1(ADDITIONAL_INFO_SHIFT) //0x40
+#define ADDITIONAL_INFO_SHIFT           SENSOR_FLAG_SHIFT_ADDITIONAL_INFO
+#define ADDITIONAL_INFO_MASK            SENSOR_FLAG_ADDITIONAL_INFO
 
-#define SENSOR_STRING_TYPE_ACCELEROMETER             "android.sensor.accelerometer"
-#define SENSOR_TYPE_MAGNETIC_FIELD  SENSOR_TYPE_GEOMAGNETIC_FIELD
-#define SENSOR_STRING_TYPE_MAGNETIC_FIELD            "android.sensor.magnetic_field"
-#define SENSOR_STRING_TYPE_ORIENTATION               "android.sensor.orientation"
-#define SENSOR_STRING_TYPE_GYROSCOPE                 "android.sensor.gyroscope"
-#define SENSOR_STRING_TYPE_LIGHT                     "android.sensor.light"
-#define SENSOR_STRING_TYPE_PRESSURE                  "android.sensor.pressure"
-#define SENSOR_STRING_TYPE_TEMPERATURE               "android.sensor.temperature"
-#define SENSOR_STRING_TYPE_PROXIMITY                 "android.sensor.proximity"
-#define SENSOR_STRING_TYPE_GRAVITY                   "android.sensor.gravity"
-#define SENSOR_STRING_TYPE_LINEAR_ACCELERATION      "android.sensor.linear_acceleration"
-#define SENSOR_STRING_TYPE_ROTATION_VECTOR          "android.sensor.rotation_vector"
-#define SENSOR_STRING_TYPE_RELATIVE_HUMIDITY        "android.sensor.relative_humidity"
-#define SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE      "android.sensor.ambient_temperature"
-#define SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED "android.sensor.magnetic_field_uncalibrated"
-#define SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR     "android.sensor.game_rotation_vector"
-#define SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED   "android.sensor.gyroscope_uncalibrated"
-#define SENSOR_STRING_TYPE_SIGNIFICANT_MOTION       "android.sensor.significant_motion"
-#define SENSOR_STRING_TYPE_STEP_DETECTOR            "android.sensor.step_detector"
-#define SENSOR_STRING_TYPE_STEP_COUNTER             "android.sensor.step_counter"
-#define SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR "android.sensor.geomagnetic_rotation_vector"
-#define SENSOR_STRING_TYPE_HEART_RATE               "android.sensor.heart_rate"
-#define SENSOR_STRING_TYPE_TILT_DETECTOR               "android.sensor.tilt_detector"
-#define SENSOR_STRING_TYPE_WAKE_GESTURE                        "android.sensor.wake_gesture"
-#define SENSOR_STRING_TYPE_GLANCE_GESTURE                      "android.sensor.glance_gesture"
-#define SENSOR_STRING_TYPE_PICK_UP_GESTURE                     "android.sensor.pick_up_gesture"
-#define SENSOR_STRING_TYPE_WRIST_TILT_GESTURE                  "android.sensor.wrist_tilt_gesture"
-#define SENSOR_STRING_TYPE_DEVICE_ORIENTATION          "android.sensor.device_orientation"
-#define SENSOR_STRING_TYPE_POSE_6DOF                  "android.sensor.pose_6dof"
+/*
+ * Legacy alias of SENSOR_TYPE_MAGNETIC_FIELD.
+ *
+ * Previously, the type of a sensor measuring local magnetic field is named
+ * SENSOR_TYPE_GEOMAGNETIC_FIELD and SENSOR_TYPE_MAGNETIC_FIELD is its alias.
+ * SENSOR_TYPE_MAGNETIC_FIELD is redefined as primary name to avoid confusion.
+ * SENSOR_TYPE_GEOMAGNETIC_FIELD is the alias and is deprecating. New implementation must not use
+ * SENSOR_TYPE_GEOMAGNETIC_FIELD.
+ */
+#define SENSOR_TYPE_GEOMAGNETIC_FIELD   SENSOR_TYPE_MAGNETIC_FIELD
+
+/*
+ * Sensor string types for Android defined sensor types.
+ *
+ * For Android defined sensor types, string type will be override in sensor service and thus no
+ * longer needed to be added to sensor_t data structure.
+ *
+ * These definitions are going to be removed soon.
+ */
+#define SENSOR_STRING_TYPE_ACCELEROMETER                "android.sensor.accelerometer"
+#define SENSOR_STRING_TYPE_MAGNETIC_FIELD               "android.sensor.magnetic_field"
+#define SENSOR_STRING_TYPE_ORIENTATION                  "android.sensor.orientation"
+#define SENSOR_STRING_TYPE_GYROSCOPE                    "android.sensor.gyroscope"
+#define SENSOR_STRING_TYPE_LIGHT                        "android.sensor.light"
+#define SENSOR_STRING_TYPE_PRESSURE                     "android.sensor.pressure"
+#define SENSOR_STRING_TYPE_TEMPERATURE                  "android.sensor.temperature"
+#define SENSOR_STRING_TYPE_PROXIMITY                    "android.sensor.proximity"
+#define SENSOR_STRING_TYPE_GRAVITY                      "android.sensor.gravity"
+#define SENSOR_STRING_TYPE_LINEAR_ACCELERATION          "android.sensor.linear_acceleration"
+#define SENSOR_STRING_TYPE_ROTATION_VECTOR              "android.sensor.rotation_vector"
+#define SENSOR_STRING_TYPE_RELATIVE_HUMIDITY            "android.sensor.relative_humidity"
+#define SENSOR_STRING_TYPE_AMBIENT_TEMPERATURE          "android.sensor.ambient_temperature"
+#define SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED  "android.sensor.magnetic_field_uncalibrated"
+#define SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR         "android.sensor.game_rotation_vector"
+#define SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED       "android.sensor.gyroscope_uncalibrated"
+#define SENSOR_STRING_TYPE_SIGNIFICANT_MOTION           "android.sensor.significant_motion"
+#define SENSOR_STRING_TYPE_STEP_DETECTOR                "android.sensor.step_detector"
+#define SENSOR_STRING_TYPE_STEP_COUNTER                 "android.sensor.step_counter"
+#define SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR  "android.sensor.geomagnetic_rotation_vector"
+#define SENSOR_STRING_TYPE_HEART_RATE                   "android.sensor.heart_rate"
+#define SENSOR_STRING_TYPE_TILT_DETECTOR                "android.sensor.tilt_detector"
+#define SENSOR_STRING_TYPE_WAKE_GESTURE                 "android.sensor.wake_gesture"
+#define SENSOR_STRING_TYPE_GLANCE_GESTURE               "android.sensor.glance_gesture"
+#define SENSOR_STRING_TYPE_PICK_UP_GESTURE              "android.sensor.pick_up_gesture"
+#define SENSOR_STRING_TYPE_WRIST_TILT_GESTURE           "android.sensor.wrist_tilt_gesture"
+#define SENSOR_STRING_TYPE_DEVICE_ORIENTATION           "android.sensor.device_orientation"
+#define SENSOR_STRING_TYPE_POSE_6DOF                    "android.sensor.pose_6dof"
 #define SENSOR_STRING_TYPE_STATIONARY_DETECT            "android.sensor.stationary_detect"
 #define SENSOR_STRING_TYPE_MOTION_DETECT                "android.sensor.motion_detect"
 #define SENSOR_STRING_TYPE_HEART_BEAT                   "android.sensor.heart_beat"
-#define SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META                  "android.sensor.dynamic_sensor_meta"
-#define SENSOR_STRING_TYPE_ADDITIONAL_INFO                "android.sensor.additional_info"
-#define SENSOR_STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT     "android.sensor.low_latency_offbody"
+#define SENSOR_STRING_TYPE_DYNAMIC_SENSOR_META          "android.sensor.dynamic_sensor_meta"
+#define SENSOR_STRING_TYPE_ADDITIONAL_INFO              "android.sensor.additional_info"
+#define SENSOR_STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT   "android.sensor.low_latency_offbody"
+#define SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED   "android.sensor.accelerometer_uncalibrated"
 
 /**
  * Values returned by the accelerometer in various locations in the universe.
@@ -202,7 +223,7 @@
 } sensors_vec_t;
 
 /**
- * uncalibrated gyroscope and magnetometer event data
+ * uncalibrated accelerometer, gyroscope and magnetometer event data
  */
 typedef struct {
   union {
@@ -326,6 +347,9 @@
             /* uncalibrated magnetometer values are in micro-Teslas */
             uncalibrated_event_t uncalibrated_magnetic;
 
+            /* uncalibrated accelerometer values are in  meter per second per second (m/s^2) */
+            uncalibrated_event_t uncalibrated_accelerometer;
+
             /* heart rate data containing value in bpm and status */
             heart_rate_event_t heart_rate;
 
@@ -448,13 +472,14 @@
      */
     uint32_t        fifoMaxEventCount;
 
-    /* type of this sensor as a string. Set to corresponding
-     * SENSOR_STRING_TYPE_*.
-     * When defining an OEM specific sensor or sensor manufacturer specific
-     * sensor, use your reserve domain name as a prefix.
-     * ex: com.google.glass.onheaddetector
-     * For sensors of known type, the android framework might overwrite this
-     * string automatically.
+    /* type of this sensor as a string.
+     *
+     * If type is OEM specific or sensor manufacturer specific type
+     * (>=SENSOR_TYPE_DEVICE_PRIVATE_BASE), this string must be defined with reserved domain of
+     * vendor/OEM as a prefix, e.g. com.google.glass.onheaddetector
+     *
+     * For sensors of Android defined types, Android framework will override this value. It is ok to
+     * leave it pointing to an empty string.
      */
     const char*    stringType;
 
@@ -500,6 +525,23 @@
     void*           reserved[2];
 };
 
+/**
+ * Shared memory information for a direct channel
+ */
+struct sensors_direct_mem_t {
+    int type;                           // enum SENSOR_DIRECT_MEM_...
+    int format;                         // enum SENSOR_DIRECT_FMT_...
+    size_t size;                        // size of the memory region, in bytes
+    const struct native_handle *handle; // shared memory handle, which is interpreted differently
+                                        // depending on type
+};
+
+/**
+ * Direct channel report configuration
+ */
+struct sensors_direct_cfg_t {
+    int rate_level;             // enum SENSOR_DIRECT_RATE_...
+};
 
 /*
  * sensors_poll_device_t is used with SENSORS_DEVICE_API_VERSION_0_1
@@ -607,7 +649,61 @@
      */
     int (*inject_sensor_data)(struct sensors_poll_device_1 *dev, const sensors_event_t *data);
 
-    void (*reserved_procs[7])(void);
+    /*
+     * Register/unregister direct report channel.
+     *
+     * A HAL declares support for direct report by setting non-NULL values for both
+     * register_direct_channel and config_direct_report.
+     *
+     * This function has two operation modes:
+     *
+     * Register: mem != NULL, register a channel using supplied shared memory information. By the
+     * time this function returns, sensors must finish initializing shared memory content
+     * (format dependent, see SENSOR_DIRECT_FMT_*).
+     *      Parameters:
+     *          mem             points to a valid struct sensors_direct_mem_t.
+     *          channel_handle  is ignored.
+     *      Return value:
+     *          A handle of channel (>0, <INT32_MAX) when success, which later can be referred in
+     *          unregister or config_direct_report call, or error code (<0) when failed
+     * Unregister: mem == NULL, unregister a previously registered channel.
+     *      Parameters:
+     *          mem             set to NULL
+     *          channel_handle  contains handle of channel to be unregistered
+     *      Return value:
+     *          0, even if the channel_handle is invalid, in which case it will be a no-op.
+     */
+    int (*register_direct_channel)(struct sensors_poll_device_1 *dev,
+            const struct sensors_direct_mem_t* mem, int channel_handle);
+
+    /*
+     * Configure direct sensor event report in direct channel.
+     *
+     * Start, modify rate or stop direct report of a sensor in a certain direct channel. A special
+     * case is setting sensor handle -1 to stop means to stop all active sensor report on the
+     * channel specified.
+     *
+     * A HAL declares support for direct report by setting non-NULL values for both
+     * register_direct_channel and config_direct_report.
+     *
+     * Parameters:
+     *      sensor_handle   sensor to be configured. The sensor has to support direct report
+     *                      mode by setting flags of sensor_t. Also, direct report mode is only
+     *                      defined for continuous reporting mode sensors.
+     *      channel_handle  channel handle to be configured.
+     *      config          direct report parameters, see sensor_direct_cfg_t.
+     * Return value:
+     *      - when sensor is started or sensor rate level is changed: return positive identifier of
+     *        sensor in specified channel if successful, otherwise return negative error code.
+     *      - when sensor is stopped: return 0 for success or negative error code for failure.
+     */
+    int (*config_direct_report)(struct sensors_poll_device_1 *dev,
+            int sensor_handle, int channel_handle, const struct sensors_direct_cfg_t *config);
+
+    /*
+     * Reserved for future use.
+     */
+    void (*reserved_procs[5])(void);
 
 } sensors_poll_device_1_t;
 
diff --git a/modules/radio/radio_hw.c b/modules/radio/radio_hw.c
index 63646a4..150d173 100644
--- a/modules/radio/radio_hw.c
+++ b/modules/radio/radio_hw.c
@@ -356,6 +356,7 @@
                         tuner->program.stereo = false;
                     else
                         tuner->program.stereo = false;
+                    prepare_metadata(tuner, &tuner->program.metadata, tuner->program.tuned);
 
                     event.type = RADIO_EVENT_TUNED;
                     event.info = tuner->program;
@@ -382,6 +383,7 @@
                     else
                         tuner->program.stereo = tuner->config.am.stereo;
                     tuner->program.signal_strength = 50;
+                    prepare_metadata(tuner, &tuner->program.metadata, tuner->program.tuned);
 
                     event.type = RADIO_EVENT_TUNED;
                     event.info = tuner->program;
@@ -394,12 +396,7 @@
                                                 (tuner->config.spacings[0] * 5)) % 2;
 
                     if (tuner->program.tuned) {
-                        prepare_metadata(tuner, &tuner->program.metadata, true);
                         send_command_l(tuner, CMD_ANNOUNCEMENTS, 1000, NULL);
-                    } else {
-                        if (tuner->program.metadata != NULL)
-                            radio_metadata_deallocate(tuner->program.metadata);
-                        tuner->program.metadata = NULL;
                     }
                     tuner->program.signal_strength = 100;
                     if (tuner->config.type == RADIO_BAND_FM)
@@ -408,6 +405,8 @@
                     else
                         tuner->program.stereo =
                             tuner->program.tuned ? tuner->config.am.stereo : false;
+                    prepare_metadata(tuner, &tuner->program.metadata, tuner->program.tuned);
+
                     event.type = RADIO_EVENT_TUNED;
                     event.info = tuner->program;
                     send_meta_data = true;
diff --git a/modules/sensors/multihal.cpp b/modules/sensors/multihal.cpp
index 603a8c6..2810118 100644
--- a/modules/sensors/multihal.cpp
+++ b/modules/sensors/multihal.cpp
@@ -255,9 +255,9 @@
     }
 }
 
-// Android L requires sensor HALs to be either 1_0 or 1_3 compliant
+// Android N and hire require sensor HALs to be at least 1_3 compliant
 #define HAL_VERSION_IS_COMPLIANT(version)  \
-    (version == SENSORS_DEVICE_API_VERSION_1_0 || version >= SENSORS_DEVICE_API_VERSION_1_3)
+    (version >= SENSORS_DEVICE_API_VERSION_1_3)
 
 // Returns true if HAL is compliant, false if HAL is not compliant or if handle is invalid
 static bool halIsCompliant(sensors_poll_context_t *ctx, int handle) {
diff --git a/tests/camera2/Android.mk b/tests/camera2/Android.mk
index e45f467..d77c18d 100644
--- a/tests/camera2/Android.mk
+++ b/tests/camera2/Android.mk
@@ -25,7 +25,8 @@
 	libgui \
 	libsync \
 	libui \
-	libdl
+	libdl \
+	android.hardware.camera.device@3.2
 
 LOCAL_C_INCLUDES += \
 	system/media/camera/include \
diff --git a/tests/camera2/CameraModuleFixture.h b/tests/camera2/CameraModuleFixture.h
index 71d7dd0..b0d49e2 100644
--- a/tests/camera2/CameraModuleFixture.h
+++ b/tests/camera2/CameraModuleFixture.h
@@ -98,7 +98,7 @@
             case CAMERA_DEVICE_API_VERSION_3_0:
             case CAMERA_DEVICE_API_VERSION_3_1:
             case CAMERA_DEVICE_API_VERSION_3_2:
-                *device = new Camera3Device(cameraID);
+                *device = new Camera3Device(String8::format("%d", cameraID));
                 break;
             default:
                 device->clear();
diff --git a/tests/hardware/struct-offset.cpp b/tests/hardware/struct-offset.cpp
index 10c0895..7f7f2e0 100644
--- a/tests/hardware/struct-offset.cpp
+++ b/tests/hardware/struct-offset.cpp
@@ -116,7 +116,9 @@
     CHECK_MEMBER_AT(sensors_poll_device_1_t, batch, 76, 144);
     CHECK_MEMBER_AT(sensors_poll_device_1_t, flush, 80, 152);
     CHECK_MEMBER_AT(sensors_poll_device_1_t, inject_sensor_data, 84, 160);
-    CHECK_MEMBER_AT(sensors_poll_device_1_t, reserved_procs, 88, 168);
+    CHECK_MEMBER_AT(sensors_poll_device_1_t, register_direct_channel, 88, 168);
+    CHECK_MEMBER_AT(sensors_poll_device_1_t, config_direct_report, 92, 176);
+    CHECK_MEMBER_AT(sensors_poll_device_1_t, reserved_procs, 96, 184);
 
     //Types defined in fb.h
     CHECK_MEMBER_AT(framebuffer_device_t, common, 0, 0);