Camera2: fix ZSL snapshot

- don't stop zsl channel after snapshot is taken
- statemachine needs to change to preview_pic_taking state while taking
  zsl snapshot
- default fps range should set to the last one which is highest fps

Change-Id: I23fb0f3a2b4876be11edd148eb9aa336c0369089
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index 4ae5fd3..8a1a010 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -914,6 +914,10 @@
             streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
         }
         break;
+    case CAM_STREAM_TYPE_POSTVIEW:
+        streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
+        streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
+        break;
     case CAM_STREAM_TYPE_OFFLINE_PROC:
         // right now offline process is only for WNR in ZSL case
         // use the same format and dimension for input and output
@@ -1241,8 +1245,6 @@
             (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL];
         if (NULL != pZSLChannel) {
             pZSLChannel->cancelPicture();
-            stopChannel(QCAMERA_CH_TYPE_ZSL);
-            delChannel(QCAMERA_CH_TYPE_ZSL);
         }
     } else {
         // normal capture case
diff --git a/QCamera2/HAL/QCamera2HWI.h b/QCamera2/HAL/QCamera2HWI.h
index 0e7bfca..8a3cdda 100644
--- a/QCamera2/HAL/QCamera2HWI.h
+++ b/QCamera2/HAL/QCamera2HWI.h
@@ -230,6 +230,7 @@
     int32_t prepareHardwareForSnapshot();
     bool needProcessPreviewFrame() {return m_stateMachine.isPreviewRunning();};
     bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
+    bool isZSLMode() {return mParameters.isZSLMode();};
     uint8_t numOfSnapshotsExpected() {return mParameters.getNumOfSnapshots();};
 
     static void camEvtHandle(uint32_t camera_handle,
diff --git a/QCamera2/HAL/QCameraParameters.cpp b/QCamera2/HAL/QCameraParameters.cpp
index 5d6ccff..6e11b8c 100644
--- a/QCamera2/HAL/QCameraParameters.cpp
+++ b/QCamera2/HAL/QCameraParameters.cpp
@@ -1787,15 +1787,17 @@
         String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
                                                       m_pCapability->fps_ranges_tbl_cnt);
         set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
-        setPreviewFpsRange(int(m_pCapability->fps_ranges_tbl[0].min_fps * 1000),
-                           int(m_pCapability->fps_ranges_tbl[0].max_fps * 1000));
+        int min_fps =
+            int(m_pCapability->fps_ranges_tbl[m_pCapability->fps_ranges_tbl_cnt - 1].min_fps * 1000);
+        int max_fps =
+            int(m_pCapability->fps_ranges_tbl[m_pCapability->fps_ranges_tbl_cnt - 1].max_fps * 1000);
+        setPreviewFpsRange(min_fps, max_fps);
 
         // Set legacy preview fps
         String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl,
                                             m_pCapability->fps_ranges_tbl_cnt);
         set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
-        CameraParameters::setPreviewFrameRate(
-           (int)(m_pCapability->fps_ranges_tbl[0].max_fps * 1000));
+        CameraParameters::setPreviewFrameRate(max_fps);
     } else {
         ALOGE("%s: supported fps ranges cnt is 0!!!", __func__);
     }
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 2993d97..5c9eee4 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -606,8 +606,21 @@
             bool needRestart = false;
             rc = m_parent->updateParameters((char*)payload, needRestart);
             if (rc == NO_ERROR) {
-                rc = m_parent->commitParameterChanges();
+                if (needRestart) {
+                    // need restart preview for parameters to take effect
+                    m_parent->unpreparePreview();
+                    // commit parameter changes to server
+                    m_parent->commitParameterChanges();
+                    // prepare preview again
+                    rc = m_parent->preparePreview();
+                    if (rc != NO_ERROR) {
+                        m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
+                    }
+                } else {
+                    rc = m_parent->commitParameterChanges();
+                }
             }
+
             result.status = rc;
             result.request_api = evt;
             result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
@@ -975,7 +988,11 @@
             rc = m_parent->takePicture();
             if (rc == NO_ERROR) {
                 // move state to picture taking state
-                m_state = QCAMERA_SM_STATE_PIC_TAKING;
+                if (m_parent->isZSLMode()) {
+                    m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
+                } else {
+                    m_state = QCAMERA_SM_STATE_PIC_TAKING;
+                }
             } else {
                 // move state to preview stopped state
                 m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
diff --git a/QCamera2/HAL/QCameraStateMachine.h b/QCamera2/HAL/QCameraStateMachine.h
index 0e7502f..107b5ae 100644
--- a/QCamera2/HAL/QCameraStateMachine.h
+++ b/QCamera2/HAL/QCameraStateMachine.h
@@ -149,7 +149,7 @@
         QCAMERA_SM_STATE_PIC_TAKING,               // taking picture (preview stopped)
         QCAMERA_SM_STATE_RECORDING,                // recording (preview running)
         QCAMERA_SM_STATE_VIDEO_PIC_TAKING,         // taking live snapshot during recording (preview running)
-        QCAMERA_SM_STATE_PREVIEW_PIC_TAKING        // taking live snapshot (recording stopped but preview running)
+        QCAMERA_SM_STATE_PREVIEW_PIC_TAKING        // taking ZSL/live snapshot (recording stopped but preview running)
     } qcamera_state_enum_t;
 
     typedef enum