merge in lmp-mr1-nova-release history after reset to lmp-mr1-dev
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 3b122b4..df656d2 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
+/* Copyright (c) 2012-2013, 2015, The Linux Foundataion. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -164,7 +164,8 @@
       mParameters(NULL),
       mJpegSettings(NULL),
       mIsZslMode(false),
-      m_pPowerModule(NULL)
+      m_pPowerModule(NULL),
+      mPrecaptureId(0)
 {
     mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
     mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
@@ -875,19 +876,21 @@
         streamTypeMask |= channel->getStreamTypeMask();
     }
 
-    rc = setFrameParameters(request->frame_number, request->settings, streamTypeMask);
-    if (rc < 0) {
-        ALOGE("%s: fail to set frame parameters", __func__);
-        pthread_mutex_unlock(&mMutex);
-        return rc;
-    }
-
-    /* Update pending request list and pending buffers map */
     PendingRequestInfo pendingRequest;
     pendingRequest.frame_number = frameNumber;
     pendingRequest.num_buffers = request->num_output_buffers;
     pendingRequest.request_id = request_id;
     pendingRequest.blob_request = blob_request;
+    pendingRequest.ae_trigger.trigger_id = mPrecaptureId;
+    pendingRequest.ae_trigger.trigger = CAM_AEC_TRIGGER_IDLE;
+
+    rc = setFrameParameters(request->frame_number, request->settings,
+            streamTypeMask, pendingRequest.ae_trigger);
+    if (rc < 0) {
+        ALOGE("%s: fail to set frame parameters", __func__);
+        pthread_mutex_unlock(&mMutex);
+        return rc;
+    }
 
     for (size_t i = 0; i < request->num_output_buffers; i++) {
         RequestedBufferInfo requestedBuf;
@@ -1077,7 +1080,8 @@
                 result.result = dummyMetadata.release();
             } else {
                 result.result = translateCbMetadataToResultMetadata(metadata,
-                        current_capture_time, i->request_id);
+                        current_capture_time, i->request_id, i->ae_trigger);
+
                 if (i->blob_request && needReprocess()) {
                    //If it is a blob request then send the metadata to the picture channel
                    mPictureChannel->queueMetadata(metadata_buf);
@@ -1219,7 +1223,7 @@
 camera_metadata_t*
 QCamera3HardwareInterface::translateCbMetadataToResultMetadata
                                 (metadata_buffer_t *metadata, nsecs_t timestamp,
-                                 int32_t request_id)
+                                 int32_t request_id, const cam_trigger_t &aeTrigger)
 {
     CameraMetadata camMetadata;
     camera_metadata_t* resultMetadata;
@@ -1263,9 +1267,8 @@
         (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
     camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
 
-    int32_t  *ae_precapture_id =
-        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
-    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
+    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
+            &aeTrigger.trigger_id, 1);
 
     /*aec regions*/
     cam_area_t  *hAeRegions =
@@ -1277,9 +1280,17 @@
         uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
         camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
     } else {
-        uint8_t *ae_state =
-            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
-        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
+        uint8_t ae_state =
+            *(uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
+        //Override AE state for front(YUV) sensor if corresponding request
+        //contain a precapture trigger. This is to work around the precapture
+        //trigger timeout for YUV sensor.
+        if (gCamCapability[mCameraId]->position == CAM_POSITION_FRONT &&
+                aeTrigger.trigger_id > 0 && aeTrigger.trigger ==
+                ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START) {
+            ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
+        }
+        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
     }
     uint8_t  *focusMode =
         (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
@@ -2567,12 +2578,14 @@
  *   @frame_id  : frame number for this particular request
  *   @settings  : frame settings information from framework
  *   @streamTypeMask : bit mask of stream types on which buffers are requested
+ *   @aeTrigger : Return aeTrigger if it exists in the request
  *
  * RETURN     : success: NO_ERROR
  *              failure:
  *==========================================================================*/
 int QCamera3HardwareInterface::setFrameParameters(int frame_id,
-                    const camera_metadata_t *settings, uint32_t streamTypeMask)
+        const camera_metadata_t *settings, uint32_t streamTypeMask,
+        cam_trigger_t &aeTrigger)
 {
     /*translate from camera_metadata_t type to parm_type_t*/
     int rc = 0;
@@ -2605,7 +2618,7 @@
     }
 
     if(settings != NULL){
-        rc = translateMetadataToParameters(settings);
+        rc = translateMetadataToParameters(settings, aeTrigger);
     }
     /*set the parameters to backend*/
     mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
@@ -2620,13 +2633,13 @@
  *
  * PARAMETERS :
  *   @settings  : frame settings information from framework
- *
+ *   @aeTrigger : output ae trigger if it's set in request
  *
  * RETURN     : success: NO_ERROR
  *              failure:
  *==========================================================================*/
-int QCamera3HardwareInterface::translateMetadataToParameters
-                                  (const camera_metadata_t *settings)
+int QCamera3HardwareInterface::translateMetadataToParameters(
+        const camera_metadata_t *settings, cam_trigger_t &aeTrigger)
 {
     int rc = 0;
     CameraMetadata frame_settings;
@@ -2782,18 +2795,16 @@
                     sizeof(colorCorrectTransform), &colorCorrectTransform);
     }
 
-    cam_trigger_t aecTrigger;
-    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
-    aecTrigger.trigger_id = -1;
     if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
         frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
-        aecTrigger.trigger =
+        aeTrigger.trigger =
             frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
-        aecTrigger.trigger_id =
+        aeTrigger.trigger_id =
             frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
+        mPrecaptureId = aeTrigger.trigger_id;
     }
     rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
-                                sizeof(aecTrigger), &aecTrigger);
+                                sizeof(aeTrigger), &aeTrigger);
 
     /*af_trigger must come with a trigger id*/
     if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 148e9eb..71baf9e 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
+/* Copyright (c) 2012-2013, 2015, The Linux Foundataion. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -121,10 +121,13 @@
     void getMetadataVendorTagOps(vendor_tag_query_ops_t* ops);
     void dump(int fd);
 
-    int setFrameParameters(int frame_id, const camera_metadata_t *settings, uint32_t streamTypeMask);
-    int translateMetadataToParameters(const camera_metadata_t *settings);
+    int setFrameParameters(int frame_id, const camera_metadata_t *settings,
+        uint32_t streamTypeMask, cam_trigger_t &aeTrigger);
+    int translateMetadataToParameters(const camera_metadata_t *settings,
+            cam_trigger_t &aeTrigger);
     camera_metadata_t* translateCbMetadataToResultMetadata(metadata_buffer_t *metadata,
-                            nsecs_t timestamp, int32_t request_id);
+                            nsecs_t timestamp, int32_t request_id,
+                            const cam_trigger_t &aeTrigger);
     int getJpegSettings(const camera_metadata_t *settings);
     int initParameters();
     void deinitParameters();
@@ -197,6 +200,7 @@
         int32_t request_id;
         List<RequestedBufferInfo> buffers;
         int blob_request;
+        cam_trigger_t ae_trigger;
     } PendingRequestInfo;
     typedef KeyedVector<camera3_stream_t *, uint32_t> PendingBuffersMap;
 
@@ -216,6 +220,8 @@
 
     power_module_t *m_pPowerModule;   // power module
 
+    int32_t mPrecaptureId;
+
     static const QCameraMap EFFECT_MODES_MAP[];
     static const QCameraMap WHITE_BALANCE_MODES_MAP[];
     static const QCameraMap SCENE_MODES_MAP[];