Merge remote-tracking branch into merge_branch

Delay onResume tasks to speed up lockscreen onResume->onPause->onResume launch sequence.
  Import translations. DO NOT MERGE
  gcam: Clean up placeholders, and add deletion robustness.
  Fix issue of focus indicator staying on without being hidden
  Ensure view size gets updated after phone decors change.
  Show the 100% state of the progress at least one frame.
  Add parameters and deduplicate parameter changes
  Revert parallel opening camera in photo mode.
  Differentiate the InProgressData from the normal PhotoData.
  Close mode menus if another control is touched
  Start gcam module directly when handling capture intent.
  Import translations. DO NOT MERGE
  Add a null check to fix NPE
  Add logging to various actions
  Ensure mOpenCameraThread has been setup before dereferencing.
  Add logging to various actions
  Ensure mOpenCameraThread has been setup before dereferencing.
  Add GCam progress indicator.
  hide preview cover on arrival of new preview data if hidden
  Fix photo mode is getting stuck in a single CameraState.
  ...

Conflicts:
	res/layout/photo_module.xml
	res/values/arrays.xml
	src/com/android/camera/CameraActivity.java
	src/com/android/camera/PhotoUI.java
	src/com/android/camera/Storage.java
	src/com/android/camera/WideAnglePanoramaModule.java
	src/com/android/camera/ui/FilmStripView.java

Change-Id: Ic41b4e7e07b2b0ed7936b78a6c5f05270d05985f
diff --git a/Android.mk b/Android.mk
index 0aeee74..bb2b0d8 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_PACKAGE_NAME := Camera2
 
-LOCAL_SDK_VERSION := current
+#LOCAL_SDK_VERSION := current
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e14a251..0a98e16 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -145,6 +145,11 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
+        <receiver android:name="com.android.camera.CameraButtonIntentReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.CAMERA_BUTTON"/>
+            </intent-filter>
+        </receiver>
 
         <service android:name="com.android.camera.MediaSaveService" />
     </application>
diff --git a/proguard.flags b/proguard.flags
index 198df75..d5e8d60 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -1,5 +1,7 @@
 # Disable the warnings of using dynamic method call in common library.
 -dontnote com.android.gallery3d.common.*
+#Avoid the library class dependency error
+-dontwarn android.view.inputmethod.InputMethodManager
 
 # ctors of subclasses of CameraPreference are called with Java reflection.
 -keep class * extends com.android.camera.CameraPreference {
diff --git a/res/layout/photo_module.xml b/res/layout/photo_module.xml
index 0410f16..5d00da1 100644
--- a/res/layout/photo_module.xml
+++ b/res/layout/photo_module.xml
@@ -24,22 +24,84 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center">
+    <include layout="@layout/count_down_to_capture"/>
     <!-- Wrap a frame layout around texture view so that when scaled, texture
          view will not draw outside its unscaled bounds -->
     <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:layout_gravity="center_vertical|center_horizontal">
         <TextureView
             android:id="@+id/preview_content"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
+     </FrameLayout>
+       <RelativeLayout android:id="@+id/linear"
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+            <ProgressBar
+                style="?android:attr/progressBarStyleHorizontal"
+                android:id="@+id/progress"
+                android:orientation="vertical"
+                android:layout_width="200dip"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="14dip"
+                android:layout_marginBottom="14dip"
+                android:layout_marginLeft="30dip"
+                android:layout_marginRight="30dip" />
+            <com.android.camera.GraphView
+                android:id="@+id/graph_view"
+                android:layout_width="200dip"
+                android:layout_height="200dip"
+                android:layout_marginTop="15dip"
+                android:layout_marginLeft="15dip" />
+            <TableLayout
+                android:id="@+id/relative_seek"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginTop="20px"
+                android:layout_marginRight="20px"
+                android:layout_marginLeft="20px"
+                android:stretchColumns="1">
+                <TableRow> <TextView
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/skintonetitle"
+                    android:layout_gravity="center"
+                    android:textSize="22.0sp"
+                    android:textStyle="bold" />
+                </TableRow>
+                <TableRow> <SeekBar
+                    android:id="@+id/skintoneseek"
+                    android:layout_below="@+id/skintonetitle"
+                    android:layout_width="400px"
+                    android:layout_height="33dip"
+                    android:layout_marginLeft="25px"
+                    android:layout_marginTop="2dip"/>
+                </TableRow>
+                <TableRow>
+                    <TextView
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/skintoneleft"
+                        android:textSize="22.0sp"
+                        android:textStyle="bold" />
+                    <TextView
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/skintoneright"
+                        android:textSize="22.0sp"
+                        android:textStyle="bold"/>
+                </TableRow>
+            </TableLayout>
+        </RelativeLayout>
         <View
             android:id="@+id/preview_cover"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@android:color/black"
             android:visibility="gone" />
-    </FrameLayout>
     <ImageView
         android:id="@+id/review_image"
         android:layout_width="match_parent"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 050f5a6..c77cdb3 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -21,21 +21,36 @@
         <item>@string/pref_video_quality_entry_1080p</item>
         <item>@string/pref_video_quality_entry_720p</item>
         <item>@string/pref_video_quality_entry_480p</item>
-        <item>@string/pref_video_quality_entry_high</item>
-        <item>@string/pref_video_quality_entry_low</item>
+        <item>@string/pref_video_quality_entry_fwvga</item>
+        <item>@string/pref_video_quality_entry_wvga</item>
+        <item>@string/pref_video_quality_entry_vga</item>
+        <item>@string/pref_video_quality_entry_wqvga</item>
+        <item>@string/pref_video_quality_entry_cif</item>
+        <item>@string/pref_video_quality_entry_qvga</item>
+        <item>@string/pref_video_quality_entry_qcif</item>
    </string-array>
 
     <string-array name="pref_video_quality_entryvalues" translatable="false">
         <!-- The integer value of CamcorderProfile.QUALITY_1080P -->
         <item>6</item>
         <!-- The integer value of CamcorderProfile.QUALITY_720P -->
-        <item>@string/pref_video_quality_default</item>
+        <item>5</item>
         <!-- The integer value of CamcorderProfile.QUALITY_480P -->
         <item>4</item>
-        <!-- The integer value of CamcorderProfile.QUALITY_HIGH -->
-        <item>1</item>
-         <!-- The integer value of CamcorderProfile.QUALITY_LOW -->
-        <item>0</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_FWVGA -->
+        <item>8</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_WVGA -->
+        <item>9</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_VGA -->
+        <item>10</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_WQVGA -->
+        <item>11</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_CIF -->
+        <item>@string/pref_video_quality_default</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_QVGA -->
+        <item>7</item>
+        <!-- The integer value of CamcorderProfile.QUALITY_QCIF -->
+        <item>2</item>
     </string-array>
 
     <!-- These values correspond to the time interval between frame capture in millseconds
@@ -155,47 +170,60 @@
     <!-- Camera Preferences Picture size dialog box entries -->
     <string-array name="pref_camera_picturesize_entries" translatable="false">
         <item>@string/pref_camera_picturesize_entry_13mp</item>
+        <item>@string/pref_camera_picturesize_entry_12mp</item>
+        <item>@string/pref_camera_picturesize_entry_8mp</item>
         <item>@string/pref_camera_picturesize_entry_8mp</item>
         <item>@string/pref_camera_picturesize_entry_5mp</item>
         <item>@string/pref_camera_picturesize_entry_5mp</item>
         <item>@string/pref_camera_picturesize_entry_5mp</item>
         <item>@string/pref_camera_picturesize_entry_4mp</item>
         <item>@string/pref_camera_picturesize_entry_3mp</item>
+        <item>@string/pref_camera_picturesize_entry_1920x1080</item>
         <item>@string/pref_camera_picturesize_entry_2mp</item>
         <item>@string/pref_camera_picturesize_entry_2mp_wide</item>
-        <item>@string/pref_camera_picturesize_entry_2mp_wide</item>
         <item>@string/pref_camera_picturesize_entry_1_5mp</item>
         <item>@string/pref_camera_picturesize_entry_1_3mp</item>
+        <item>@string/pref_camera_picturesize_entry_1280x768</item>
+        <item>@string/pref_camera_picturesize_entry_1280x720</item>
         <item>@string/pref_camera_picturesize_entry_1mp</item>
-        <item>@string/pref_camera_picturesize_entry_1mp</item>
+        <item>@string/pref_camera_picturesize_entry_800x600</item>
+        <item>@string/pref_camera_picturesize_entry_800x480</item>
         <item>960 x 720</item>
         <item>720 x 480</item>
         <item>@string/pref_camera_picturesize_entry_vga</item>
+        <item>@string/pref_camera_picturesize_entry_352x288</item>
         <item>@string/pref_camera_picturesize_entry_qvga</item>
+        <item>@string/pref_camera_picturesize_entry_176x144</item>
     </string-array>
-
     <!-- When launching the camera app first time, we will set the picture
          size to the first one in the list that is also supported by the
          driver -->
     <string-array name="pref_camera_picturesize_entryvalues" translatable="false">
         <item>4128x3096</item>
+        <item>4000x3000</item>
         <item>3264x2448</item>
+        <item>3200x2400</item>
         <item>2592x1944</item>
         <item>2592x1936</item>
         <item>2560x1920</item>
         <item>2688x1520</item>
         <item>2048x1536</item>
+        <item>1920x1080</item>
         <item>1600x1200</item>
         <item>1920x1088</item>
-        <item>1920x1080</item>
         <item>1440x1080</item>
         <item>1280x960</item>
+        <item>1280x768</item>
         <item>1280x720</item>
         <item>1024x768</item>
+        <item>800x600</item>
+        <item>800x480</item>
         <item>960x720</item>
         <item>720x480</item>
         <item>640x480</item>
+        <item>352x288</item>
         <item>320x240</item>
+        <item>176x144</item>
     </string-array>
 
     <!-- Camera Preferences focus mode dialog box entries -->
@@ -203,12 +231,16 @@
         <item>@string/pref_camera_focusmode_entry_auto</item>
         <item>@string/pref_camera_focusmode_entry_infinity</item>
         <item>@string/pref_camera_focusmode_entry_macro</item>
+        <item>@string/pref_camera_focusmode_entry_normal</item>
+        <item>@string/pref_camera_focusmode_entry_continuous</item>
     </string-array>
 
     <string-array name="pref_camera_focusmode_entryvalues" translatable="false">
         <item>auto</item>
         <item>infinity</item>
         <item>macro</item>
+        <item>normal</item>
+        <item>continuous-picture</item>
     </string-array>
 
     <string-array name="pref_camera_focusmode_labels" translatable="false">
@@ -355,6 +387,20 @@
         <item>@string/pref_camera_scenemode_entry_auto</item>
         <item>@string/pref_camera_scenemode_entry_sunset</item>
         <item>@string/pref_camera_scenemode_entry_party</item>
+        <item>@string/pref_camera_scenemode_entry_asd</item>
+        <item>@string/pref_camera_scenemode_entry_portrait</item>
+        <item>@string/pref_camera_scenemode_entry_landscape</item>
+        <item>@string/pref_camera_scenemode_entry_night_portrait</item>
+        <item>@string/pref_camera_scenemode_entry_theatre</item>
+        <item>@string/pref_camera_scenemode_entry_beach</item>
+        <item>@string/pref_camera_scenemode_entry_snow</item>
+        <item>@string/pref_camera_scenemode_entry_steadyphoto</item>
+        <item>@string/pref_camera_scenemode_entry_fireworks</item>
+        <item>@string/pref_camera_scenemode_entry_sports</item>
+        <item>@string/pref_camera_scenemode_entry_candlelight</item>
+        <item>@string/pref_camera_scenemode_entry_backlight</item>
+        <item>@string/pref_camera_scenemode_entry_flowers</item>
+        <item>@string/pref_camera_scenemode_entry_ar</item>
     </string-array>
 
     <string-array name="pref_camera_scenemode_labels">
@@ -379,6 +425,20 @@
         <item>auto</item>
         <item>sunset</item>
         <item>party</item>
+        <item>asd</item>
+        <item>portrait</item>
+        <item>landscape</item>
+        <item>night-portrait</item>
+        <item>theatre</item>
+        <item>beach</item>
+        <item>snow</item>
+        <item>steadyphoto</item>
+        <item>fireworks</item>
+        <item>sports</item>
+        <item>candlelight</item>
+        <item>backlight</item>
+        <item>flowers</item>
+        <item>AR</item>
     </string-array>
 
     <array name="camera_id_entries" translatable="false">
@@ -493,7 +553,6 @@
 
     <!-- Default focus mode setting.-->
     <string-array name="pref_camera_focusmode_default_array" translatable="false">
-        <item>continuous-picture</item>
         <item>auto</item>
     </string-array>
 
diff --git a/res/values/qcomarrays.xml b/res/values/qcomarrays.xml
new file mode 100644
index 0000000..3d08bab
--- /dev/null
+++ b/res/values/qcomarrays.xml
@@ -0,0 +1,565 @@
+<!--
+    Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+
+    Not a Contribution.
+
+    Copyright (C) 2008 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <!-- Camera Preferences Power Mode dialog box entries -->
+    <string-array name="pref_camera_powermode_entries" translatable="false">
+        <item>@string/pref_camera_powermode_entry_lp</item>
+        <item>@string/pref_camera_powermode_entry_np</item>
+    </string-array>
+
+    <string-array name="pref_camera_powermode_entryvalues" translatable="false">
+        <item>@string/pref_camera_powermode_value_lp</item>
+        <item>@string/pref_camera_powermode_value_np</item>
+    </string-array>
+
+    <!-- Camera Preferences Picture format dialog box entries -->
+    <string-array name="pref_camera_picture_format_entries">
+        <item>@string/pref_camera_picture_format_entry_jpeg</item>
+        <item>@string/pref_camera_picture_format_entry_raw</item>
+        <item>@string/pref_camera_picture_format_entry_raw_yuv_422_sp</item>
+        <item>@string/pref_camera_picture_format_entry_raw_yuv_8bit_yuyv</item>
+        <item>@string/pref_camera_picture_format_entry_raw_yuv_8bit_yvyu</item>
+        <item>@string/pref_camera_picture_format_entry_raw_yuv_8bit_uyvy</item>
+        <item>@string/pref_camera_picture_format_entry_raw_yuv_8bit_vyuy</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_10gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_10grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_10rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_10bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_12gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_12grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_12rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_qcom_12bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_10gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_10grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_10rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_10bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_12gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_12grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_12rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_mipi_12bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10bggr</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12gbrg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12grbg</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12rggb</item>
+        <item>@string/pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12bggr</item>
+    </string-array>
+    <string-array name="pref_camera_picture_format_entryvalues">
+        <item>@string/pref_camera_picture_format_value_jpeg</item>
+        <item>@string/pref_camera_picture_format_value_raw</item>
+        <item>@string/pref_camera_picture_format_value_raw_yuv_422_sp</item>
+        <item>@string/pref_camera_picture_format_value_raw_yuv_8bit_yuyv</item>
+        <item>@string/pref_camera_picture_format_value_raw_yuv_8bit_yvyu</item>
+        <item>@string/pref_camera_picture_format_value_raw_yuv_8bit_uyvy</item>
+        <item>@string/pref_camera_picture_format_value_raw_yuv_8bit_vyuy</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_10gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_10grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_10rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_10bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_12gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_12grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_12rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_qcom_12bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_10gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_10grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_10rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_10bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_12gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_12grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_12rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_mipi_12bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_10gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_10grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_10rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_10bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_12gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_12grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_12rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_qcom_12bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_10gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_10grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_10rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_10bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_12gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_12grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_12rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_mipi_12bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain8_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain8_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain8_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain8_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_8gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_8grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_8rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_8bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_10gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_10grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_10rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_10bggr</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_12gbrg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_12grbg</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_12rggb</item>
+        <item>@string/pref_camera_picture_format_value_raw_bayer_ideal_plain16_12bggr</item>
+    </string-array>
+
+    <!-- Camera Preferences JPEG quality dialog box entries -->
+    <string-array name="pref_camera_jpegquality_entries" translatable="false">
+        <item>@string/pref_camera_jpegquality_entry_0</item>
+        <item>@string/pref_camera_jpegquality_entry_1</item>
+        <item>@string/pref_camera_jpegquality_entry_2</item>
+        <item>@string/pref_camera_jpegquality_entry_3</item>
+        <item>@string/pref_camera_jpegquality_entry_4</item>
+        <item>@string/pref_camera_jpegquality_entry_5</item>
+        <item>@string/pref_camera_jpegquality_entry_superfine</item>
+        <item>@string/pref_camera_jpegquality_entry_fine</item>
+        <item>@string/pref_camera_jpegquality_entry_normal</item>
+    </string-array>
+
+    <string-array name="pref_camera_jpegquality_entryvalues" translatable="false">
+        <item>55</item>
+        <item>65</item>
+        <item>75</item>
+        <item>85</item>
+        <item>95</item>
+        <item>100</item>
+        <item>superfine</item>
+        <item>fine</item>
+        <item>normal</item>
+    </string-array>
+
+    <!-- Camera Preferences Color effect dialog box entries -->
+    <string-array name="pref_camera_coloreffect_entries" translatable="false">
+        <item>@string/pref_camera_coloreffect_entry_none</item>
+        <item>@string/pref_camera_coloreffect_entry_mono</item>
+        <item>@string/pref_camera_coloreffect_entry_sepia</item>
+        <item>@string/pref_camera_coloreffect_entry_negative</item>
+        <item>@string/pref_camera_coloreffect_entry_solarize</item>
+        <item>@string/pref_camera_coloreffect_entry_posterize</item>
+        <item>@string/pref_camera_coloreffect_entry_aqua</item>
+        <item>@string/pref_camera_coloreffect_entry_emboss</item>
+        <item>@string/pref_camera_coloreffect_entry_sketch</item>
+        <item>@string/pref_camera_coloreffect_entry_neon</item>
+        <item>@string/pref_camera_coloreffect_entry_pastel</item>
+        <item>@string/pref_camera_coloreffect_entry_mosaic</item>
+        <item>@string/pref_camera_coloreffect_entry_redtint</item>
+        <item>@string/pref_camera_coloreffect_entry_bluetint</item>
+        <item>@string/pref_camera_coloreffect_entry_greentint</item>
+    </string-array>
+
+    <string-array name="pref_camera_coloreffect_entryvalues" translatable="false">
+        <item>none</item>
+        <item>mono</item>
+        <item>sepia</item>
+        <item>negative</item>
+        <item>solarize</item>
+        <item>posterize</item>
+        <item>aqua</item>
+        <item>emboss</item>
+        <item>sketch</item>
+        <item>neon</item>
+        <item>pastel</item>
+        <item>mosaic</item>
+        <item>red-tint</item>
+        <item>blue-tint</item>
+        <item>green-tint</item>
+    </string-array>
+
+    <!-- Camera Preferences AE Bracketing dialog box entries -->
+    <string-array name="pref_camera_ae_bracket_hdr_entries">
+        <item>@string/pref_camera_ae_bracket_hdr_entry_off</item>
+        <item>@string/pref_camera_ae_bracket_hdr_entry_on</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_ae_bracket_hdr_entryvalues">
+        <item>Off</item>
+        <item>AE-Bracket</item>
+    </string-array>
+
+    <!-- Camera Preferences Touch AF/AEC dialog box entries -->
+    <string-array name="pref_camera_touchafaec_entries">
+        <item>@string/pref_camera_touchafaec_entry_off</item>
+        <item>@string/pref_camera_touchafaec_entry_on</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_touchafaec_entryvalues">
+        <item>touch-off</item>
+        <item>touch-on</item>
+    </string-array>
+
+    <!-- DIS dialog box entries -->
+    <string-array name="pref_camera_dis_entries">
+        <item>@string/pref_camera_dis_entry_off</item>
+        <item>@string/pref_camera_dis_entry_on</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_dis_entryvalues">
+        <item>disable</item>
+        <item>enable</item>
+    </string-array>
+
+    <!-- Face Recognition dialog box entries -->
+    <string-array name="pref_camera_facerc_entries">
+        <item>@string/pref_camera_facerc_entry_off</item>
+        <item>@string/pref_camera_facerc_entry_on</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_facerc_entryvalues">
+        <item>off</item>
+        <item>on</item>
+   </string-array>
+
+    <!-- Camera Preferences MultiLevel dialog box entries -->
+    <string-array name="pref_camera_sharpness_entries">
+        <item>@string/pref_camera_sharpness_entry_level0</item>
+        <item>@string/pref_camera_sharpness_entry_level1</item>
+        <item>@string/pref_camera_sharpness_entry_level2</item>
+        <item>@string/pref_camera_sharpness_entry_level3</item>
+        <item>@string/pref_camera_sharpness_entry_level4</item>
+        <item>@string/pref_camera_sharpness_entry_level5</item>
+        <item>@string/pref_camera_sharpness_entry_level6</item>
+    </string-array>
+
+    <!-- Camera Preferences MultiLevel dialog box entries -->
+    <string-array name="pref_camera_contrast_entries">
+        <item>@string/pref_camera_contrast_entry_level0</item>
+        <item>@string/pref_camera_contrast_entry_level1</item>
+        <item>@string/pref_camera_contrast_entry_level2</item>
+        <item>@string/pref_camera_contrast_entry_level3</item>
+        <item>@string/pref_camera_contrast_entry_level4</item>
+        <item>@string/pref_camera_contrast_entry_level5</item>
+        <item>@string/pref_camera_contrast_entry_level6</item>
+        <item>@string/pref_camera_contrast_entry_level7</item>
+        <item>@string/pref_camera_contrast_entry_level8</item>
+        <item>@string/pref_camera_contrast_entry_level9</item>
+        <item>@string/pref_camera_contrast_entry_level10</item>
+    </string-array>
+
+    <!-- Camera Preferences Saturation dialog box entries -->
+    <string-array name="pref_camera_saturation_entries">
+        <item>@string/pref_camera_saturation_entry_level0</item>
+        <item>@string/pref_camera_saturation_entry_level1</item>
+        <item>@string/pref_camera_saturation_entry_level2</item>
+        <item>@string/pref_camera_saturation_entry_level3</item>
+        <item>@string/pref_camera_saturation_entry_level4</item>
+        <item>@string/pref_camera_saturation_entry_level5</item>
+        <item>@string/pref_camera_saturation_entry_level6</item>
+        <item>@string/pref_camera_saturation_entry_level7</item>
+        <item>@string/pref_camera_saturation_entry_level8</item>
+        <item>@string/pref_camera_saturation_entry_level9</item>
+        <item>@string/pref_camera_saturation_entry_level10</item>
+    </string-array>
+
+    <!-- Entry Valur array for sharpness -->
+    <string-array name="pref_camera_multilevel_sharpness_entryvalues">
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+    </string-array>
+
+    <!-- Entry values array is shared between Saturation & Contrast -->
+    <string-array name="pref_camera_multilevel_entryvalues">
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </string-array>
+
+    <!-- Camera Preferences ISO dialog box entries -->
+     <string-array name="pref_camera_iso_entries">
+         <item>@string/pref_camera_iso_entry_auto</item>
+         <item>@string/pref_camera_iso_entry_isodeblur</item>
+         <item>@string/pref_camera_iso_entry_iso100</item>
+         <item>@string/pref_camera_iso_entry_iso200</item>
+         <item>@string/pref_camera_iso_entry_iso400</item>
+         <item>@string/pref_camera_iso_entry_iso800</item>
+         <item>@string/pref_camera_iso_entry_iso1600</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_iso_entryvalues">
+         <item>@string/pref_camera_iso_value_auto</item>
+         <item>@string/pref_camera_iso_value_isodeblur</item>
+         <item>@string/pref_camera_iso_value_iso100</item>
+         <item>@string/pref_camera_iso_value_iso200</item>
+         <item>@string/pref_camera_iso_value_iso400</item>
+         <item>@string/pref_camera_iso_value_iso800</item>
+         <item>@string/pref_camera_iso_value_iso1600</item>
+     </string-array>
+
+    <!-- Camera Preferences Anti Banding dialog box entries -->
+     <string-array name="pref_camera_antibanding_entries">
+         <item>@string/pref_camera_antibanding_entry_0</item>
+         <item>@string/pref_camera_antibanding_entry_1</item>
+         <item>@string/pref_camera_antibanding_entry_2</item>
+         <item>@string/pref_camera_antibanding_entry_3</item>
+     </string-array>
+
+     <string-array name="pref_camera_antibanding_entryvalues">
+         <item>off</item>
+         <item>50hz</item>
+         <item>60hz</item>
+         <item>auto</item>
+     </string-array>
+
+     <!-- Camera Preferences Histogram dialog box entries -->
+     <string-array name="pref_camera_histogram_entries">
+          <item>@string/pref_camera_histogram_entry_enable</item>
+          <item>@string/pref_camera_histogram_entry_disable</item>
+     </string-array>
+
+     <!-- Video Preferences High Frame Rate dialog box entries -->
+     <string-array name="pref_camera_hfr_entries">
+          <item>@string/pref_camera_hfr_entry_off</item>
+          <item>@string/pref_camera_hfr_entry_2x</item>
+          <item>@string/pref_camera_hfr_entry_3x</item>
+          <item>@string/pref_camera_hfr_entry_4x</item>
+     </string-array>
+
+     <!-- Do not localize entryvalues -->
+     <string-array name="pref_camera_hfr_entryvalues">
+          <item>@string/pref_camera_hfr_value_off</item>
+          <item>@string/pref_camera_hfr_value_2x</item>
+          <item>@string/pref_camera_hfr_value_3x</item>
+          <item>@string/pref_camera_hfr_value_4x</item>
+     </string-array>
+
+     <!-- Do not localize entryvalues -->
+     <string-array name="pref_camera_histogram_entryvalues">
+          <item>@string/pref_camera_histogram_value_enable</item>
+          <item>@string/pref_camera_histogram_value_disable</item>
+     </string-array>
+
+    <!-- Camera Preferences Face Detection dialog box entries -->
+    <string-array name="pref_camera_facedetection_entries">
+         <item>@string/pref_camera_facedetection_entry_off</item>
+         <item>@string/pref_camera_facedetection_entry_on</item>
+    </string-array>
+
+    <string-array name="pref_camera_facedetection_entryvalues" translatable="false">
+        <item>off</item>
+        <item>on</item>
+    </string-array>
+
+    <!-- Camera Preferences Wavelet Denoise dialog box entries -->
+    <string-array name="pref_camera_denoise_entryvalues" translatable="false">
+        <item>denoise-off</item>
+        <item>denoise-on</item>
+    </string-array>
+
+    <string-array name="pref_camera_denoise_entries" translatable="false">
+    <item>@string/pref_camera_denoise_entry_off</item>
+    <item>@string/pref_camera_denoise_entry_on</item>
+    </string-array>
+
+    <!-- Camera Preferences Auto Scene Detection dialog box entries -->
+    <string-array name="pref_camera_scenedetect_entries" translatable="false">
+        <item>@string/pref_camera_scenedetect_entry_off</item>
+        <item>@string/pref_camera_scenedetect_entry_on</item>
+    </string-array>
+    <string-array name="pref_camera_scenedetect_entryvalues" translatable="false">
+        <item>off</item>
+        <item>on</item>
+    </string-array>
+
+    <!-- Camera Preferences Auto Exposure dialog box entries -->
+     <string-array name="pref_camera_autoexposure_entries">
+         <item>@string/pref_camera_autoexposure_entry_frameaverage</item>
+         <item>@string/pref_camera_autoexposure_entry_centerweighted</item>
+         <item>@string/pref_camera_autoexposure_entry_spotmetering</item>
+     </string-array>
+
+     <!-- Do not localize entryvalues -->
+     <string-array name="pref_camera_autoexposure_entryvalues">
+         <item>@string/pref_camera_autoexposure_value_frameaverage</item>
+         <item>@string/pref_camera_autoexposure_value_centerweighted</item>
+         <item>@string/pref_camera_autoexposure_value_spotmetering</item>
+     </string-array>
+    <!-- Camera Preferences Video Encoder dialog box entries -->
+    <string-array name="pref_camera_videoencoder_entries" translatable="false">
+        <item>@string/pref_camera_videoencoder_entry_0</item>
+        <item>@string/pref_camera_videoencoder_entry_1</item>
+        <item>@string/pref_camera_videoencoder_entry_2</item>
+    </string-array>
+
+    <string-array name="pref_camera_videoencoder_entryvalues" translatable="false">
+        <item>m4v</item>
+        <item>h263</item>
+        <item>h264</item>
+    </string-array>
+
+    <!-- Camera Preferences Audio Encoder dialog box entries -->
+    <string-array name="pref_camera_audioencoder_entries" translatable="false">
+        <item>@string/pref_camera_audioencoder_entry_0</item>
+        <item>@string/pref_camera_audioencoder_entry_1</item>
+    </string-array>
+
+    <string-array name="pref_camera_audioencoder_entryvalues" translatable="false">
+        <item>amrnb</item>
+        <item>aac</item>
+    </string-array>
+
+    <!-- Camera Preferences Video Duration dialog box entries -->
+    <string-array name="pref_camera_video_duration_entries" translatable="false">
+    <item>@string/pref_camera_video_duration_entry_mms</item>
+    <item>@string/pref_camera_video_duration_entry_10</item>
+    <item>@string/pref_camera_video_duration_entry_30</item>
+    </string-array>
+
+    <!-- The numbers are in minutes, except -1 means the duration suitable for mms. -->
+    <string-array name="pref_camera_video_duration_entryvalues" translatable="false">
+    <item>-1</item>
+    <item>10</item>
+    <item>30</item>
+    </string-array>
+
+    <!-- Camera Preferences Skin Tone Enhancement dialog box entries -->
+     <string-array name="pref_camera_skinToneEnhancement_entries">
+          <item>@string/pref_camera_skinToneEnhancement_entry_enable</item>
+          <item>@string/pref_camera_skinToneEnhancement_entry_disable</item>
+     </string-array>
+
+     <!-- Do not localize entryvalues -->
+     <string-array name="pref_camera_skinToneEnhancement_entryvalues">
+          <item>@string/pref_camera_skinToneEnhancement_value_enable</item>
+          <item>@string/pref_camera_skinToneEnhancement_value_disable</item>
+     </string-array>
+
+     <!-- Camera Preferences Redeye Reduction dialog box entries -->
+     <string-array name="pref_camera_redeyereduction_entries" translatable="false">
+         <item>@string/pref_camera_redeyereduction_entry_enable</item>
+         <item>@string/pref_camera_redeyereduction_entry_disable</item>
+     </string-array>
+
+     <string-array name="pref_camera_redeyereduction_entryvalues" translatable="false">
+         <item>enable</item>
+         <item>disable</item>
+     </string-array>
+    <!-- Camera Preferences Selectable Zone AF dialog box entries -->
+    <string-array name="pref_camera_selectablezoneaf_entries" translatable="false">
+        <item>@string/pref_camera_selectablezoneaf_entry_auto</item>
+        <item>@string/pref_camera_selectablezoneaf_entry_spotmetering</item>
+        <item>@string/pref_camera_selectablezoneaf_entry_centerweighted</item>
+        <item>@string/pref_camera_selectablezoneaf_entry_frameaverage</item>
+    </string-array>
+
+    <string-array name="pref_camera_selectablezoneaf_entryvalues" translatable="false">
+         <item>@string/pref_camera_selectablezoneaf_value_auto</item>
+         <item>@string/pref_camera_selectablezoneaf_value_spotmetering</item>
+         <item>@string/pref_camera_selectablezoneaf_value_centerweighted</item>
+         <item>@string/pref_camera_selectablezoneaf_value_frameaverage</item>
+    </string-array>
+
+    <!-- ZSL dialog box entries -->
+    <string-array name="pref_camera_zsl_entries" translatable="false">
+    <item>@string/pref_camera_zsl_entry_off</item>
+    <item>@string/pref_camera_zsl_entry_on</item>
+    </string-array>
+
+    <string-array name="pref_camera_zsl_entryvalues" translatable="false">
+    <item>@string/pref_camera_zsl_value_off</item>
+    <item>@string/pref_camera_zsl_value_on</item>
+    </string-array>
+
+    <!-- Video HDR dialog box entries -->
+    <string-array name="pref_camera_video_hdr_entries" translatable="false">
+        <item>@string/pref_camera_video_hdr_entry_off</item>
+        <item>@string/pref_camera_video_hdr_entry_on</item>
+    </string-array>
+
+    <string-array name="pref_camera_video_hdr_entryvalues" translatable="false">
+        <item>@string/pref_camera_video_hdr_value_off</item>
+        <item>@string/pref_camera_video_hdr_value_on</item>
+    </string-array>
+</resources>
+
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
new file mode 100644
index 0000000..05eec50
--- /dev/null
+++ b/res/values/qcomstrings.xml
@@ -0,0 +1,627 @@
+<!--
+    Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+
+    Not a Contribution.
+
+    Copyright (C) 2007 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <!-- Video quality setting entry. Videos will be recorded in FWVGA quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_fwvga" translatable="false">FWVGA</string>
+    <!-- Video quality setting entry. Videos will be recorded in WVGA quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_wvga" translatable="false">WVGA</string>
+    <!-- Video quality setting entry. Videos will be recorded in VGA quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_vga" translatable="false">VGA</string>
+    <!-- Video quality setting entry. Videos will be recorded in WQVGA quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_wqvga" translatable="false">WQVGA</string>
+    <!-- Video quality setting entry. Videos will be recorded in CIF quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_cif" translatable="false">CIF</string>
+    <!-- Video quality setting entry. Videos will be recorded in QVGA quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_qvga" translatable="false">QVGA</string>
+    <!-- Video quality setting entry. Videos will be recorded in QCIF quality. [CHAR LIMIT=24] -->
+    <string name="pref_video_quality_entry_qcif" translatable="false">QCIF</string>
+
+    <!-- Settings screen, Power Mode title -->
+    <string name="pref_camera_powermode_title">Power Mode</string>
+
+    <!-- Settings screen, Power mode dialog radio button choices -->
+    <string name="pref_camera_powermode_entry_lp">Low_Power</string>
+    <string name="pref_camera_powermode_entry_np">Normal_Power</string>
+
+    <!-- Settings screen, Power mode dialog radio button choices -->
+    <string name="pref_camera_powermode_value_lp">Low_Power</string>
+    <string name="pref_camera_powermode_value_np">Normal_Power</string>
+
+    <!-- Default Power mode.. -->
+    <string name="pref_camera_powermode_default" translatable="false">Normal_Power</string>
+
+    <!-- Default auto exposure setting. Do not translate. -->
+    <string name="pref_camera_autoexposure_default">frame-average</string>
+    <!-- Settings screen, Select auto exposure title -->
+    <string name="pref_camera_autoexposure_title">Select Auto Exposure Mode</string>
+
+    <!-- Settings screen, auto exposure dialog radio button choices -->
+    <string name="pref_camera_autoexposure_entry_frameaverage">Frame Average</string>
+    <string name="pref_camera_autoexposure_entry_centerweighted">Center Weighted</string>
+    <string name="pref_camera_autoexposure_entry_spotmetering">Spot Metering</string>
+
+    <!-- Auto exposure entry values. Do not translate. -->
+    <string name="pref_camera_autoexposure_value_frameaverage">frame-average</string>
+    <string name="pref_camera_autoexposure_value_centerweighted">center-weighted</string>
+    <string name="pref_camera_autoexposure_value_spotmetering">spot-metering</string>
+
+    <!-- Settings screen, Video encoder title -->
+    <string name="pref_camera_videoencoder_title">Video Encoder</string>
+
+    <!-- Settings screen, Video encoder dialog radio button choices -->
+    <string name="pref_camera_videoencoder_entry_0">MPEG4</string>
+    <string name="pref_camera_videoencoder_entry_1">H263</string>
+    <string name="pref_camera_videoencoder_entry_2">H264</string>
+
+    <!-- Default video encoder setting. A numerical value. -->
+    <string name="pref_camera_videoencoder_default" translatable="false">h264</string>
+
+    <!-- Settings screen, Video encoder dialog title -->
+    <string name="pref_camera_videoencoder_dialogtitle">Video Encoder</string>
+
+    <!-- Default audio encoder setting. A numerical value. -->
+    <string name="pref_camera_audioencoder_default" translatable="false">aac</string>
+
+    <!-- Settings screen, Audio encoder title -->
+    <string name="pref_camera_audioencoder_title">Audio Encoder</string>
+
+    <!-- Settings screen, Audio encoder dialog radio button choices -->
+    <string name="pref_camera_audioencoder_entry_0">AMRNB</string>
+    <string name="pref_camera_audioencoder_entry_1">AAC</string>
+    <!-- Default video duration setting. A numerical value.-->
+    <string name="pref_camera_video_duration_default" translatable="false">10</string>
+
+    <!-- Settings screen, Video duration title -->
+    <string name="pref_camera_video_duration_title">Video duration</string>
+
+    <!-- Settings screen, Video duration dialog radio button choices -->
+    <string name="pref_camera_video_duration_entry_mms">30 seconds(MMS)</string>
+    <string name="pref_camera_video_duration_entry_10">10 minutes</string>
+    <string name="pref_camera_video_duration_entry_30">30 minutes</string>
+
+    <!-- Default Skin Tone Enhancement setting. Do not translate. -->
+    <string name="pref_camera_skinToneEnhancement_default">disable</string>
+
+    <!-- Settings screen, Select Skin Tone Enhancement title -->
+    <string name="pref_camera_skinToneEnhancement_title">Skin Tone Enhancement</string>
+
+    <!-- Settings screen, Skin Tone Enhancement radio button choices -->
+    <string name="pref_camera_skinToneEnhancement_entry_enable">Enable</string>
+    <string name="pref_camera_skinToneEnhancement_entry_disable">Disable</string>
+
+    <!-- Skin Tone Enhancement entry values. Do not translate. -->
+    <string name="pref_camera_skinToneEnhancement_value_enable">enable</string>
+    <string name="pref_camera_skinToneEnhancement_value_disable">disable</string>
+    <!-- Settings screen, setting title text for ZSL-->
+    <string name="pref_camera_zsl_title">ZSL</string>
+
+    <string name="pref_camera_zsl_default" translatable="false">off</string>
+
+         <!-- Default selectable zone af setting. Do not translate. -->
+     <string name="pref_camera_selectablezoneaf_default">auto</string>
+
+     <!-- Settings screen, Selectable zone af title -->
+     <string name="pref_camera_selectablezoneaf_title"> Selectable Zone Auto Focus</string>
+
+     <!-- Settings screen, Selectable Zone Af dialog radio button choices -->
+     <string name="pref_camera_selectablezoneaf_entry_auto">Auto</string>
+     <string name="pref_camera_selectablezoneaf_entry_spotmetering">Spot Metering</string>
+     <string name="pref_camera_selectablezoneaf_entry_centerweighted">Center Weighted</string>
+     <string name="pref_camera_selectablezoneaf_entry_frameaverage">Frame Average</string>
+
+     <!-- Auto exposure entry values. Do not translate. -->
+     <string name="pref_camera_selectablezoneaf_value_auto">auto</string>
+     <string name="pref_camera_selectablezoneaf_value_spotmetering">spot-metering</string>
+     <string name="pref_camera_selectablezoneaf_value_centerweighted">center-weighted</string>
+     <string name="pref_camera_selectablezoneaf_value_frameaverage">frame-average</string>
+
+    <!-- Settings screen, ZSL location dialog choices -->
+    <string name="pref_camera_zsl_entry_off">Off</string>
+    <string name="pref_camera_zsl_entry_on">On</string>
+
+    <string name="pref_camera_zsl_value_off">off</string>
+    <string name="pref_camera_zsl_value_on">on</string>
+
+    <!-- Settings screen, Video HDR location dialog choices -->
+    <string name="pref_camera_video_hdr_entry_off">Off</string>
+    <string name="pref_camera_video_hdr_entry_on">On</string>
+
+    <string name="pref_camera_video_hdr_value_off">off</string>
+    <string name="pref_camera_video_hdr_value_on">on</string>
+
+    <!-- Settings screen, setting title text for Video HDR-->
+    <string name="pref_camera_video_hdr_title">Video HDR</string>
+
+    <string name="pref_camera_video_hdr_default" translatable="false">off</string>
+
+    <!-- Default face  detection setting. -->
+    <string name="pref_camera_facedetection_default" translatable="false">on</string>
+
+    <!-- Settings screen, Select Face Detection -->
+    <string name="pref_camera_facedetection_title">Face Detection</string>
+
+    <!-- Settings menu, Face Detection choices -->
+    <string name="pref_camera_facedetection_entry_off">Off</string>
+    <string name="pref_camera_facedetection_entry_on">On</string>
+
+     <!-- Default redeye reduction setting. -->
+     <string name="pref_camera_redeyereduction_default" translatable="false">disable</string>
+
+     <!-- Settings screen, Select Redeye Reduction -->
+     <string name="pref_camera_redeyereduction_title">Redeye Reduction</string>
+
+     <!-- Settings menu, redeye reduction choices -->
+     <string name="pref_camera_redeyereduction_entry_enable">Enable</string>
+     <string name="pref_camera_redeyereduction_entry_disable">Disable</string>
+     <!-- Default mce setting. Do not translate. -->
+     <string name="pref_camera_mce_default">enable</string>
+
+     <!-- The message is shown in dialog when the app encounters an unsupported resolution for HFR mode -->
+     <string name="error_app_unsupported_hfr">HFR is not supported for selected resolution</string>
+
+     <!-- The message is shown in dialog when the app encounters an unsupported video codec for HFR mode -->
+     <string name="error_app_unsupported_hfr_codec">Only H264 video encoding is supported when HFR is ON</string>
+
+     <!-- The message is shown in dialog when the app encounters an unsupported video resolution-->
+     <string name="error_app_unsupported">Unsupported video resolution for this encoder type</string>
+
+    <!--The message is shown in dialog when the raw snapshot is selected in zsl mode-->
+    <string name="error_app_unsupported_raw">Raw picture format is not supported
+        in zsl mode
+    </string>
+
+    <string name="error_app_unsupported_hdr_zsl">HDR is not supported in zsl
+        mode</string>
+
+     <!-- Settings screen, AE bracketing and HDR location dialog choices -->
+     <string name="pref_camera_ae_bracket_hdr_entry_ae_bracket">AE-Bracket</string>
+
+     <string name="pref_camera_ae_bracket_hdr_value_ae_bracket">AE-Bracket</string>
+
+     <string name="pref_camera_ae_bracket_hdr_title" translatable="false">AE-Bracket</string>
+
+     <string name="pref_camera_ae_bracket_hdr_default" translatable="false">Off</string>
+
+     <string name="pref_camera_ae_bracket_hdr_entry_on">On</string>
+
+     <string name="pref_camera_ae_bracket_hdr_entry_off">Off</string>
+
+     <string name="err_app_unsupport_ae_bracket_code">no ae bracket support by Apps now</string>
+
+        <!-- The messsage shown if user selects a snapshot resolution lower than the current video size. -->
+    <string name="snapshot_lower_than_video">Video snapshot size lower than video size. Capping to Video size. Please select a resolution higher or equal to the current video size. </string>
+
+    <!-- The messsage shown if user selects a snapshot resolution in low power mode. -->
+    <string name="snapshotsize_low_powermode">We do not support picture
+        resolution in Low Power Mode. Video size snapshot will be taken. Please
+        select High power mode for picture size.
+    </string>
+
+    <!-- The messsage shown if user tries to take snapshot during D1/QCIF resolution. -->
+    <string name="snapshot_qcif_and_d1">Only Video size snapshot supported for this resolution. </string>
+
+     <!-- Default hfr setting. Do not translate. -->
+     <string name="pref_camera_hfr_default">off</string>
+
+     <!-- Settings screen, Select hfr title -->
+     <string name="pref_camera_hfr_title">Video High FrameRate</string>
+
+     <!-- Settings screen, hfr radio button choices -->
+     <string name="pref_camera_hfr_entry_off">Off</string>
+     <string name="pref_camera_hfr_entry_2x">60</string>
+     <string name="pref_camera_hfr_entry_3x">90</string>
+     <string name="pref_camera_hfr_entry_4x">120</string>
+
+     <!-- HFR entry values. Do not translate. -->
+     <string name="pref_camera_hfr_value_off">off</string>
+     <string name="pref_camera_hfr_value_2x">60</string>
+     <string name="pref_camera_hfr_value_3x">90</string>
+     <string name="pref_camera_hfr_value_4x">120</string>
+
+        <!-- Denoise Settings screen, setting title text -->
+    <string name="pref_camera_denoise_title">Wavelet Denoise Mode</string>
+    <string name="pref_camera_denoise_default" translatable="false">denoise-on</string>
+
+    <!-- Denoise Settings screen, Record location dialog choices -->
+    <string name="pref_camera_denoise_entry_off">Off</string>
+    <string name="pref_camera_denoise_entry_on">On</string>
+
+     <!-- Default iso setting. Do not translate. -->
+     <string name="pref_camera_iso_default">auto</string>
+
+     <!-- Settings screen, Select Iso title -->
+     <string name="pref_camera_iso_title">Select ISO</string>
+
+     <!-- Settings screen, ISO dialog radio button choices -->
+     <string name="pref_camera_iso_entry_auto">Auto</string>
+     <string name="pref_camera_iso_entry_isodeblur">ISO Auto(HJR)</string>
+     <string name="pref_camera_iso_entry_iso100">ISO100</string>
+     <string name="pref_camera_iso_entry_iso200">ISO200</string>
+     <string name="pref_camera_iso_entry_iso400">ISO400</string>
+     <string name="pref_camera_iso_entry_iso800">ISO800</string>
+     <string name="pref_camera_iso_entry_iso1600">ISO1600</string>
+
+     <!-- ISO entry values. Do not translate. -->
+     <string name="pref_camera_iso_value_auto">auto</string>
+     <string name="pref_camera_iso_value_isodeblur">ISO_HJR</string>
+     <string name="pref_camera_iso_value_iso100">ISO100</string>
+     <string name="pref_camera_iso_value_iso200">ISO200</string>
+     <string name="pref_camera_iso_value_iso400">ISO400</string>
+     <string name="pref_camera_iso_value_iso800">ISO800</string>
+     <string name="pref_camera_iso_value_iso1600">ISO1600</string>
+
+     <!-- Settings screen, Anti Banding title -->
+     <string name="pref_camera_antibanding_title">Anti Banding</string>
+
+     <!-- Default Anti Banding setting. -->
+     <string name="pref_camera_antibanding_default">off</string>
+
+     <!-- Settings screen, Anti Banding entries -->
+     <string name="pref_camera_antibanding_entry_0">Off</string>
+     <string name="pref_camera_antibanding_entry_1">50 Hz</string>
+     <string name="pref_camera_antibanding_entry_2">60 Hz</string>
+     <string name="pref_camera_antibanding_entry_3">Auto</string>
+
+        <!-- Default color effect setting. -->
+    <string name="pref_camera_coloreffect_default" translatable="false">none</string>
+
+    <!-- Settings screen, Select Color effect title -->
+    <string name="pref_camera_coloreffect_title">Color effect</string>
+
+    <!-- Settings screen, Color effect dialog radio button choices -->
+    <string name="pref_camera_coloreffect_entry_none">None</string>
+    <string name="pref_camera_coloreffect_entry_mono">Mono</string>
+    <string name="pref_camera_coloreffect_entry_sepia">Sepia</string>
+    <string name="pref_camera_coloreffect_entry_negative">Negative</string>
+    <!-- Color effect that overexposes and reverses some of the tones. -->
+    <string name="pref_camera_coloreffect_entry_solarize">Solarize</string>
+    <string name="pref_camera_coloreffect_entry_posterize">Posterize</string>
+    <string name="pref_camera_coloreffect_entry_aqua">Aqua</string>
+    <string name="pref_camera_coloreffect_entry_emboss">Emboss</string>
+    <string name="pref_camera_coloreffect_entry_sketch">Sketch</string>
+    <string name="pref_camera_coloreffect_entry_neon">Neon</string>
+    <string name="pref_camera_coloreffect_entry_pastel">Pastel</string>
+    <string name="pref_camera_coloreffect_entry_mosaic">Mosaic</string>
+    <string name="pref_camera_coloreffect_entry_redtint">Red tint</string>
+    <string name="pref_camera_coloreffect_entry_bluetint">Blue tint</string>
+    <string name="pref_camera_coloreffect_entry_greentint">Green tint</string>
+
+    <!-- Default Touch AF/AEC setting. Do not translate. -->
+    <string name="pref_camera_touchafaec_default">touch-on</string>
+
+    <!-- Settings screen, Select Touch AF/AEC title -->
+    <string name="pref_camera_touchafaec_title">Touch AF/AEC</string>
+
+    <!-- Settings screen, Touch AF/AEC dialog radio button choices -->
+    <string name="pref_camera_touchafaec_entry_off">Off</string>
+    <string name="pref_camera_touchafaec_entry_on">On</string>
+
+    <!-- Select DIS title -->
+    <string name="pref_camera_dis_title">DIS</string>
+    <string name="pref_camera_dis_default">disable</string>
+
+    <!-- DIS choices -->
+    <string name="pref_camera_dis_entry_off">Off</string>
+    <string name="pref_camera_dis_entry_on">On</string>
+
+    <!-- Select Face Recognition title -->
+    <string name="pref_camera_facerc_title">Face Recognition</string>
+
+    <string name="pref_camera_facerc_default">off</string>
+
+    <!-- Face Recognition choices -->
+    <string name="pref_camera_facerc_entry_off">Off</string>
+    <string name="pref_camera_facerc_entry_on">On</string>
+
+    <!-- Settings screen, Multiple levels entries -->
+    <string name="pref_camera_sharpness_entry_level0">Level 0</string>
+    <string name="pref_camera_sharpness_entry_level1">Level 1</string>
+    <string name="pref_camera_sharpness_entry_level2">Level 2(Default)</string>
+    <string name="pref_camera_sharpness_entry_level3">Level 3</string>
+    <string name="pref_camera_sharpness_entry_level4">Level 4</string>
+    <string name="pref_camera_sharpness_entry_level5">Level 5</string>
+    <string name="pref_camera_sharpness_entry_level6">Level 6</string>
+
+    <!-- Settings screen, Multiple levels entries -->
+    <string name="pref_camera_contrast_entry_level0">Level 0</string>
+    <string name="pref_camera_contrast_entry_level1">Level 1</string>
+    <string name="pref_camera_contrast_entry_level2">Level 2</string>
+    <string name="pref_camera_contrast_entry_level3">Level 3</string>
+    <string name="pref_camera_contrast_entry_level4">Level 4</string>
+    <string name="pref_camera_contrast_entry_level5">Level 5(Default)</string>
+    <string name="pref_camera_contrast_entry_level6">Level 6</string>
+    <string name="pref_camera_contrast_entry_level7">Level 7</string>
+    <string name="pref_camera_contrast_entry_level8">Level 8</string>
+    <string name="pref_camera_contrast_entry_level9">Level 9</string>
+    <string name="pref_camera_contrast_entry_level10">Level 10</string>
+
+    <!-- Settings screen, Multiple levels entries -->
+    <string name="pref_camera_saturation_entry_level0">Level 0</string>
+    <string name="pref_camera_saturation_entry_level1">Level 1</string>
+    <string name="pref_camera_saturation_entry_level2">Level 2</string>
+    <string name="pref_camera_saturation_entry_level3">Level 3</string>
+    <string name="pref_camera_saturation_entry_level4">Level 4</string>
+    <string name="pref_camera_saturation_entry_level5">Level 5(Default)</string>
+    <string name="pref_camera_saturation_entry_level6">Level 6</string>
+    <string name="pref_camera_saturation_entry_level7">Level 7</string>
+    <string name="pref_camera_saturation_entry_level8">Level 8</string>
+    <string name="pref_camera_saturation_entry_level9">Level 9</string>
+    <string name="pref_camera_saturation_entry_level10">Level 10</string>
+
+    <!-- Default sharpness setting. Do not translate. -->
+    <string name="pref_camera_sharpness_default">2</string>
+
+    <!-- Settings screen, Select sharpness title -->
+    <string name="pref_camera_sharpness_title">Sharpness</string>
+
+    <!-- Default contrast setting. Do not translate. -->
+    <string name="pref_camera_contrast_default">5</string>
+
+    <!-- Settings screen, Select contrast title -->
+    <string name="pref_camera_contrast_title">Contrast</string>
+
+    <!-- Default saturation setting. Do not translate. -->
+    <string name="pref_camera_saturation_default">5</string>
+
+    <!-- Settings screen, Select saturation title -->
+    <string name="pref_camera_saturation_title">Saturation</string>
+
+    <!-- Default picture quality setting. See
+         pref_camera_jpegquality_entryvalues for possible values -->
+    <string name="pref_camera_jpegquality_default" translatable="false">superfine</string>
+
+    <!-- Default Picture format setting. Do not translate. -->
+    <string name="pref_camera_picture_format_default">jpeg</string>
+
+    <!-- Settings screen, Select Picture format title -->
+    <string name="pref_camera_picture_format_title">Select Picture Format</string>
+
+    <!-- Settings screen, picture format dialog radio button choices -->
+    <string name="pref_camera_picture_format_entry_jpeg">Jpeg</string>
+    <string name="pref_camera_picture_format_entry_raw">Raw</string>
+    <string name="pref_camera_picture_format_entry_raw_yuv_422_sp">YUV422SP</string>
+    <string name="pref_camera_picture_format_entry_raw_yuv_8bit_yuyv">YUVRaw8YUYV</string>
+    <string name="pref_camera_picture_format_entry_raw_yuv_8bit_yvyu">YUVRaw8YVYU</string>
+    <string name="pref_camera_picture_format_entry_raw_yuv_8bit_uyvy">YUVRaw8UYVY</string>
+    <string name="pref_camera_picture_format_entry_raw_yuv_8bit_vyuy">YUVRaw8VYUY</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_8gbrg">BayerQ8GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_8grbg">BayerQ8GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_8rggb">BayerQ8RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_8bggr">BayerQ8BGRR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_10gbrg">BayerQ10GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_10grbg">BayerQ10GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_10rggb">BayerQ10RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_10bggr">BayerQ10BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_12gbrg">BayerQ12GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_12grbg">BayerQ12GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_12rggb">BayerQ12RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_qcom_12bggr">BayerQ12BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_8gbrg">BayerM8GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_8grbg">BayerM8GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_8rggb">BayerM8RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_8bggr">BayerM8BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_10gbrg">BayerM10GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_10grbg">BayerM10GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_10rggb">BayerM10RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_10bggr">BayerM10BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_12gbrg">BayerM12GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_12grbg">BayerM12GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_12rggb">BayerM12RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_mipi_12bggr">BayerM12BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8gbrg">BayerIQ8GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8grbg">BayerIQ8GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8rggb">BayerIQ8RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_8bggr">BayerIQ8BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10gbrg">BayerIQ10GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10grbg">BayerIQ10GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10rggb">BayerIQ10RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_10bggr">BayerIQ10BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12gbrg">BayerIQ12GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12grbg">BayerIQ12GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12rggb">BayerIQ12RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_qcom_12bggr">BayerIQ12BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8gbrg">BayerIM8GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8grbg">BayerIM8GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8rggb">BayerIM8RGGB</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_8bggr">BayerIM8BGGR</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10gbrg">BayerIM10GBRG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10grbg">BayerIM10GRBG</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10rggb">BayerIM10rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_10bggr">BayerIM8bggr</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12gbrg">BayerIM12gbrg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12grbg">BayerIM12grbg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12rggb">BayerIM12rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_mipi_12bggr">BayerIM12bggr</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8gbrg">BayerIP88gbrg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8grbg">BayerIP88grbg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8rggb">BayerIP88rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain8_8bggr">BayerIP88bggr</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8gbrg">BayerIP168gbrg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8grbg">BayerIP168grbg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8rggb">BayerIP168rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_8bggr">BayerIP168bggr</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10gbrg">BayerIP1610gbrg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10grbg">BayerIP1610grbg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10rggb">BayerIP1610rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_10bggr">BayerIP1610bggr</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12gbrg">BayerIP1612gbrg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12grbg">BayerIP1612grbg</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12rggb">BayerIP1612rggb</string>
+    <string name="pref_camera_picture_format_entry_raw_bayer_ideal_plain16_12bggr">BayerIP1612bggr</string>
+
+    <!-- Picture format entry values. Do not translate. -->
+    <string name="pref_camera_picture_format_value_jpeg">jpeg</string>
+    <string name="pref_camera_picture_format_value_raw">raw</string>
+    <string name="pref_camera_picture_format_value_raw_yuv_422_sp">yuv422sp</string>
+    <string name="pref_camera_picture_format_value_raw_yuv_8bit_yuyv">yuv-raw8-yuyv</string>
+    <string name="pref_camera_picture_format_value_raw_yuv_8bit_yvyu">yuv-raw8-yvyu</string>
+    <string name="pref_camera_picture_format_value_raw_yuv_8bit_uyvy">yuv-raw8-uyvy</string>
+    <string name="pref_camera_picture_format_value_raw_yuv_8bit_vyuy">yuv-raw8-vyuy</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_8gbrg">bayer-qcom-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_8grbg">bayer-qcom-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_8rggb">bayer-qcom-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_8bggr">bayer-qcom-8bgrr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_10gbrg">bayer-qcom-10gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_10grbg">bayer-qcom-10grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_10rggb">bayer-qcom-10rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_10bggr">bayer-qcom-10bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_12gbrg">bayer-qcom-12gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_12grbg">bayer-qcom-12grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_12rggb">bayer-qcom-12rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_qcom_12bggr">bayer-qcom-12bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_8gbrg">bayer-mipi-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_8grbg">bayer-mipi-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_8rggb">bayer-mipi-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_8bggr">bayer-mipi-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_10gbrg">bayer-mipi-10gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_10grbg">bayer-mipi-10grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_10rggb">bayer-mipi-10rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_10bggr">bayer-mipi-10bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_12gbrg">bayer-mipi-12gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_12grbg">bayer-mipi-12grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_12rggb">bayer-mipi-12rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_mipi_12bggr">bayer-mipi-12bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_8gbrg">bayer-ideal-qcom-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_8grbg">bayer-ideal-qcom-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_8rggb">bayer-ideal-qcom-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_8bggr">bayer-ideal-qcom-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_10gbrg">bayer-ideal-qcom-10gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_10grbg">bayer-ideal-qcom-10grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_10rggb">bayer-ideal-qcom-10rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_10bggr">bayer-ideal-qcom-10bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_12gbrg">bayer-ideal-qcom-12gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_12grbg">bayer-ideal-qcom-12grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_12rggb">bayer-ideal-qcom-12rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_qcom_12bggr">bayer-ideal-qcom-12bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_8gbrg">bayer-ideal-mipi-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_8grbg">bayer-ideal-mipi-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_8rggb">bayer-ideal-mipi-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_8bggr">bayer-ideal-mipi-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_10gbrg">bayer-ideal-mipi-10gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_10grbg">bayer-ideal-mipi-10grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_10rggb">bayer-ideal-mipi-10rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_10bggr">bayer-ideal-mipi-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_12gbrg">bayer-ideal-mipi-12gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_12grbg">bayer-ideal-mipi-12grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_12rggb">bayer-ideal-mipi-12rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_mipi_12bggr">bayer-ideal-mipi-12bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain8_8gbrg">bayer-ideal-plain8-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain8_8grbg">bayer-ideal-plain8-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain8_8rggb">bayer-ideal-plain8-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain8_8bggr">bayer-ideal-plain8-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_8gbrg">bayer-ideal-plain16-8gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_8grbg">bayer-ideal-plain16-8grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_8rggb">bayer-ideal-plain16-8rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_8bggr">bayer-ideal-plain16-8bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_10gbrg">bayer-ideal-plain16-10gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_10grbg">bayer-ideal-plain16-10grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_10rggb">bayer-ideal-plain16-10rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_10bggr">bayer-ideal-plain16-10bggr</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_12gbrg">bayer-ideal-plain16-12gbrg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_12grbg">bayer-ideal-plain16-12grbg</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_12rggb">bayer-ideal-plain16-12rggb</string>
+    <string name="pref_camera_picture_format_value_raw_bayer_ideal_plain16_12bggr">bayer-ideal-plain16-12bggr</string>
+    <!-- Settings screen, Picture quality title -->
+    <string name="pref_camera_jpegquality_title">Picture quality</string>
+
+    <!-- Settings screen, Picture quality dialog radio button choices -->
+    <string name="pref_camera_jpegquality_entry_superfine">Super fine</string>
+    <string name="pref_camera_jpegquality_entry_fine">Fine</string>
+    <string name="pref_camera_jpegquality_entry_normal">Normal</string>
+    <string name="pref_camera_jpegquality_entry_0">Jpeg 55%</string>
+    <string name="pref_camera_jpegquality_entry_1">Jpeg 65%</string>
+    <string name="pref_camera_jpegquality_entry_2">Jpeg 75%</string>
+    <string name="pref_camera_jpegquality_entry_3">Jpeg 85%</string>
+    <string name="pref_camera_jpegquality_entry_4">Jpeg 95%</string>
+    <string name="pref_camera_jpegquality_entry_5">Jpeg 100%</string>
+
+     <!-- Default auto histogram setting. Do not translate. -->
+     <string name="pref_camera_histogram_default">disable</string>
+
+     <!-- Settings screen, Select Histogram title -->
+     <string name="pref_camera_histogram_title">Histogram</string>
+
+     <!-- Settings screen, Histogram radio button choices -->
+     <string name="pref_camera_histogram_entry_enable">Enable</string>
+     <string name="pref_camera_histogram_entry_disable">Disable</string>
+
+     <!-- Histogram entry values. Do not translate. -->
+     <string name="pref_camera_histogram_value_enable">enable</string>
+     <string name="pref_camera_histogram_value_disable">disable</string>
+
+    <string name="pref_camera_picturesize_entry_1920x1080">HD1080</string>
+    <string name="pref_camera_picturesize_entry_1280x768">WXGA</string>
+    <string name="pref_camera_picturesize_entry_1280x720">HD720</string>
+    <string name="pref_camera_picturesize_entry_800x600">SVGA</string>
+    <string name="pref_camera_picturesize_entry_800x480">WVGA</string>
+    <string name="pref_camera_picturesize_entry_352x288">CIF</string>
+    <string name="pref_camera_picturesize_entry_176x144">QCIF</string>
+
+    <string name="pref_camera_focusmode_entry_normal">Normal</string>
+    <string name="pref_camera_focusmode_entry_continuous">CAF</string>
+
+    <string name="pref_camera_scenemode_entry_asd">ASD</string>
+    <!-- Scene mode that takes an image with as little noise as possible so details of the subject are maintained. -->
+    <string name="pref_camera_scenemode_entry_portrait">Portrait</string>
+    <!-- Scene mode that takes an image of a landscape assuming all subjects are relatively far from the phone. -->
+    <string name="pref_camera_scenemode_entry_landscape">Landscape</string>
+
+     <!-- Scene mode that takes night shots with long exposure and flash to illuminate the subject while still capturing darker detail in the background. -->
+    <string name="pref_camera_scenemode_entry_night_portrait">Night Portrait</string>
+    <!-- Scene mode to be used in a stage show. -->
+    <string name="pref_camera_scenemode_entry_theatre">Theatre</string>
+    <!-- Scene mode optimized for taking images on the beach. -->
+    <string name="pref_camera_scenemode_entry_beach">Beach</string>
+    <!-- Scene mode optimized for taking images in the snow. -->
+    <string name="pref_camera_scenemode_entry_snow">Snow</string>
+
+    <!-- Scene mode for taking a photo as sharp as possible. -->
+    <string name="pref_camera_scenemode_entry_steadyphoto">Steady Photo</string>
+    <!-- Scene mode optimized for taking images of fireworks. -->
+    <string name="pref_camera_scenemode_entry_fireworks">Fireworks</string>
+    <!-- Scene mode optimized for taking images during sports . -->
+    <string name="pref_camera_scenemode_entry_sports">Sports</string>
+    <!-- Scene mode optimized for capturing the naturally warm color of scenes lit by candles. [CHAR LIMIT=16] -->
+    <string name="pref_camera_scenemode_entry_candlelight">Candlelight</string>
+    <!-- Scene mode for taking a photo with backlight. -->
+    <string name="pref_camera_scenemode_entry_backlight">Backlight</string>
+    <!-- Scene mode optimized for taking images of flowers. -->
+    <string name="pref_camera_scenemode_entry_flowers">Flowers</string>
+    <!-- Scene mode optimized for taking images of AR. -->
+    <string name="pref_camera_scenemode_entry_ar">AR</string>
+
+    <!-- Default auto scene detection setting. -->
+    <string name="pref_camera_scenedetect_default" translatable="false">off</string>
+
+    <!-- Settings screen, Select Auto Scene Detection -->
+    <string name="pref_camera_scenedetect_title">Auto Scene Detection</string>
+
+    <!-- Settings menu, auto scene detection choices -->
+    <string name="pref_camera_scenedetect_entry_off">Off</string>
+    <!-- Scene detection set to on - supports backlight and snow cloudy detection. -->
+    <string name="pref_camera_scenedetect_entry_on">On</string>
+
+    <!-- Toast showing error if invalid size selected for  time lapse  [CHAR LIMIT=65] -->
+    <string name="time_lapse_error">Invalid video-size for time-lapse recording.</string>
+
+    <string name="pref_camera_videosnapsize_default" translatable="false">1920x1080</string>
+</resources>
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9879864..5d2b09b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -231,18 +231,14 @@
 
     <!-- The Video quality settings in preference [CHAR LIMIT=21] -->
     <string name="pref_video_quality_title">Video quality</string>
-    <!-- The default quality value is 5 (720p) -->
-    <string name="pref_video_quality_default" translatable="false">5</string>
+    <!-- The default quality value is 3 (CIF) -->
+    <string name="pref_video_quality_default" translatable="false">3</string>
     <!-- Video quality setting entry. Videos will be recorded in 1080p quality. [CHAR LIMIT=24] -->
     <string name="pref_video_quality_entry_1080p" translatable="false">HD 1080p</string>
     <!-- Video quality setting entry. Videos will be recorded in 720p quality. [CHAR LIMIT=24] -->
     <string name="pref_video_quality_entry_720p" translatable="false">HD 720p</string>
     <!-- Video quality setting entry. Videos will be recorded in 480p quality. [CHAR LIMIT=24] -->
     <string name="pref_video_quality_entry_480p" translatable="false">SD 480p</string>
-    <!-- Video quality setting entry. Videos will be recorded in the highest quality available on the device. [CHAR LIMIT=24] -->
-    <string name="pref_video_quality_entry_high">High</string>
-    <!-- Video quality setting entry. Videos will be recorded in the lowest quality available on the device. [CHAR LIMIT=24] -->
-    <string name="pref_video_quality_entry_low">Low</string>
 
     <!-- Describes the preference dialog for choosing interval between frame capture for
     time lapse recording. Appears at top of the dialog. [CHAR LIMIT=30] -->
@@ -260,6 +256,8 @@
 
     <!-- Settings screen, dialog choice for 13 megapixels picture size [CHAR LIMIT=20] -->
     <string name="pref_camera_picturesize_entry_13mp">13M pixels</string>
+    <!-- Settings screen, dialog choice for 12 megapixels picture size [CHAR LIMIT=20] -->
+    <string name="pref_camera_picturesize_entry_12mp">12M pixels</string>
     <!-- Settings screen, dialog choice for 8 megapixels picture size [CHAR LIMIT=20] -->
     <string name="pref_camera_picturesize_entry_8mp">8M pixels</string>
     <!-- Settings screen, dialog choice for 5 megapixels picture size [CHAR LIMIT=20] -->
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 975a15d..36165ab 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -37,9 +37,6 @@
             camera:title="@string/pref_camera_scenemode_title"
             camera:singleIcon="@drawable/ic_sce"
             camera:entries="@array/pref_camera_scenemode_entries"
-            camera:labelList="@array/pref_camera_scenemode_labels"
-            camera:icons="@array/pref_camera_scenemode_icons"
-            camera:largeIcons="@array/pref_camera_scenemode_icons"
             camera:entryValues="@array/pref_camera_scenemode_entryvalues" />
     <IconListPreference
             camera:key="pref_camera_whitebalance_key"
@@ -71,6 +68,12 @@
             camera:entries="@array/pref_camera_focusmode_entries"
             camera:labelList="@array/pref_camera_focusmode_labels"
             camera:entryValues="@array/pref_camera_focusmode_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_ae_bracket_hdr_key"
+            camera:defaultValue="@string/pref_camera_ae_bracket_hdr_default"
+            camera:title="@string/pref_camera_ae_bracket_hdr_title"
+            camera:entries="@array/pref_camera_ae_bracket_hdr_entries"
+            camera:entryValues="@array/pref_camera_ae_bracket_hdr_entryvalues" />
     <IconListPreference
             camera:key="pref_camera_id_key"
             camera:defaultValue="@string/pref_camera_id_default"
@@ -107,4 +110,124 @@
             camera:title="@string/pref_camera_timer_sound_title"
             camera:entries="@array/pref_camera_timer_sound_entries"
             camera:entryValues="@array/pref_camera_timer_sound_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_scenedetect_key"
+            camera:defaultValue="@string/pref_camera_scenedetect_default"
+            camera:title="@string/pref_camera_scenedetect_title"
+            camera:entries="@array/pref_camera_scenedetect_entries"
+            camera:entryValues="@array/pref_camera_scenedetect_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_facerc_key"
+            camera:defaultValue="@string/pref_camera_facerc_default"
+            camera:title="@string/pref_camera_facerc_title"
+            camera:entries="@array/pref_camera_facerc_entries"
+            camera:entryValues="@array/pref_camera_facerc_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_coloreffect_key"
+            camera:defaultValue="@string/pref_camera_coloreffect_default"
+            camera:title="@string/pref_camera_coloreffect_title"
+            camera:entries="@array/pref_camera_coloreffect_entries"
+            camera:entryValues="@array/pref_camera_coloreffect_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_jpegquality_key"
+            camera:defaultValue="@string/pref_camera_jpegquality_default"
+            camera:title="@string/pref_camera_jpegquality_title"
+            camera:entries="@array/pref_camera_jpegquality_entries"
+            camera:entryValues="@array/pref_camera_jpegquality_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_touchafaec_key"
+            camera:defaultValue="@string/pref_camera_touchafaec_default"
+            camera:title="@string/pref_camera_touchafaec_title"
+            camera:entries="@array/pref_camera_touchafaec_entries"
+            camera:entryValues="@array/pref_camera_touchafaec_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_iso_key"
+            camera:defaultValue="@string/pref_camera_iso_default"
+            camera:title="@string/pref_camera_iso_title"
+            camera:entries="@array/pref_camera_iso_entries"
+            camera:entryValues="@array/pref_camera_iso_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_histogram_key"
+            camera:defaultValue="@string/pref_camera_histogram_default"
+            camera:title="@string/pref_camera_histogram_title"
+            camera:entries="@array/pref_camera_histogram_entries"
+            camera:entryValues="@array/pref_camera_histogram_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_antibanding_key"
+            camera:defaultValue="@string/pref_camera_antibanding_default"
+            camera:title="@string/pref_camera_antibanding_title"
+            camera:entries="@array/pref_camera_antibanding_entries"
+            camera:entryValues="@array/pref_camera_antibanding_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_pictureformat_key"
+            camera:defaultValue="@string/pref_camera_picture_format_default"
+            camera:title="@string/pref_camera_picture_format_title"
+            camera:entries="@array/pref_camera_picture_format_entries"
+            camera:entryValues="@array/pref_camera_picture_format_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_sharpness_key"
+            camera:defaultValue="@string/pref_camera_sharpness_default"
+            camera:title="@string/pref_camera_sharpness_title"
+            camera:entries="@array/pref_camera_sharpness_entries"
+            camera:entryValues="@array/pref_camera_multilevel_sharpness_entryvalues"/>
+    <ListPreference
+            camera:key="pref_camera_contrast_key"
+            camera:defaultValue="@string/pref_camera_contrast_default"
+            camera:title="@string/pref_camera_contrast_title"
+            camera:entries="@array/pref_camera_contrast_entries"
+            camera:entryValues="@array/pref_camera_multilevel_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_saturation_key"
+            camera:defaultValue="@string/pref_camera_saturation_default"
+            camera:title="@string/pref_camera_saturation_title"
+            camera:entries="@array/pref_camera_saturation_entries"
+            camera:entryValues="@array/pref_camera_multilevel_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_denoise_key"
+            camera:defaultValue="@string/pref_camera_denoise_default"
+            camera:title="@string/pref_camera_denoise_title"
+            camera:entries="@array/pref_camera_denoise_entries"
+            camera:entryValues="@array/pref_camera_denoise_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_autoexposure_key"
+            camera:defaultValue="@string/pref_camera_autoexposure_default"
+            camera:title="@string/pref_camera_autoexposure_title"
+            camera:entries="@array/pref_camera_autoexposure_entries"
+            camera:entryValues="@array/pref_camera_autoexposure_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_skinToneEnhancement_key"
+            camera:defaultValue="@string/pref_camera_skinToneEnhancement_default"
+            camera:title="@string/pref_camera_skinToneEnhancement_title"
+            camera:entries="@array/pref_camera_skinToneEnhancement_entries"
+            camera:entryValues="@array/pref_camera_skinToneEnhancement_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_facedetection_key"
+            camera:defaultValue="@string/pref_camera_facedetection_default"
+            camera:title="@string/pref_camera_facedetection_title"
+            camera:entries="@array/pref_camera_facedetection_entries"
+            camera:entryValues="@array/pref_camera_facedetection_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_redeyereduction_key"
+            camera:defaultValue="@string/pref_camera_redeyereduction_default"
+            camera:title="@string/pref_camera_redeyereduction_title"
+            camera:entries="@array/pref_camera_redeyereduction_entries"
+            camera:entryValues="@array/pref_camera_redeyereduction_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_selectablezoneaf_key"
+            camera:defaultValue="@string/pref_camera_selectablezoneaf_default"
+            camera:title="@string/pref_camera_selectablezoneaf_title"
+            camera:entries="@array/pref_camera_selectablezoneaf_entries"
+            camera:entryValues="@array/pref_camera_selectablezoneaf_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_zsl_key"
+            camera:defaultValue="@string/pref_camera_zsl_default"
+            camera:title="@string/pref_camera_zsl_title"
+            camera:entries="@array/pref_camera_zsl_entries"
+            camera:entryValues="@array/pref_camera_zsl_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_videosnapsize_key"
+            camera:title="@string/pref_camera_picturesize_title"
+            camera:defaultValue="@string/pref_camera_videosnapsize_default"
+            camera:entries="@array/pref_camera_picturesize_entries"
+            camera:entryValues="@array/pref_camera_picturesize_entryvalues" />
 </PreferenceGroup>
diff --git a/res/xml/video_preferences.xml b/res/xml/video_preferences.xml
index ce36219..ab876b8 100644
--- a/res/xml/video_preferences.xml
+++ b/res/xml/video_preferences.xml
@@ -19,9 +19,28 @@
         camera:title="@string/pref_camcorder_settings_category">
     <ListPreference
             camera:key="pref_video_quality_key"
+            camera:defaultValue="@string/pref_video_quality_default"
             camera:title="@string/pref_video_quality_title"
             camera:entries="@array/pref_video_quality_entries"
             camera:entryValues="@array/pref_video_quality_entryvalues"/>
+    <ListPreference
+            camera:key="pref_camera_videoencoder_key"
+            camera:defaultValue="@string/pref_camera_videoencoder_default"
+            camera:title="@string/pref_camera_videoencoder_title"
+            camera:entries="@array/pref_camera_videoencoder_entries"
+            camera:entryValues="@array/pref_camera_videoencoder_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_audioencoder_key"
+            camera:defaultValue="@string/pref_camera_audioencoder_default"
+            camera:title="@string/pref_camera_audioencoder_title"
+            camera:entries="@array/pref_camera_audioencoder_entries"
+            camera:entryValues="@array/pref_camera_audioencoder_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_video_duration_key"
+            camera:defaultValue="@string/pref_camera_video_duration_default"
+            camera:title="@string/pref_camera_video_duration_title"
+            camera:entries="@array/pref_camera_video_duration_entries"
+            camera:entryValues="@array/pref_camera_video_duration_entryvalues" />
     <IconListPreference
             camera:key="pref_video_time_lapse_frame_interval_key"
             camera:defaultValue="@string/pref_video_time_lapse_frame_interval_default"
@@ -71,4 +90,40 @@
             camera:largeIcons="@array/camera_recordlocation_largeicons"
             camera:entries="@array/pref_camera_recordlocation_entries"
             camera:entryValues="@array/pref_camera_recordlocation_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_powermode_key"
+            camera:defaultValue="@string/pref_camera_powermode_default"
+            camera:title="@string/pref_camera_powermode_title"
+            camera:entries="@array/pref_camera_powermode_entries"
+            camera:entryValues="@array/pref_camera_powermode_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_dis_key"
+            camera:defaultValue="@string/pref_camera_dis_default"
+            camera:title="@string/pref_camera_dis_title"
+            camera:entries="@array/pref_camera_dis_entries"
+            camera:entryValues="@array/pref_camera_dis_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_coloreffect_key"
+            camera:defaultValue="@string/pref_camera_coloreffect_default"
+            camera:title="@string/pref_camera_coloreffect_title"
+            camera:entries="@array/pref_camera_coloreffect_entries"
+            camera:entryValues="@array/pref_camera_coloreffect_entryvalues" />
+    <ListPreference
+            camera:key="pref_camera_hfr_key"
+            camera:defaultValue="@string/pref_camera_hfr_default"
+            camera:title="@string/pref_camera_hfr_title"
+            camera:entries="@array/pref_camera_hfr_entries"
+            camera:entryValues="@array/pref_camera_hfr_entryvalues"/>
+    <ListPreference
+            camera:key="pref_camera_video_hdr_key"
+            camera:defaultValue="@string/pref_camera_video_hdr_default"
+            camera:title="@string/pref_camera_video_hdr_title"
+            camera:entries="@array/pref_camera_video_hdr_entries"
+            camera:entryValues="@array/pref_camera_video_hdr_entryvalues"/>
+    <ListPreference
+            camera:key="pref_camera_videosnapsize_key"
+            camera:defaultValue="@string/pref_camera_videosnapsize_default"
+            camera:title="@string/pref_camera_picturesize_title"
+            camera:entries="@array/pref_camera_picturesize_entries"
+            camera:entryValues="@array/pref_camera_picturesize_entryvalues" />
 </PreferenceGroup>
diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java
index e26b6a9..5b70897 100644
--- a/src/com/android/camera/AndroidCameraManagerImpl.java
+++ b/src/com/android/camera/AndroidCameraManagerImpl.java
@@ -39,6 +39,8 @@
 import android.os.Message;
 import android.util.Log;
 import android.view.SurfaceHolder;
+import android.hardware.Camera.CameraDataCallback;
+import com.android.camera.util.ApiHelper;
 
 /**
  * A class to implement {@link CameraManager} of the Android camera framework.
@@ -83,6 +85,11 @@
     // Presentation
     private static final int ENABLE_SHUTTER_SOUND =    501;
     private static final int SET_DISPLAY_ORIENTATION = 502;
+    // Histogram
+    private static final int SET_HISTOGRAM_MODE =    601;
+    private static final int SEND_HISTOGRAM_DATA =   602;
+    //LONGSHOT
+    private static final int SET_LONGSHOT = 701;
 
     private CameraHandler mCameraHandler;
     private android.hardware.Camera mCamera;
@@ -317,6 +324,18 @@
                         mParametersIsDirty = true;
                         return;
 
+                    case SET_HISTOGRAM_MODE:
+                        mCamera.setHistogramMode((CameraDataCallback) msg.obj);
+                        break;
+
+                    case SEND_HISTOGRAM_DATA:
+                        mCamera.sendHistogramData();
+                        break;
+
+                    case SET_LONGSHOT:
+                        mCamera.setLongshot((Boolean) msg.obj);
+                        break;
+
                     default:
                         throw new RuntimeException("Invalid CameraProxy message=" + msg.what);
                 }
@@ -546,6 +565,21 @@
             mCameraHandler.obtainMessage(
                     ENABLE_SHUTTER_SOUND, (enable ? 1 : 0), 0).sendToTarget();
         }
+
+        @Override
+        public void setLongshot(boolean enable) {
+            mCameraHandler.obtainMessage(SET_LONGSHOT,
+                    new Boolean(enable)).sendToTarget();
+        }
+
+        @Override
+        public void setHistogramMode(CameraDataCallback cb) {
+            mCameraHandler.obtainMessage(SET_HISTOGRAM_MODE, cb).sendToTarget();
+        }
+        @Override
+        public void sendHistogramData() {
+            mCameraHandler.sendEmptyMessage(SEND_HISTOGRAM_DATA);
+        }
     }
 
     /**
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index e7ccbb1..9e5ddb0 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -175,6 +175,7 @@
     private Menu mActionBarMenu;
     private ViewGroup mUndoDeletionBar;
     private boolean mIsUndoingDeletion = false;
+    private boolean mIsEditActivityInProgress = false;
 
     private Uri[] mNfcPushUris = new Uri[1];
 
@@ -335,6 +336,9 @@
                 @Override
                 public void onDataFullScreenChange(int dataID, boolean full) {
                     boolean isCameraID = isCameraPreview(dataID);
+                    if (full && isCameraID){
+                        updateStorageSpaceAndHint();
+                    }
                     if (!isCameraID) {
                         if (!full) {
                             // Always show action bar in filmstrip mode
@@ -397,6 +401,16 @@
 
                 @Override
                 public void onDataFocusChanged(final int dataID, final boolean focused) {
+                    boolean isPreview = isCameraPreview(dataID);
+                    boolean isFullScreen = mFilmStripView.inFullScreen();
+                    if (isFullScreen && isPreview){
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                updateStorageSpaceAndHint();
+                            }
+                        });
+                    }
                     // Delay hiding action bar if there is any user interaction
                     if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) {
                         mMainHandler.removeMessages(HIDE_ACTION_BAR);
@@ -1211,12 +1225,16 @@
 
         mLocalImagesObserver.setActivityPaused(true);
         mLocalVideosObserver.setActivityPaused(true);
+        if (mFilmStripView.inCameraFullscreen()) {
+            mFilmStripView.getController().clearSurfaceViews();
+        }
     }
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQ_CODE_DONT_SWITCH_TO_PREVIEW) {
             mResetToPreviewOnResume = false;
+            mIsEditActivityInProgress = false;
         } else {
             super.onActivityResult(requestCode, resultCode, data);
         }
@@ -1264,6 +1282,7 @@
         }
         mLocalImagesObserver.setActivityPaused(false);
         mLocalVideosObserver.setActivityPaused(false);
+        updateStorageSpaceAndHint();
     }
 
     @Override
@@ -1327,6 +1346,7 @@
     public void onBackPressed() {
         if (!mFilmStripView.inCameraFullscreen()) {
             mFilmStripView.getController().goToFirstItem();
+            mCurrentModule.resizeForPreviewAspectRatio();
         } else if (!mCurrentModule.onBackPressed()) {
             super.onBackPressed();
         }
@@ -1458,14 +1478,17 @@
      * Launches an ACTION_EDIT intent for the given local data item.
      */
     public void launchEditor(LocalData data) {
-        Intent intent = new Intent(Intent.ACTION_EDIT)
-                .setDataAndType(data.getContentUri(), data.getMimeType())
-                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-        try {
-            startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
-        } catch (ActivityNotFoundException e) {
-            startActivityForResult(Intent.createChooser(intent, null),
-                    REQ_CODE_DONT_SWITCH_TO_PREVIEW);
+        if (!mIsEditActivityInProgress) {
+            Intent intent = new Intent(Intent.ACTION_EDIT)
+                    .setDataAndType(data.getContentUri(), data.getMimeType())
+                    .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            try {
+                startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
+            } catch (ActivityNotFoundException e) {
+                startActivityForResult(Intent.createChooser(intent, null),
+                        REQ_CODE_DONT_SWITCH_TO_PREVIEW);
+            }
+            mIsEditActivityInProgress = true;
         }
     }
 
diff --git a/src/com/android/camera/CameraErrorCallback.java b/src/com/android/camera/CameraErrorCallback.java
index 22f800e..7029ac4 100644
--- a/src/com/android/camera/CameraErrorCallback.java
+++ b/src/com/android/camera/CameraErrorCallback.java
@@ -25,7 +25,8 @@
     @Override
     public void onError(int error, android.hardware.Camera camera) {
         Log.e(TAG, "Got camera error callback. error=" + error);
-        if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
+        if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED
+             || error == android.hardware.Camera.CAMERA_ERROR_UNKNOWN) {
             // We are not sure about the current state of the app (in preview or
             // snapshot or recording). Closing the app is better than creating a
             // new Camera object.
diff --git a/src/com/android/camera/CameraManager.java b/src/com/android/camera/CameraManager.java
index 909e1ca..8ad0d52 100644
--- a/src/com/android/camera/CameraManager.java
+++ b/src/com/android/camera/CameraManager.java
@@ -25,6 +25,7 @@
 import android.os.Build;
 import android.os.Handler;
 import android.view.SurfaceHolder;
+import android.hardware.Camera.CameraDataCallback;
 
 /**
  * An interface which provides possible camera device operations.
@@ -349,5 +350,23 @@
          *                 {@code false} to disable it.
          */
         public void enableShutterSound(boolean enable);
+        /**
+         * Set histogram Mode
+         *
+         * @param cb   cameraDataCallback to use
+         */
+        public void setHistogramMode(CameraDataCallback cb);
+        /**
+         * Send the Histogram Data.
+         *
+        */
+        public void sendHistogramData();
+        /**
+         * Enables/Disables longshot mode.
+         *
+         * @param enable   {@code true} to enable longshot mode,
+         *                 {@code false} to disable it.
+        */
+        public void setLongshot(boolean enable);
     }
 }
diff --git a/src/com/android/camera/CameraModule.java b/src/com/android/camera/CameraModule.java
index 55cae9f..48d7eec 100644
--- a/src/com/android/camera/CameraModule.java
+++ b/src/com/android/camera/CameraModule.java
@@ -66,4 +66,6 @@
     public void onMediaSaveServiceConnected(MediaSaveService s);
 
     public boolean arePreviewControlsVisible();
+
+    public void resizeForPreviewAspectRatio();
 }
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 55867a1..243f1e3 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -16,12 +16,14 @@
 
 package com.android.camera;
 
+import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
+import android.hardware.Camera;
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
@@ -36,6 +38,8 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import android.os.Build;
+import java.util.StringTokenizer;
 
 /**
  *  Provides utilities and keys for Camera settings.
@@ -61,17 +65,79 @@
     public static final String KEY_VIDEO_EFFECT = "pref_video_effect_key";
     public static final String KEY_CAMERA_ID = "pref_camera_id_key";
     public static final String KEY_CAMERA_HDR = "pref_camera_hdr_key";
+    public static final String KEY_CAMERA_HQ = "pref_camera_hq_key";
     public static final String KEY_CAMERA_HDR_PLUS = "pref_camera_hdr_plus_key";
     public static final String KEY_CAMERA_FIRST_USE_HINT_SHOWN = "pref_camera_first_use_hint_shown_key";
     public static final String KEY_VIDEO_FIRST_USE_HINT_SHOWN = "pref_video_first_use_hint_shown_key";
     public static final String KEY_PHOTOSPHERE_PICTURESIZE = "pref_photosphere_picturesize_key";
     public static final String KEY_STARTUP_MODULE_INDEX = "camera.startup_module";
 
+    public static final String KEY_VIDEO_ENCODER = "pref_camera_videoencoder_key";
+    public static final String KEY_AUDIO_ENCODER = "pref_camera_audioencoder_key";
+    public static final String KEY_VIDEO_DURATION = "pref_camera_video_duration_key";
+    public static final String KEY_POWER_MODE = "pref_camera_powermode_key";
+    public static final String KEY_PICTURE_FORMAT = "pref_camera_pictureformat_key";
+    public static final String KEY_ZSL = "pref_camera_zsl_key";
+    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
+    public static final String KEY_FACE_DETECTION = "pref_camera_facedetection_key";
+    public static final String KEY_TOUCH_AF_AEC = "pref_camera_touchafaec_key";
+    public static final String KEY_SELECTABLE_ZONE_AF = "pref_camera_selectablezoneaf_key";
+    public static final String KEY_SATURATION = "pref_camera_saturation_key";
+    public static final String KEY_CONTRAST = "pref_camera_contrast_key";
+    public static final String KEY_SHARPNESS = "pref_camera_sharpness_key";
+    public static final String KEY_AUTOEXPOSURE = "pref_camera_autoexposure_key";
+    public static final String KEY_ANTIBANDING = "pref_camera_antibanding_key";
+    public static final String KEY_ISO = "pref_camera_iso_key";
+    public static final String KEY_LENSSHADING = "pref_camera_lensshading_key";
+    public static final String KEY_HISTOGRAM = "pref_camera_histogram_key";
+    public static final String KEY_DENOISE = "pref_camera_denoise_key";
+    public static final String KEY_REDEYE_REDUCTION = "pref_camera_redeyereduction_key";
+    public static final String KEY_AE_BRACKET_HDR = "pref_camera_ae_bracket_hdr_key";
+
+    public static final String KEY_VIDEO_SNAPSHOT_SIZE = "pref_camera_videosnapsize_key";
+    public static final String KEY_VIDEO_HIGH_FRAME_RATE = "pref_camera_hfr_key";
+    public static final String KEY_VIDEO_HDR = "pref_camera_video_hdr_key";
+    public static final String DEFAULT_VIDEO_QUALITY_VALUE = "custom";
+    public static final String KEY_SKIN_TONE_ENHANCEMENT = "pref_camera_skinToneEnhancement_key";
+    public static final String KEY_SKIN_TONE_ENHANCEMENT_FACTOR = "pref_camera_skinToneEnhancement_factor_key";
+
+    public static final String KEY_FACE_RECOGNITION = "pref_camera_facerc_key";
+    public static final String KEY_DIS = "pref_camera_dis_key";
+
+    private static final String KEY_QC_SUPPORTED_AE_BRACKETING_MODES = "ae-bracket-hdr-values";
+    private static final String KEY_QC_SUPPORTED_FACE_RECOGNITION_MODES = "face-recognition-values";
+    private static final String KEY_QC_SUPPORTED_DIS_MODES = "dis-values";
+    public static final String KEY_QC_AE_BRACKETING = "ae-bracket-hdr";
+    public static final String KEY_QC_FACE_RECOGNITION = "face-recognition";
+    public static final String KEY_QC_DIS_MODE = "dis";
+
+    //for flip
+    public static final String KEY_QC_PREVIEW_FLIP = "preview-flip";
+    public static final String KEY_QC_VIDEO_FLIP = "video-flip";
+    public static final String KEY_QC_SNAPSHOT_PICTURE_FLIP = "snapshot-picture-flip";
+    public static final String KEY_QC_SUPPORTED_FLIP_MODES = "flip-mode-values";
+
+    public static final String FLIP_MODE_OFF = "off";
+    public static final String FLIP_MODE_V = "flip-v";
+    public static final String FLIP_MODE_H = "flip-h";
+    public static final String FLIP_MODE_VH = "flip-vh";
+
+    private static final String KEY_QC_PICTURE_FORMAT = "picture-format-values";
+    private static final String VIDEO_QUALITY_HIGH = "high";
+    private static final String VIDEO_QUALITY_MMS = "mms";
+    private static final String VIDEO_QUALITY_YOUTUBE = "youtube";
+
+
     public static final String EXPOSURE_DEFAULT_VALUE = "0";
 
     public static final int CURRENT_VERSION = 5;
     public static final int CURRENT_LOCAL_VERSION = 2;
 
+    public static final int DEFAULT_VIDEO_DURATION = 0; // no limit
+    private static final int MMS_VIDEO_DURATION = (CamcorderProfile.get(CamcorderProfile.QUALITY_LOW) != null) ?
+          CamcorderProfile.get(CamcorderProfile.QUALITY_LOW).duration :30;
+    private static final int YOUTUBE_VIDEO_DURATION = 15 * 60; // 15 mins
+
     private static final String TAG = "CameraSettings";
 
     private final Context mContext;
@@ -96,10 +162,10 @@
     }
 
     public static String getSupportedHighestVideoQuality(int cameraId,
-            String defaultQuality) {
+            String defaultQuality,Parameters parameters) {
         // When launching the camera app first time, we will set the video quality
         // to the first one (i.e. highest quality) in the supported list
-        List<String> supported = getSupportedVideoQuality(cameraId);
+        List<String> supported = getSupportedVideoQuality(cameraId,parameters);
         if (supported == null) {
             Log.e(TAG, "No supported video quality is found");
             return defaultQuality;
@@ -156,6 +222,162 @@
         return duration;
     }
 
+    public static List<String> getSupportedFaceRecognitionModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_FACE_RECOGNITION_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    public static List<String> getSupportedDISModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_DIS_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    public static List<String> getSupportedAEBracketingModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_AE_BRACKETING_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    // Splits a comma delimited string to an ArrayList of String.
+    // Return null if the passing string is null or the size is 0.
+    private static ArrayList<String> split(String str) {
+        if (str == null) return null;
+
+        // Use StringTokenizer because it is faster than split.
+        StringTokenizer tokenizer = new StringTokenizer(str, ",");
+        ArrayList<String> substrings = new ArrayList<String>();
+        while (tokenizer.hasMoreElements()) {
+            substrings.add(tokenizer.nextToken());
+        }
+        return substrings;
+    }
+    private List<String> getSupportedPictureFormatLists() {
+        String str = mParameters.get(KEY_QC_PICTURE_FORMAT);
+        if (str == null) {
+            str = "jpeg,raw"; // if not set, fall back to default behavior
+        }
+        return split(str);
+    }
+
+   public static List<String> getSupportedFlipMode(Parameters params){
+        String str = params.get(KEY_QC_SUPPORTED_FLIP_MODES);
+        if(str == null)
+            return null;
+
+        return split(str);
+    }
+
+    private void qcomInitPreferences(PreferenceGroup group){
+        //Qcom Preference add here
+        ListPreference powerMode = group.findPreference(KEY_POWER_MODE);
+        ListPreference zsl = group.findPreference(KEY_ZSL);
+        ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT);
+        ListPreference faceDetection = group.findPreference(KEY_FACE_DETECTION);
+        ListPreference touchAfAec = group.findPreference(KEY_TOUCH_AF_AEC);
+        ListPreference selectableZoneAf = group.findPreference(KEY_SELECTABLE_ZONE_AF);
+        ListPreference saturation = group.findPreference(KEY_SATURATION);
+        ListPreference contrast = group.findPreference(KEY_CONTRAST);
+        ListPreference sharpness = group.findPreference(KEY_SHARPNESS);
+        ListPreference autoExposure = group.findPreference(KEY_AUTOEXPOSURE);
+        ListPreference antiBanding = group.findPreference(KEY_ANTIBANDING);
+        ListPreference mIso = group.findPreference(KEY_ISO);
+        ListPreference lensShade = group.findPreference(KEY_LENSSHADING);
+        ListPreference histogram = group.findPreference(KEY_HISTOGRAM);
+        ListPreference denoise = group.findPreference(KEY_DENOISE);
+        ListPreference redeyeReduction = group.findPreference(KEY_REDEYE_REDUCTION);
+        ListPreference aeBracketing = group.findPreference(KEY_AE_BRACKET_HDR);
+        ListPreference faceRC = group.findPreference(KEY_FACE_RECOGNITION);
+        ListPreference jpegQuality = group.findPreference(KEY_JPEG_QUALITY);
+        ListPreference videoSnapSize = group.findPreference(KEY_VIDEO_SNAPSHOT_SIZE);
+        ListPreference videoHdr = group.findPreference(KEY_VIDEO_HDR);
+        ListPreference pictureFormat = group.findPreference(KEY_PICTURE_FORMAT);
+
+        if (touchAfAec != null) {
+            filterUnsupportedOptions(group,
+                    touchAfAec, mParameters.getSupportedTouchAfAec());
+        }
+
+        if (!mParameters.isPowerModeSupported() && powerMode != null) {
+            removePreference(group, powerMode.getKey());
+        }
+
+        if (selectableZoneAf != null) {
+            filterUnsupportedOptions(group,
+                    selectableZoneAf, mParameters.getSupportedSelectableZoneAf());
+        }
+
+        if (mIso != null) {
+            filterUnsupportedOptions(group,
+                    mIso, mParameters.getSupportedIsoValues());
+        }
+
+        if (redeyeReduction != null) {
+            filterUnsupportedOptions(group,
+                    redeyeReduction, mParameters.getSupportedRedeyeReductionModes());
+        }
+
+        if (denoise != null) {
+            filterUnsupportedOptions(group,
+                    denoise, mParameters.getSupportedDenoiseModes());
+        }
+
+        if (videoHdr != null) {
+            filterUnsupportedOptions(group,
+                    videoHdr, mParameters.getSupportedVideoHDRModes());
+        }
+
+        if (colorEffect != null) {
+            filterUnsupportedOptions(group,
+                    colorEffect, mParameters.getSupportedColorEffects());
+        }
+
+        if (aeBracketing != null) {
+            filterUnsupportedOptions(group,
+                     aeBracketing, getSupportedAEBracketingModes(mParameters));
+        }
+
+        if (antiBanding != null) {
+            filterUnsupportedOptions(group,
+                    antiBanding, mParameters.getSupportedAntibanding());
+        }
+
+        if (faceRC != null) {
+            filterUnsupportedOptions(group,
+                    faceRC, getSupportedFaceRecognitionModes(mParameters));
+        }
+
+        if (autoExposure != null) {
+            filterUnsupportedOptions(group,
+                    autoExposure, mParameters.getSupportedAutoexposure());
+        }
+
+        if (!mParameters.isPowerModeSupported()){
+            filterUnsupportedOptions(group,
+                    videoSnapSize, null);
+        } else {
+            filterUnsupportedOptions(group, videoSnapSize, sizeListToStringList(
+                        mParameters.getSupportedPictureSizes()));
+        }
+
+        if (histogram!= null) {
+            filterUnsupportedOptions(group,
+                    histogram, mParameters.getSupportedHistogramModes());
+        }
+
+        if (pictureFormat!= null) {
+            filterUnsupportedOptions(group,
+                    pictureFormat, getSupportedPictureFormatLists());
+        }
+
+    }
     private void initPreference(PreferenceGroup group) {
         ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
         ListPreference timeLapseInterval = group.findPreference(KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL);
@@ -172,12 +394,14 @@
                 group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
         ListPreference videoEffect = group.findPreference(KEY_VIDEO_EFFECT);
         ListPreference cameraHdr = group.findPreference(KEY_CAMERA_HDR);
+        ListPreference disMode = group.findPreference(KEY_DIS);
         ListPreference cameraHdrPlus = group.findPreference(KEY_CAMERA_HDR_PLUS);
 
         // Since the screen could be loaded from different resources, we need
         // to check if the preference is available here
         if (videoQuality != null) {
-            filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality(mCameraId));
+            filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality(
+                   mCameraId,mParameters));
         }
 
         if (pictureSize != null) {
@@ -197,13 +421,14 @@
             filterUnsupportedOptions(group,
                     flashMode, mParameters.getSupportedFlashModes());
         }
+        if (disMode != null) {
+            filterUnsupportedOptions(group,
+                    disMode, getSupportedDISModes(mParameters));
+        }
         if (focusMode != null) {
             if (!CameraUtil.isFocusAreaSupported(mParameters)) {
                 filterUnsupportedOptions(group,
                         focusMode, mParameters.getSupportedFocusModes());
-            } else {
-                // Remove the focus mode if we can use tap-to-focus.
-                removePreference(group, focusMode.getKey());
             }
         }
         if (videoFlashMode != null) {
@@ -223,13 +448,13 @@
                 || !CameraUtil.isCameraHdrSupported(mParameters))) {
             removePreference(group, cameraHdr.getKey());
         }
-
         int frontCameraId = CameraHolder.instance().getFrontCameraId();
         boolean isFrontCamera = (frontCameraId == mCameraId);
         if (cameraHdrPlus != null && (!ApiHelper.HAS_CAMERA_HDR_PLUS ||
                 !GcamHelper.hasGcamCapture() || isFrontCamera)) {
             removePreference(group, cameraHdrPlus.getKey());
         }
+        qcomInitPreferences(group);
     }
 
     private void buildExposureCompensation(
@@ -484,19 +709,104 @@
         initialCameraPictureSize(context, parameters);
         writePreferredCameraId(preferences, currentCameraId);
     }
+    private static boolean checkSupportedVideoQuality(Parameters parameters,int width, int height){
+        List <Size> supported = parameters.getSupportedVideoSizes();
+        int flag = 0;
+        for (Size size : supported){
+            //since we are having two profiles with same height, we are checking with height
+            if (size.height == 480) {
+                if (size.height == height && size.width == width) {
+                    flag = 1;
+                    break;
+                }
+            } else {
+                if (size.width == width) {
+                    flag = 1;
+                    break;
+                }
+            }
+        }
+        if (flag == 1)
+            return true;
 
-    private static ArrayList<String> getSupportedVideoQuality(int cameraId) {
+        return false;
+    }
+    private static ArrayList<String> getSupportedVideoQuality(int cameraId,Parameters parameters) {
         ArrayList<String> supported = new ArrayList<String>();
         // Check for supported quality
+        if (ApiHelper.HAS_FINE_RESOLUTION_QUALITY_LEVELS) {
+        getFineResolutionQuality(supported,cameraId,parameters);
+        } else {
+            supported.add(Integer.toString(CamcorderProfile.QUALITY_HIGH));
+            CamcorderProfile high = CamcorderProfile.get(
+                    cameraId, CamcorderProfile.QUALITY_HIGH);
+            CamcorderProfile low = CamcorderProfile.get(
+                    cameraId, CamcorderProfile.QUALITY_LOW);
+            if (high.videoFrameHeight * high.videoFrameWidth >
+                    low.videoFrameHeight * low.videoFrameWidth) {
+                supported.add(Integer.toString(CamcorderProfile.QUALITY_LOW));
+            }
+        }
+
+        return supported;
+    }
+
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
+    private static void getFineResolutionQuality(ArrayList<String> supported,
+                                                 int cameraId,Parameters parameters) {
         if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_1080P)) {
-            supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P));
+           if (checkSupportedVideoQuality(parameters,1920,1080)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P));
+           }
         }
         if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_720P)) {
-            supported.add(Integer.toString(CamcorderProfile.QUALITY_720P));
+           if (checkSupportedVideoQuality(parameters,1280,720)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_720P));
+           }
         }
         if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_480P)) {
-            supported.add(Integer.toString(CamcorderProfile.QUALITY_480P));
+           if (checkSupportedVideoQuality(parameters,720,480)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_480P));
+           }
         }
-        return supported;
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_FWVGA)) {
+           if (checkSupportedVideoQuality(parameters,864,480)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_FWVGA));
+           }
+        }
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_WVGA)) {
+           if (checkSupportedVideoQuality(parameters,800,480)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_WVGA));
+           }
+        }
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_VGA)) {
+           if (checkSupportedVideoQuality(parameters,640,480)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_VGA));
+           }
+        }
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_CIF)) {
+           if (checkSupportedVideoQuality(parameters,352,288)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_CIF));
+           }
+        }
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_QVGA)) {
+           if (checkSupportedVideoQuality(parameters,320,240)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_QVGA));
+           }
+        }
+        if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_QCIF)) {
+           if (checkSupportedVideoQuality(parameters,176,144)){
+              supported.add(Integer.toString(CamcorderProfile.QUALITY_QCIF));
+           }
+        }
+
+    }
+    public static int getVideoDurationInMillis(String quality) {
+        if (VIDEO_QUALITY_MMS.equals(quality)) {
+            return MMS_VIDEO_DURATION * 1000;
+        } else if (VIDEO_QUALITY_YOUTUBE.equals(quality)) {
+            return YOUTUBE_VIDEO_DURATION * 1000;
+        }
+        return DEFAULT_VIDEO_DURATION * 1000;
     }
 }
diff --git a/src/com/android/camera/CountDownTimerPreference.java b/src/com/android/camera/CountDownTimerPreference.java
index 9a7e44b..14819fa 100644
--- a/src/com/android/camera/CountDownTimerPreference.java
+++ b/src/com/android/camera/CountDownTimerPreference.java
@@ -39,7 +39,8 @@
                 entries[0] = context.getString(R.string.setting_off); // Off
             } else {
                 entries[i] = context.getResources()
-                        .getQuantityString(R.plurals.pref_camera_timer_entry, i, i);
+                        .getQuantityString(R.plurals.pref_camera_timer_entry, i,
+                        DURATIONS[i]);
             }
         }
         setEntries(entries);
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java
index f382a2a..9558944 100644
--- a/src/com/android/camera/FocusOverlayManager.java
+++ b/src/com/android/camera/FocusOverlayManager.java
@@ -63,12 +63,12 @@
     private static final int RESET_TOUCH_FOCUS_DELAY = 3000;
 
     private int mState = STATE_IDLE;
-    private static final int STATE_IDLE = 0; // Focus is not active.
-    private static final int STATE_FOCUSING = 1; // Focus is in progress.
+    public static final int STATE_IDLE = 0; // Focus is not active.
+    public static final int STATE_FOCUSING = 1; // Focus is in progress.
     // Focus is in progress and the camera should take a picture after focus finishes.
-    private static final int STATE_FOCUSING_SNAP_ON_FINISH = 2;
-    private static final int STATE_SUCCESS = 3; // Focus finishes and succeeds.
-    private static final int STATE_FAIL = 4; // Focus finishes and fails.
+    public static final int STATE_FOCUSING_SNAP_ON_FINISH = 2;
+    public static final int STATE_SUCCESS = 3; // Focus finishes and succeeds.
+    public static final int STATE_FAIL = 4; // Focus finishes and fails.
 
     private boolean mInitialized;
     private boolean mFocusAreaSupported;
@@ -90,6 +90,7 @@
     Listener mListener;
     private boolean mPreviousMoving;
     private boolean mFocusDefault;
+    private boolean mZslEnabled = false;  //QCom Parameter to disable focus for ZSL
 
     private FocusUI mUI;
     private final Rect mPreviewRect = new Rect(0, 0, 0, 0);
@@ -201,7 +202,7 @@
     }
 
     private void lockAeAwbIfNeeded() {
-        if (mLockAeAwbNeeded && !mAeAwbLock) {
+        if (mLockAeAwbNeeded && !mAeAwbLock && !mZslEnabled) {
             mAeAwbLock = true;
             mListener.setFocusParameters();
         }
@@ -520,6 +521,10 @@
         // Put focus indicator to the center. clear reset position
         mUI.clearFocus();
         // Initialize mFocusArea.
+        mFocusArea = null;
+        // Initialize mMeteringArea.
+        mMeteringArea = null;
+
         if (mFocusAreaSupported) {
             initializeFocusAreas(mPreviewRect.centerX(), mPreviewRect.centerY());
         }
@@ -556,6 +561,10 @@
         return mState == STATE_SUCCESS || mState == STATE_FAIL;
     }
 
+    public int getCurrentFocusState() {
+        return mState;
+    }
+
     public boolean isFocusingSnapOnFinish() {
         return mState == STATE_FOCUSING_SNAP_ON_FINISH;
     }
@@ -582,4 +591,12 @@
                 || focusMode.equals(Parameters.FOCUS_MODE_FIXED)
                 || focusMode.equals(Parameters.FOCUS_MODE_EDOF));
     }
+
+    public void setZslEnable(boolean value) {
+        mZslEnabled = value;
+    }
+
+    public boolean isZslEnabled() {
+        return mZslEnabled;
+    }
 }
diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java
index 909b32c..2a33fb0 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -128,7 +128,9 @@
     }
 
     public void setValue(String value) {
-        if (findIndexOfValue(value) < 0) throw new IllegalArgumentException();
+        if (findIndexOfValue(value) < 0) {
+            value = findSupportedDefaultValue();
+        }
         mValue = value;
         persistStringValue(value);
     }
diff --git a/src/com/android/camera/MediaSaveService.java b/src/com/android/camera/MediaSaveService.java
index e8ec08d..7761f7f 100644
--- a/src/com/android/camera/MediaSaveService.java
+++ b/src/com/android/camera/MediaSaveService.java
@@ -28,7 +28,7 @@
 import android.os.IBinder;
 import android.provider.MediaStore.Video;
 import android.util.Log;
-
+import com.android.camera.PhotoModule;
 import com.android.camera.exif.ExifInterface;
 
 import java.io.File;
@@ -87,14 +87,14 @@
 
     public void addImage(final byte[] data, String title, long date, Location loc,
             int width, int height, int orientation, ExifInterface exif,
-            OnMediaSavedListener l, ContentResolver resolver) {
+            OnMediaSavedListener l, ContentResolver resolver, String pictureFormat) {
         if (isQueueFull()) {
             Log.e(TAG, "Cannot add image when the queue is full");
             return;
         }
         ImageSaveTask t = new ImageSaveTask(data, title, date,
                 (loc == null) ? null : new Location(loc),
-                width, height, orientation, exif, resolver, l);
+                width, height, orientation, exif, resolver, l, pictureFormat);
 
         mMemoryUse += data.length;
         if (isQueueFull()) {
@@ -108,13 +108,14 @@
                          OnMediaSavedListener l, ContentResolver resolver) {
         // When dimensions are unknown, pass 0 as width and height,
         // and decode image for width and height later in a background thread
-        addImage(data, title, date, loc, 0, 0, orientation, exif, l, resolver);
+        addImage(data, title, date, loc, 0, 0, orientation, exif, l, resolver,
+                 PhotoModule.PIXEL_FORMAT_JPEG);
     }
     public void addImage(final byte[] data, String title, Location loc,
             int width, int height, int orientation, ExifInterface exif,
             OnMediaSavedListener l, ContentResolver resolver) {
         addImage(data, title, System.currentTimeMillis(), loc, width, height,
-                orientation, exif, l, resolver);
+                orientation, exif, l, resolver,PhotoModule.PIXEL_FORMAT_JPEG);
     }
 
     public void addVideo(String path, long duration, ContentValues values,
@@ -148,10 +149,11 @@
         private ExifInterface exif;
         private ContentResolver resolver;
         private OnMediaSavedListener listener;
+        private String pictureFormat;
 
         public ImageSaveTask(byte[] data, String title, long date, Location loc,
                              int width, int height, int orientation, ExifInterface exif,
-                             ContentResolver resolver, OnMediaSavedListener listener) {
+                             ContentResolver resolver, OnMediaSavedListener listener, String pictureFormat) {
             this.data = data;
             this.title = title;
             this.date = date;
@@ -162,6 +164,7 @@
             this.exif = exif;
             this.resolver = resolver;
             this.listener = listener;
+            this.pictureFormat = pictureFormat;
         }
 
         @Override
@@ -180,7 +183,7 @@
                 height = options.outHeight;
             }
             return Storage.addImage(
-                    resolver, title, date, loc, orientation, exif, data, width, height);
+                    resolver, title, date, loc, orientation, exif, data, width, height, pictureFormat);
         }
 
         @Override
diff --git a/src/com/android/camera/PhotoController.java b/src/com/android/camera/PhotoController.java
index 833c825..c1c3a85 100644
--- a/src/com/android/camera/PhotoController.java
+++ b/src/com/android/camera/PhotoController.java
@@ -31,6 +31,8 @@
     public static final int SNAPSHOT_IN_PROGRESS = 3;
     // Switching between cameras.
     public static final int SWITCHING_CAMERA = 4;
+    // Longshot mode
+    public static final int LONGSHOT = 5;
 
     // returns the actual set zoom value
     public int onZoomChanged(int requestedZoom);
@@ -55,6 +57,8 @@
 
     public void onCountDownFinished();
 
+    public void onScreenSizeChanged(int width, int height);
+
     public void onPreviewRectChanged(Rect previewRect);
 
     public void updateCameraOrientation();
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 08ce337..0f4d3b7 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -24,21 +24,39 @@
 import com.android.camera.ui.AbstractSettingPopup;
 import com.android.camera.ui.CountdownTimerPopup;
 import com.android.camera.ui.ListPrefSettingPopup;
+import com.android.camera.ui.MoreSettingPopup;
 import com.android.camera.ui.PieItem;
 import com.android.camera.ui.PieItem.OnClickListener;
 import com.android.camera.ui.PieRenderer;
 import com.android.camera2.R;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.util.Log;
+
+import java.util.Locale;
 
 public class PhotoMenu extends PieController
-        implements CountdownTimerPopup.Listener,
+        implements MoreSettingPopup.Listener,
+         CountdownTimerPopup.Listener,
         ListPrefSettingPopup.Listener {
     private static String TAG = "PhotoMenu";
 
     private final String mSettingOff;
 
+    private String[] mOtherKeys1;
+    private String[] mOtherKeys2;
+    private String[] mOtherKeys3;
+    private MoreSettingPopup mPopup1;
+    private MoreSettingPopup mPopup2;
+    private MoreSettingPopup mPopup3;
+    private static final int POPUP_NONE = 0;
+    private static final int POPUP_FIRST_LEVEL = 1;
+    private static final int POPUP_SECOND_LEVEL = 2;
     private PhotoUI mUI;
+    private int mPopupStatus;
     private AbstractSettingPopup mPopup;
     private CameraActivity mActivity;
+    private int popupNum = 0;
 
     public PhotoMenu(CameraActivity activity, PhotoUI ui, PieRenderer pie) {
         super(activity, pie);
@@ -50,7 +68,12 @@
     public void initialize(PreferenceGroup group) {
         super.initialize(group);
         mPopup = null;
+        mPopup1 = null;
+        mPopup2 = null;
+        mPopup3 = null;
+        mPopupStatus = POPUP_NONE;
         PieItem item = null;
+        popupNum = 0;
         final Resources res = mActivity.getResources();
         Locale locale = res.getConfiguration().locale;
         // The order is from left to right in the menu.
@@ -66,23 +89,88 @@
             item = makeSwitchItem(CameraSettings.KEY_CAMERA_HDR, true);
             mRenderer.addItem(item);
         }
-        // Exposure compensation.
-        if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) {
-            item = makeItem(CameraSettings.KEY_EXPOSURE);
-            item.setLabel(res.getString(R.string.pref_exposure_label));
-            mRenderer.addItem(item);
-        }
-        // More settings.
-        PieItem more = makeItem(R.drawable.ic_settings_holo_light);
-        more.setLabel(res.getString(R.string.camera_menu_more_label));
-        mRenderer.addItem(more);
 
-        // Flash.
-        if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) {
-            item = makeItem(CameraSettings.KEY_FLASH_MODE);
-            item.setLabel(res.getString(R.string.pref_camera_flashmode_label));
-            mRenderer.addItem(item);
-        }
+        mOtherKeys1 = new String[] {
+                CameraSettings.KEY_SCENE_MODE,
+                CameraSettings.KEY_RECORD_LOCATION,
+                CameraSettings.KEY_PICTURE_SIZE,
+                CameraSettings.KEY_HISTOGRAM,
+                CameraSettings.KEY_FOCUS_MODE,
+                CameraSettings.KEY_PICTURE_FORMAT,
+                CameraSettings.KEY_JPEG_QUALITY,
+                CameraSettings.KEY_ZSL,
+                CameraSettings.KEY_TIMER,
+                CameraSettings.KEY_TIMER_SOUND_EFFECTS
+        };
+
+        mOtherKeys2 = new String[] {
+                CameraSettings.KEY_COLOR_EFFECT,
+                CameraSettings.KEY_FACE_DETECTION,
+                CameraSettings.KEY_FACE_RECOGNITION,
+                CameraSettings.KEY_TOUCH_AF_AEC,
+                CameraSettings.KEY_SELECTABLE_ZONE_AF,
+                CameraSettings.KEY_SATURATION,
+                CameraSettings.KEY_CONTRAST,
+                CameraSettings.KEY_SHARPNESS,
+                CameraSettings.KEY_AUTOEXPOSURE
+        };
+
+        mOtherKeys3 = new String[] {
+                CameraSettings.KEY_ANTIBANDING,
+                CameraSettings.KEY_ISO,
+                CameraSettings.KEY_DENOISE,
+                CameraSettings.KEY_EXPOSURE,
+                CameraSettings.KEY_WHITE_BALANCE,
+                CameraSettings.KEY_FLASH_MODE,
+                CameraSettings.KEY_REDEYE_REDUCTION,
+                CameraSettings.KEY_AE_BRACKET_HDR
+        };
+
+        PieItem item1 = makeItem(R.drawable.ic_settings_holo_light);
+        item1.setLabel(mActivity.getResources().getString(R.string.camera_menu_more_label));
+        item1.setOnClickListener(new OnClickListener() {
+             @Override
+            public void onClick(PieItem item) {
+                if (mPopup1 == null || mPopupStatus != POPUP_FIRST_LEVEL){
+                    initializePopup();
+                mPopupStatus = POPUP_FIRST_LEVEL;
+                }
+                mUI.showPopup(mPopup1);
+                popupNum = 1;
+            }
+        });
+        mRenderer.addItem(item1);
+
+        PieItem item2 = makeItem(R.drawable.ic_settings_holo_light);
+        item2.setLabel(mActivity.getResources().getString(R.string.camera_menu_more_label));
+        item2.setOnClickListener(new OnClickListener() {
+             @Override
+            public void onClick(PieItem item) {
+                if (mPopup2 == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+                    initializePopup();
+                    mPopupStatus = POPUP_FIRST_LEVEL;
+                }
+                mUI.showPopup(mPopup2);
+                popupNum = 2;
+            }
+        });
+        mRenderer.addItem(item2);
+
+        PieItem item3= makeItem(R.drawable.ic_settings_holo_light);
+        item3.setLabel(mActivity.getResources().getString(R.string.camera_menu_more_label));
+        item3.setOnClickListener(new OnClickListener() {
+             @Override
+            public void onClick(PieItem item) {
+                if (mPopup3 == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+                    initializePopup();
+                    mPopupStatus = POPUP_FIRST_LEVEL;
+                }
+                mUI.showPopup(mPopup3);
+                popupNum = 3;
+            }
+        });
+        mRenderer.addItem(item3);
+
         // Camera switcher.
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeSwitchItem(CameraSettings.KEY_CAMERA_ID, false);
@@ -105,79 +193,104 @@
             });
             mRenderer.addItem(item);
         }
-        // Location.
-        if (group.findPreference(CameraSettings.KEY_RECORD_LOCATION) != null) {
-            item = makeSwitchItem(CameraSettings.KEY_RECORD_LOCATION, true);
-            more.addItem(item);
-            if (mActivity.isSecureCamera()) {
-                // Prevent location preference from getting changed in secure camera mode
-                item.setEnabled(false);
-            }
-        }
-        // Countdown timer.
-        final ListPreference ctpref = group.findPreference(CameraSettings.KEY_TIMER);
-        final ListPreference beeppref = group.findPreference(CameraSettings.KEY_TIMER_SOUND_EFFECTS);
-        item = makeItem(R.drawable.ic_timer);
-        item.setLabel(res.getString(R.string.pref_camera_timer_title).toUpperCase(locale));
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(PieItem item) {
-                CountdownTimerPopup timerPopup = (CountdownTimerPopup) mActivity.getLayoutInflater().inflate(
-                        R.layout.countdown_setting_popup, null, false);
-                timerPopup.initialize(ctpref, beeppref);
-                timerPopup.setSettingChangedListener(PhotoMenu.this);
-                mUI.dismissPopup();
-                mPopup = timerPopup;
-                mUI.showPopup(mPopup);
-            }
-        });
-        more.addItem(item);
-        // Image size.
-        item = makeItem(R.drawable.ic_imagesize);
-        final ListPreference sizePref = group.findPreference(CameraSettings.KEY_PICTURE_SIZE);
-        item.setLabel(res.getString(R.string.pref_camera_picturesize_title).toUpperCase(locale));
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(PieItem item) {
-                ListPrefSettingPopup popup = (ListPrefSettingPopup) mActivity.getLayoutInflater().inflate(
-                        R.layout.list_pref_setting_popup, null, false);
-                popup.initialize(sizePref);
-                popup.setSettingChangedListener(PhotoMenu.this);
-                mUI.dismissPopup();
-                mPopup = popup;
-                mUI.showPopup(mPopup);
-            }
-        });
-        more.addItem(item);
-        // White balance.
-        if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
-            item = makeItem(CameraSettings.KEY_WHITE_BALANCE);
-            item.setLabel(res.getString(R.string.pref_camera_whitebalance_label));
-            more.addItem(item);
-        }
-        // Scene mode.
-        if (group.findPreference(CameraSettings.KEY_SCENE_MODE) != null) {
-            IconListPreference pref = (IconListPreference) group.findPreference(
-                    CameraSettings.KEY_SCENE_MODE);
-            pref.setUseSingleIcon(true);
-            item = makeItem(CameraSettings.KEY_SCENE_MODE);
-            more.addItem(item);
-        }
     }
 
     @Override
     // Hit when an item in a popup gets selected
     public void onListPrefChanged(ListPreference pref) {
-        if (mPopup != null) {
-            mUI.dismissPopup();
+        if (mPopup != null && mPopup1 != null && mPopup2 != null && mPopup3 != null) {
+               mUI.dismissPopup();
         }
         onSettingChanged(pref);
     }
 
+   @Override
+    public void overrideSettings(final String ... keyvalues) {
+        super.overrideSettings(keyvalues);
+       if ((mPopup1 == null) &&  (mPopup2 == null)  &&  (mPopup3 == null)) initializePopup();
+        mPopup1.overrideSettings(keyvalues);
+        mPopup2.overrideSettings(keyvalues);
+        mPopup3.overrideSettings(keyvalues);
+    }
+
+    protected void initializePopup() {
+     LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+             Context.LAYOUT_INFLATER_SERVICE);
+     MoreSettingPopup popup1 = (MoreSettingPopup) inflater.inflate(
+             R.layout.more_setting_popup, null, false);
+     popup1.setSettingChangedListener(this);
+     popup1.initialize(mPreferenceGroup, mOtherKeys1);
+     if (mActivity.isSecureCamera()) {
+         // Prevent location preference from getting changed in secure camera mode
+       popup1.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION,false);
+     }
+     mPopup1 = popup1;
+
+     MoreSettingPopup popup2 = (MoreSettingPopup) inflater.inflate(
+             R.layout.more_setting_popup, null, false);
+     popup2.setSettingChangedListener(this);
+     popup2.initialize(mPreferenceGroup, mOtherKeys2);
+     mPopup2 = popup2;
+
+     MoreSettingPopup popup3 = (MoreSettingPopup) inflater.inflate(
+             R.layout.more_setting_popup, null, false);
+     popup3.setSettingChangedListener(this);
+     popup3.initialize(mPreferenceGroup, mOtherKeys3);
+     mPopup3 = popup3;
+
+     ListPreference pref = mPreferenceGroup.findPreference(
+             CameraSettings.KEY_SCENE_MODE);
+     String sceneMode = (pref != null) ? pref.getValue() : null;
+     pref = mPreferenceGroup.findPreference(CameraSettings.KEY_FACE_DETECTION);
+     String faceDetection = (pref != null) ? pref.getValue() : null;
+     if ((sceneMode != null) && !Parameters.SCENE_MODE_AUTO.equals(sceneMode)){
+         popup1.setPreferenceEnabled(CameraSettings.KEY_FOCUS_MODE,false);
+         popup2.setPreferenceEnabled(CameraSettings.KEY_AUTOEXPOSURE,false);
+         popup2.setPreferenceEnabled(CameraSettings.KEY_TOUCH_AF_AEC,false);
+         popup3.setPreferenceEnabled(CameraSettings.KEY_FLASH_MODE,false);
+         popup3.setPreferenceEnabled(CameraSettings.KEY_WHITE_BALANCE,false);
+         popup3.setPreferenceEnabled(CameraSettings.KEY_EXPOSURE,false);
+     }
+     if ((faceDetection != null) && !Parameters.FACE_DETECTION_ON.equals(faceDetection)){
+         popup2.setPreferenceEnabled(CameraSettings.KEY_FACE_RECOGNITION,false);
+     }
+     }
+
     public void popupDismissed() {
-        if (mPopup != null) {
-            mPopup = null;
+        if (mPopupStatus == POPUP_SECOND_LEVEL) {
+            initializePopup();
+            mPopupStatus = POPUP_FIRST_LEVEL;
+                if (popupNum == 1)
+                    mUI.showPopup(mPopup1);
+                else if (popupNum == 2)
+                    mUI.showPopup(mPopup2);
+                else if (popupNum == 3)
+                    mUI.showPopup(mPopup3);
+                if(mPopup1 != null) mPopup1 = null;
+                if(mPopup2 != null) mPopup2 = null;
+                if(mPopup3 != null) mPopup3 = null;
+        } else {
+            initializePopup();
         }
+
+    }
+
+        @Override
+    // Hit when an item in the first-level popup gets selected, then bring up
+    // the second-level popup
+    public void onPreferenceClicked(ListPreference pref) {
+        if (mPopupStatus != POPUP_FIRST_LEVEL) return;
+
+        LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+                Context.LAYOUT_INFLATER_SERVICE);
+        ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
+                R.layout.list_pref_setting_popup, null, false);
+        basic.initialize(pref);
+        basic.setSettingChangedListener(this);
+        mUI.dismissPopup();
+        mPopup = basic;
+        mUI.showPopup(mPopup);
+        mPopupStatus = POPUP_SECOND_LEVEL;
     }
 
     // Return true if the preference has the specified key but not the value.
@@ -199,9 +312,14 @@
         // set to non-auto.
         if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) {
             setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO);
+            setPreference(CameraSettings.KEY_ZSL,mSettingOff);
         } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) {
             setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff);
         }
+        if (notSame(pref,CameraSettings.KEY_ZSL,mSettingOff)){
+            setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff);
+        }
         super.onSettingChanged(pref);
     }
+
 }
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 9b1853a..4444e4d 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -50,6 +50,12 @@
 import android.view.OrientationEventListener;
 import android.view.View;
 import android.view.WindowManager;
+import android.widget.Toast;
+import android.widget.ProgressBar;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import com.android.camera.CameraManager.CameraAFCallback;
 import com.android.camera.CameraManager.CameraAFMoveCallback;
@@ -76,6 +82,14 @@
 import java.io.OutputStream;
 import java.util.List;
 import java.util.Vector;
+import java.util.HashMap;
+import android.util.AttributeSet;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.os.SystemProperties;
+import java.util.Collections;
+import java.util.Formatter;
 
 public class PhotoModule
         implements CameraModule,
@@ -89,6 +103,20 @@
 
     private static final String TAG = "CAM_PhotoModule";
 
+   //QCom data members
+    public static boolean mBrightnessVisible = true;
+    private static final int MAX_SHARPNESS_LEVEL = 6;
+    private boolean mRestartPreview = false;
+    private int mSnapshotMode;
+    private int mBurstSnapNum = 1;
+    private int mReceivedSnapNum = 0;
+    public boolean mFaceDetectionEnabled = false;
+
+   /*Histogram variables*/
+    private GraphView mGraphView;
+    private static final int STATS_DATA = 257;
+    public static int statsdata[] = new int[STATS_DATA];
+    public boolean mHiston = false;
     // We number the request code from 1000 to avoid collision with Gallery.
     private static final int REQUEST_CROP = 1000;
 
@@ -102,7 +130,10 @@
     private static final int CAMERA_OPEN_DONE = 8;
     private static final int OPEN_CAMERA_FAIL = 9;
     private static final int CAMERA_DISABLED = 10;
-    private static final int SWITCH_TO_GCAM_MODULE = 11;
+    private static final int SET_SKIN_TONE_FACTOR = 11;
+    private static final int SET_PHOTO_UI_PARAMS = 12;
+    private static final int SWITCH_TO_GCAM_MODULE = 13;
+    private static final int CONFIGURE_SKIN_TONE_FACTOR = 14;
 
     // The subset of parameters we need to update in setCameraParameters().
     private static final int UPDATE_PARAM_INITIALIZE = 1;
@@ -122,6 +153,7 @@
     private int mCameraId;
     private Parameters mParameters;
     private boolean mPaused;
+    private View mRootView;
 
     private PhotoUI mUI;
 
@@ -146,6 +178,8 @@
     private boolean mAeLockSupported;
     private boolean mAwbLockSupported;
     private boolean mContinuousFocusSupported;
+    private boolean mTouchAfAecFlag;
+    private boolean mLongshotSave = false;
 
     // The degrees of the device rotated clockwise from its natural orientation.
     private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
@@ -156,6 +190,30 @@
     private ContentProviderClient mMediaProviderClient;
     private boolean mFaceDetectionStarted = false;
 
+    private static final String PERSIST_LONG_ENABLE = "persist.camera.longshot.enable";
+    private static final String PERSIST_LONG_SAVE = "persist.camera.longshot.save";
+
+    private static final int MINIMUM_BRIGHTNESS = 0;
+    private static final int MAXIMUM_BRIGHTNESS = 6;
+    private int mbrightness = 3;
+    private int mbrightness_step = 1;
+    private ProgressBar brightnessProgressBar;
+    // Constant from android.hardware.Camera.Parameters
+    private static final String KEY_PICTURE_FORMAT = "picture-format";
+    private static final String KEY_QC_RAW_PICUTRE_SIZE = "raw-size";
+    public static final String PIXEL_FORMAT_JPEG = "jpeg";
+
+    private static final int MIN_SCE_FACTOR = -10;
+    private static final int MAX_SCE_FACTOR = +10;
+    private int SCE_FACTOR_STEP = 10;
+    private int mskinToneValue = 0;
+    private boolean mSkinToneSeekBar= false;
+    private boolean mSeekBarInitialized = false;
+    private SeekBar skinToneSeekBar;
+    private TextView LeftValue;
+    private TextView RightValue;
+    private TextView Title;
+
     // mCropValue and mSaveUri are used only if isImageCaptureIntent() is true.
     private String mCropValue;
     private Uri mSaveUri;
@@ -215,6 +273,7 @@
                     : null;
 
     private final CameraErrorCallback mErrorCallback = new CameraErrorCallback();
+    private final StatsCallback mStatsCallback = new StatsCallback();
 
     private long mFocusStartTime;
     private long mShutterCallbackTime;
@@ -236,6 +295,7 @@
     private FocusOverlayManager mFocusManager;
 
     private String mSceneMode;
+    private String mCurrTouchAfAec = Parameters.TOUCH_AF_AEC_ON;
 
     private final Handler mHandler = new MainHandler();
 
@@ -347,10 +407,45 @@
                             R.string.camera_disabled);
                     break;
                 }
+               case SET_SKIN_TONE_FACTOR: {
+                    Log.v(TAG, "set tone bar: mSceneMode = " + mSceneMode);
+                    setSkinToneFactor();
+                    mSeekBarInitialized = true;
+                    // skin tone ie enabled only for party and portrait BSM
+                    // when color effects are not enabled
+                    String colorEffect = mPreferences.getString(
+                        CameraSettings.KEY_COLOR_EFFECT,
+                        mActivity.getString(R.string.pref_camera_coloreffect_default));
+                    if((Parameters.SCENE_MODE_PARTY.equals(mSceneMode) ||
+                        Parameters.SCENE_MODE_PORTRAIT.equals(mSceneMode))&&
+                        (Parameters.EFFECT_NONE.equals(colorEffect))) {
+                        ;
+                    }
+                    else{
+                        Log.v(TAG, "Skin tone bar: disable");
+                        disableSkinToneSeekBar();
+                    }
+                    break;
+               }
+               case SET_PHOTO_UI_PARAMS: {
+                    setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
+                    mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup,
+                        mPreferences);
+                    break;
+               }
 
                 case SWITCH_TO_GCAM_MODULE: {
                     mActivity.onModuleSelected(ModuleSwitcher.GCAM_MODULE_INDEX);
                 }
+
+                case CONFIGURE_SKIN_TONE_FACTOR: {
+                     if (isCameraIdle()) {
+                         mParameters = mCameraDevice.getParameters();
+                         mParameters.set("skinToneEnhancement", String.valueOf(msg.arg1));
+                         mCameraDevice.setParameters(mParameters);
+                    }
+                    break;
+                }
             }
         }
     }
@@ -359,6 +454,7 @@
     @Override
     public void init(CameraActivity activity, View parent) {
         mActivity = activity;
+        mRootView = parent;
         mUI = new PhotoUI(activity, this, parent);
         mPreferences = new ComboPreferences(mActivity);
         CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal());
@@ -379,6 +475,21 @@
         mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false);
         mLocationManager = new LocationManager(mActivity, mUI);
         mSensorManager = (SensorManager)(mActivity.getSystemService(Context.SENSOR_SERVICE));
+
+        brightnessProgressBar = (ProgressBar)mRootView.findViewById(R.id.progress);
+        if (brightnessProgressBar instanceof SeekBar) {
+            SeekBar seeker = (SeekBar) brightnessProgressBar;
+            seeker.setOnSeekBarChangeListener(mSeekListener);
+        }
+        brightnessProgressBar.setMax(MAXIMUM_BRIGHTNESS);
+        brightnessProgressBar.setProgress(mbrightness);
+        skinToneSeekBar = (SeekBar) mRootView.findViewById(R.id.skintoneseek);
+        skinToneSeekBar.setOnSeekBarChangeListener(mskinToneSeekListener);
+        skinToneSeekBar.setVisibility(View.INVISIBLE);
+        Title = (TextView)mRootView.findViewById(R.id.skintonetitle);
+        RightValue = (TextView)mRootView.findViewById(R.id.skintoneright);
+        LeftValue = (TextView)mRootView.findViewById(R.id.skintoneleft);
+
     }
 
     private void initializeControlByIntent() {
@@ -447,6 +558,7 @@
         int height = root.getHeight();
         mFocusManager.setPreviewSize(width, height);
         openCameraCommon();
+        resizeForPreviewAspectRatio();
     }
 
     private void switchCamera() {
@@ -461,6 +573,7 @@
         closeCamera();
         mUI.collapseCameraControls();
         mUI.clearFaces();
+        disableSkinToneSeekBar();
         if (mFocusManager != null) mFocusManager.removeMessages();
 
         // Restart the camera and initialize the UI. From onCreate.
@@ -484,6 +597,7 @@
 
         // reset zoom value index
         mZoomValue = 0;
+        resizeForPreviewAspectRatio();
         openCameraCommon();
 
         // Start switch camera animation. Post a message because
@@ -506,12 +620,18 @@
                     mActivity.getString(R.string.setting_off_value));
         }
         updateSceneMode();
+        updateHdrMode();
         showTapToFocusToastIfNeeded();
 
 
     }
 
     @Override
+    public void onScreenSizeChanged(int width, int height) {
+        if (mFocusManager != null) mFocusManager.setPreviewSize(width, height);
+    }
+
+    @Override
     public void onPreviewRectChanged(Rect previewRect) {
         if (mFocusManager != null) mFocusManager.setPreviewRect(previewRect);
     }
@@ -526,6 +646,25 @@
         }
     }
 
+    void setPreviewFrameLayoutCameraOrientation(){
+        CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+        //if camera mount angle is 0 or 180, we want to resize preview
+        if (info.orientation % 180 == 0){
+            mUI.cameraOrientationPreviewResize(true);
+        } else{
+            mUI.cameraOrientationPreviewResize(false);
+        }
+    }
+
+    @Override
+    public void resizeForPreviewAspectRatio() {
+        setPreviewFrameLayoutCameraOrientation();
+        Size size = mParameters.getPictureSize();
+        Log.e(TAG,"Width = "+ size.width+ "Height = "+size.height);
+        mUI.setAspectRatio((float) size.width / size.height);
+    }
+
+
     private void keepMediaProviderInstance() {
         // We want to keep a reference to MediaProvider in camera's lifecycle.
         // TODO: Utilize mMediaProviderClient instance to replace
@@ -560,6 +699,12 @@
         }
 
         mNamedImages = new NamedImages();
+         mGraphView = (GraphView)mRootView.findViewById(R.id.graph_view);
+        if(mGraphView == null){
+            Log.e(TAG, "mGraphView is null");
+        } else{
+            mGraphView.setPhotoModuleObject(this);
+        }
 
         mFirstTimeInitialized = true;
         addIdleHandler();
@@ -605,7 +750,8 @@
 
     @Override
     public void startFaceDetection() {
-        if (mFaceDetectionStarted) return;
+        if (mFaceDetectionEnabled == false
+               || mFaceDetectionStarted || mCameraState != IDLE) return;
         if (mParameters.getMaxNumDetectedFaces() > 0) {
             mFaceDetectionStarted = true;
             CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
@@ -618,12 +764,45 @@
 
     @Override
     public void stopFaceDetection() {
-        if (!mFaceDetectionStarted) return;
+        if (mFaceDetectionEnabled == false || !mFaceDetectionStarted) return;
         if (mParameters.getMaxNumDetectedFaces() > 0) {
             mFaceDetectionStarted = false;
             mCameraDevice.setFaceDetectionCallback(null, null);
             mCameraDevice.stopFaceDetection();
-            mUI.clearFaces();
+            mHandler.postDelayed(new Runnable() {
+                @Override
+                public void run(){
+                    mUI.clearFaces();
+                }
+            }, 100);
+        }
+    }
+
+    private final class LongshotShutterCallback
+            implements CameraShutterCallback {
+
+        @Override
+        public void onShutter(CameraProxy camera) {
+            mShutterCallbackTime = System.currentTimeMillis();
+            mShutterLag = mShutterCallbackTime - mCaptureStartTime;
+            Log.e(TAG, "[KPI Perf] PROFILE_SHUTTER_LAG mShutterLag = " + mShutterLag + "ms");
+            synchronized(mCameraDevice) {
+
+                if (mCameraState != LONGSHOT) {
+                    return;
+                }
+
+                if (mLongshotSave) {
+                    mCameraDevice.takePicture(mHandler,
+                            new LongshotShutterCallback(),
+                            mRawPictureCallback, mPostViewPictureCallback,
+                            new LongshotPictureCallback(null));
+                } else {
+                    mCameraDevice.takePicture(mHandler,new LongshotShutterCallback(),
+                            mRawPictureCallback, mPostViewPictureCallback,
+                            new JpegPictureCallback(null));
+                }
+            }
         }
     }
 
@@ -640,7 +819,7 @@
         public void onShutter(CameraProxy camera) {
             mShutterCallbackTime = System.currentTimeMillis();
             mShutterLag = mShutterCallbackTime - mCaptureStartTime;
-            Log.v(TAG, "mShutterLag = " + mShutterLag + "ms");
+            Log.e(TAG, "[KPI Perf] PROFILE_SHUTTER_LAG mShutterLag = " + mShutterLag + "ms");
             if (mNeedsAnimation) {
                 mActivity.runOnUiThread(new Runnable() {
                     @Override
@@ -651,7 +830,26 @@
             }
         }
     }
-
+    private final class StatsCallback
+           implements android.hardware.Camera.CameraDataCallback {
+            @Override
+        public void onCameraData(int [] data, android.hardware.Camera camera) {
+            //if(!mPreviewing || !mHiston || !mFirstTimeInitialized){
+            if(!mHiston || !mFirstTimeInitialized){
+                return;
+            }
+            /*The first element in the array stores max hist value . Stats data begin from second value*/
+            synchronized(statsdata) {
+                System.arraycopy(data,0,statsdata,0,STATS_DATA);
+            }
+            mActivity.runOnUiThread(new Runnable() {
+                public void run() {
+                    if(mGraphView != null)
+                        mGraphView.PreviewChanged();
+                }
+           });
+        }
+    }
     private final class PostViewPictureCallback
             implements CameraPictureCallback {
         @Override
@@ -673,6 +871,64 @@
         }
     }
 
+    private final class LongshotPictureCallback implements CameraPictureCallback {
+        Location mLocation;
+
+        public LongshotPictureCallback(Location loc) {
+            mLocation = loc;
+        }
+
+        @Override
+        public void onPictureTaken(final byte [] jpegData, CameraProxy camera) {
+            if (mPaused) {
+                return;
+            }
+
+            mFocusManager.updateFocusUI(); // Ensure focus indicator is hidden.
+
+            String jpegFilePath = new String(jpegData);
+            mNamedImages.nameNewImage(mCaptureStartTime);
+            NamedEntity name = mNamedImages.getNextNameEntity();
+            String title = (name == null) ? null : name.title;
+            long date = (name == null) ? -1 : name.date;
+
+            if (title == null) {
+                Log.e(TAG, "Unbalanced name/data pair");
+                return;
+            }
+
+
+            if  (date == -1 ) {
+                Log.e(TAG, "Invalid filename date");
+                return;
+            }
+
+            String dstPath = Storage.DIRECTORY;
+            File sdCard = android.os.Environment.getExternalStorageDirectory();
+            File dstFile = new File(dstPath);
+            if (dstFile == null) {
+                Log.e(TAG, "Destination file path invalid");
+                return;
+            }
+
+            File srcFile = new File(jpegFilePath);
+            if (srcFile == null) {
+                Log.e(TAG, "Source file path invalid");
+                return;
+            }
+
+            if ( srcFile.renameTo(dstFile) ) {
+                Size s = mParameters.getPictureSize();
+                String pictureFormat = mParameters.get(KEY_PICTURE_FORMAT);
+                mActivity.getMediaSaveService().addImage(
+                       null, title, date, mLocation, s.width, s.height,
+                       0, null, mOnMediaSavedListener, mContentResolver, pictureFormat);
+            } else {
+                Log.e(TAG, "Failed to move jpeg file");
+            }
+        }
+    }
+
     private final class JpegPictureCallback
             implements CameraPictureCallback {
         Location mLocation;
@@ -695,7 +951,15 @@
                 mUI.setSwipingEnabled(true);
             }
 
+            mReceivedSnapNum = mReceivedSnapNum + 1;
             mJpegPictureCallbackTime = System.currentTimeMillis();
+            if(mSnapshotMode == CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+                Log.v(TAG, "JpegPictureCallback : in zslmode");
+                mParameters = mCameraDevice.getParameters();
+                mBurstSnapNum = mParameters.getInt("num-snaps-per-shutter");
+            }
+            Log.v(TAG, "JpegPictureCallback: Received = " + mReceivedSnapNum +
+                      "Burst count = " + mBurstSnapNum);
             // If postview callback has arrived, the captured image is displayed
             // in postview callback. If not, the captured image is displayed in
             // raw picture callback.
@@ -714,14 +978,31 @@
                     + mPictureDisplayedToJpegCallbackTime + "ms");
 
             mFocusManager.updateFocusUI(); // Ensure focus indicator is hidden.
-            if (!mIsImageCaptureIntent) {
+
+            boolean needRestartPreview = !mIsImageCaptureIntent
+                      && (mCameraState != LONGSHOT)
+                      && (mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_ZSL)
+                      && (mReceivedSnapNum == mBurstSnapNum);
+            if (needRestartPreview) {
                 setupPreview();
+            }else if ((mReceivedSnapNum == mBurstSnapNum)
+                        && (mCameraState != LONGSHOT)){
+                mFocusManager.resetTouchFocus();
+                if (CameraUtil.FOCUS_MODE_CONTINUOUS_PICTURE.equals(
+                        mFocusManager.getFocusMode())) {
+                    mCameraDevice.cancelAutoFocus();
+                }
+                setCameraState(IDLE);
             }
 
             ExifInterface exif = Exif.getExif(jpegData);
             int orientation = Exif.getOrientation(exif);
 
             if (!mIsImageCaptureIntent) {
+                // Burst snapshot. Generate new image name.
+                if (mReceivedSnapNum > 1)
+                    mNamedImages.nameNewImage(mCaptureStartTime);
+
                 // Calculate the width and the height of the jpeg.
                 Size s = mParameters.getPictureSize();
                 int width, height;
@@ -732,6 +1013,19 @@
                     width = s.height;
                     height = s.width;
                 }
+
+                String pictureFormat = mParameters.get(KEY_PICTURE_FORMAT);
+                if (pictureFormat != null && !pictureFormat.equalsIgnoreCase(PIXEL_FORMAT_JPEG)) {
+                    // overwrite width and height if raw picture
+                    String pair = mParameters.get(KEY_QC_RAW_PICUTRE_SIZE);
+                    if (pair != null) {
+                        int pos = pair.indexOf('x');
+                        if (pos != -1) {
+                            width = Integer.parseInt(pair.substring(0, pos));
+                            height = Integer.parseInt(pair.substring(pos + 1));
+                        }
+                    }
+                }
                 NamedEntity name = mNamedImages.getNextNameEntity();
                 String title = (name == null) ? null : name.title;
                 long date = (name == null) ? -1 : name.date;
@@ -762,9 +1056,10 @@
                         exif.setTag(directionRefTag);
                         exif.setTag(directionTag);
                     }
+                    String mPictureFormat = mParameters.get(KEY_PICTURE_FORMAT);
                     mActivity.getMediaSaveService().addImage(
                             jpegData, title, date, mLocation, width, height,
-                            orientation, exif, mOnMediaSavedListener, mContentResolver);
+                            orientation, exif, mOnMediaSavedListener, mContentResolver, mPictureFormat);
                 }
                 // Animate capture with real jpeg data instead of a preview frame.
                 mUI.animateCapture(jpegData, orientation, mMirror);
@@ -787,10 +1082,67 @@
             mJpegCallbackFinishTime = now - mJpegPictureCallbackTime;
             Log.v(TAG, "mJpegCallbackFinishTime = "
                     + mJpegCallbackFinishTime + "ms");
-            mJpegPictureCallbackTime = 0;
+
+            if (mReceivedSnapNum == mBurstSnapNum)
+                mJpegPictureCallbackTime = 0;
+
+            if (mHiston && (mSnapshotMode ==CameraInfo.CAMERA_SUPPORT_MODE_ZSL)) {
+                mActivity.runOnUiThread(new Runnable() {
+                    public void run() {
+                        if (mGraphView != null) {
+                            mGraphView.setVisibility(View.VISIBLE);
+                            mGraphView.PreviewChanged();
+                        }
+                    }
+                });
+            }
+            if (mSnapshotMode == CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+                cancelAutoFocus();
+            }
         }
     }
+    private OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
+        public void onStartTrackingTouch(SeekBar bar) {
+        // no support
+        }
+        public void onProgressChanged(SeekBar bar, int progress, boolean fromtouch) {
+        }
+        public void onStopTrackingTouch(SeekBar bar) {
+        }
+    };
 
+    private OnSeekBarChangeListener mskinToneSeekListener = new OnSeekBarChangeListener() {
+        public void onStartTrackingTouch(SeekBar bar) {
+        // no support
+        }
+
+        public void onProgressChanged(SeekBar bar, int progress, boolean fromtouch) {
+            int value = (progress + MIN_SCE_FACTOR) * SCE_FACTOR_STEP;
+            if(progress > (MAX_SCE_FACTOR - MIN_SCE_FACTOR)/2){
+                RightValue.setText(String.valueOf(value));
+                LeftValue.setText("");
+            } else if (progress < (MAX_SCE_FACTOR - MIN_SCE_FACTOR)/2){
+                LeftValue.setText(String.valueOf(value));
+                RightValue.setText("");
+            } else {
+                LeftValue.setText("");
+                RightValue.setText("");
+            }
+            if (value != mskinToneValue && mCameraDevice != null) {
+                mskinToneValue = value;
+                Message msg = mHandler.obtainMessage(CONFIGURE_SKIN_TONE_FACTOR, mskinToneValue, 0);
+                mHandler.sendMessage(msg);
+            }
+        }
+
+        public void onStopTrackingTouch(SeekBar bar) {
+            Log.v(TAG, "Set onStopTrackingTouch mskinToneValue = " + mskinToneValue);
+            Editor editor = mPreferences.edit();
+            editor.putString(CameraSettings.KEY_SKIN_TONE_ENHANCEMENT_FACTOR,
+                             Integer.toString(mskinToneValue));
+            editor.apply();
+        }
+    };
     private final class AutoFocusCallback implements CameraAFCallback {
         @Override
         public void onAutoFocus(
@@ -851,6 +1203,7 @@
         switch (state) {
             case PhotoController.PREVIEW_STOPPED:
             case PhotoController.SNAPSHOT_IN_PROGRESS:
+            case PhotoController.LONGSHOT:
             case PhotoController.SWITCHING_CAMERA:
                 mUI.enableGestures(false);
                 break;
@@ -884,6 +1237,18 @@
         mJpegImageData = null;
 
         final boolean animateBefore = (mSceneMode == CameraUtil.SCENE_MODE_HDR);
+        if(mHiston) {
+            if (mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+                mHiston = false;
+                mCameraDevice.setHistogramMode(null);
+            }
+            mActivity.runOnUiThread(new Runnable() {
+                public void run() {
+                    if(mGraphView != null)
+                        mGraphView.setVisibility(View.INVISIBLE);
+                }
+            });
+        }
 
         if (animateBefore) {
             animateAfterShutter();
@@ -900,22 +1265,48 @@
         }
         mJpegRotation = CameraUtil.getJpegRotation(mCameraId, orientation);
         mParameters.setRotation(mJpegRotation);
-        Location loc = mLocationManager.getCurrentLocation();
+        String pictureFormat = mParameters.get(KEY_PICTURE_FORMAT);
+        Location loc = null;
+        if (pictureFormat != null &&
+              PIXEL_FORMAT_JPEG.equalsIgnoreCase(pictureFormat)) {
+            loc = mLocationManager.getCurrentLocation();
+        }
         CameraUtil.setGpsParameters(mParameters, loc);
         mCameraDevice.setParameters(mParameters);
+        mParameters = mCameraDevice.getParameters();
+
+        mBurstSnapNum = mParameters.getInt("num-snaps-per-shutter");
+        mReceivedSnapNum = 0;
 
         // We don't want user to press the button again while taking a
         // multi-second HDR photo.
         mUI.enableShutter(false);
-        mCameraDevice.takePicture(mHandler,
-                new ShutterCallback(!animateBefore),
-                mRawPictureCallback, mPostViewPictureCallback,
-                new JpegPictureCallback(loc));
+
+        if (mCameraState == LONGSHOT) {
+            if(mLongshotSave) {
+                mCameraDevice.takePicture(mHandler,
+                        new LongshotShutterCallback(),
+                        mRawPictureCallback, mPostViewPictureCallback,
+                        new LongshotPictureCallback(loc));
+            } else {
+                mCameraDevice.takePicture(mHandler,
+                        new LongshotShutterCallback(),
+                        mRawPictureCallback, mPostViewPictureCallback,
+                        new JpegPictureCallback(loc));
+            }
+        } else {
+            mCameraDevice.takePicture(mHandler,
+                    new ShutterCallback(!animateBefore),
+                    mRawPictureCallback, mPostViewPictureCallback,
+                    new JpegPictureCallback(loc));
+            setCameraState(SNAPSHOT_IN_PROGRESS);
+        }
 
         mNamedImages.nameNewImage(mCaptureStartTime);
 
-        mFaceDetectionStarted = false;
-        setCameraState(SNAPSHOT_IN_PROGRESS);
+        if (mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+            mFaceDetectionStarted = false;
+        }
         UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
                 UsageStatistics.ACTION_CAPTURE_DONE, "Photo", 0,
                 UsageStatistics.hashFileName(mNamedImages.mQueue.lastElement().title + ".jpg"),
@@ -939,23 +1330,41 @@
         }
     }
 
+    private void updateHdrMode() {
+        String zsl = mPreferences.getString(CameraSettings.KEY_ZSL,
+                         mActivity.getString(R.string.pref_camera_zsl_default));
+        if (zsl.equals("on")) {
+            mUI.overrideSettings(CameraSettings.KEY_CAMERA_HDR,
+                                      mParameters.getAEBracket());
+        } else {
+            mUI.overrideSettings(CameraSettings.KEY_CAMERA_HDR, null);
+        }
+    }
+
     private void updateSceneMode() {
         // If scene mode is set, we cannot set flash mode, white balance, and
         // focus mode, instead, we read it from driver
         if (!Parameters.SCENE_MODE_AUTO.equals(mSceneMode)) {
             overrideCameraSettings(mParameters.getFlashMode(),
-                    mParameters.getWhiteBalance(), mParameters.getFocusMode());
+                    mParameters.getWhiteBalance(), mParameters.getFocusMode(),
+                    Integer.toString(mParameters.getExposureCompensation()),
+                    mCurrTouchAfAec, mParameters.getAutoExposure());
         } else {
-            overrideCameraSettings(null, null, null);
+            overrideCameraSettings(null, null, null, null, null, null);
         }
     }
 
     private void overrideCameraSettings(final String flashMode,
-                                        final String whiteBalance, final String focusMode) {
+            final String whiteBalance, final String focusMode,
+            final String exposureMode, final String touchMode,
+            final String autoExposure) {
         mUI.overrideSettings(
                 CameraSettings.KEY_FLASH_MODE, flashMode,
                 CameraSettings.KEY_WHITE_BALANCE, whiteBalance,
-                CameraSettings.KEY_FOCUS_MODE, focusMode);
+                CameraSettings.KEY_FOCUS_MODE, focusMode,
+                CameraSettings.KEY_EXPOSURE, exposureMode,
+                CameraSettings.KEY_TOUCH_AF_AEC, touchMode,
+                CameraSettings.KEY_AUTOEXPOSURE, autoExposure);
     }
 
     private void loadCameraPreferences() {
@@ -970,13 +1379,27 @@
         // the camera then point the camera to floor or sky, we still have
         // the correct orientation.
         if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) return;
+        int oldOrientation = mOrientation;
         mOrientation = CameraUtil.roundOrientation(orientation, mOrientation);
+        if (oldOrientation != mOrientation) {
+            Log.v(TAG, "onOrientationChanged, update parameters");
+            if (mParameters != null && mCameraDevice != null) {
+                onSharedPreferenceChanged();
+            }
+        }
 
         // Show the toast after getting the first orientation changed.
         if (mHandler.hasMessages(SHOW_TAP_TO_FOCUS_TOAST)) {
             mHandler.removeMessages(SHOW_TAP_TO_FOCUS_TOAST);
             showTapToFocusToast();
         }
+
+        // need to re-initialize mGraphView to show histogram on rotate
+        mGraphView = (GraphView)mRootView.findViewById(R.id.graph_view);
+        if(mGraphView != null){
+            mGraphView.setPhotoModuleObject(this);
+            mGraphView.PreviewChanged();
+        }
     }
 
     @Override
@@ -1090,6 +1513,22 @@
                 || (mCameraState == SNAPSHOT_IN_PROGRESS)
                 || (mCameraState == PREVIEW_STOPPED)) return;
 
+        synchronized(mCameraDevice) {
+           if (mCameraState == LONGSHOT) {
+               mCameraDevice.setLongshot(false);
+               if (!mFocusManager.isZslEnabled()) {
+                   setupPreview();
+               } else {
+                   setCameraState(IDLE);
+                   mFocusManager.resetTouchFocus();
+                   if (CameraUtil.FOCUS_MODE_CONTINUOUS_PICTURE.equals(
+                           mFocusManager.getFocusMode())) {
+                       mCameraDevice.cancelAutoFocus();
+                   }
+               }
+           }
+        }
+
         // Do not do focus if there is not enough storage.
         if (pressed && !canTakePicture()) return;
 
@@ -1122,6 +1561,14 @@
             mUI.hideSwitcher();
             mUI.setSwipingEnabled(false);
         }
+
+         //Need to disable focus for ZSL mode
+        if(mSnapshotMode == CameraInfo.CAMERA_SUPPORT_MODE_ZSL) {
+            mFocusManager.setZslEnable(true);
+        } else {
+            mFocusManager.setZslEnable(false);
+        }
+
         // If the user wants to do a snapshot while the previous one is still
         // in progress, remember the fact and do it after we finish the previous
         // one and re-start the preview. Snapshot in progress also includes the
@@ -1155,6 +1602,21 @@
     }
 
     @Override
+    public void onShutterButtonLongClick() {
+        if ((null != mCameraDevice) && (mCameraState == IDLE)) {
+            boolean enable = false;
+            enable = SystemProperties.getBoolean(PERSIST_LONG_ENABLE, false);
+            if ( enable ) {
+                enable = SystemProperties.getBoolean(PERSIST_LONG_SAVE, false);
+                mLongshotSave = enable;
+                mCameraDevice.setLongshot(true);
+                setCameraState(PhotoController.LONGSHOT);
+                mFocusManager.doSnap();
+            }
+        }
+    }
+
+    @Override
     public void installIntentFilter() {
         // Do nothing.
     }
@@ -1227,6 +1689,11 @@
             return;
         }
 
+        if (mSkinToneSeekBar != true)
+        {
+            Log.v(TAG, "Send tone bar: mSkinToneSeekBar = " + mSkinToneSeekBar);
+            mHandler.sendEmptyMessage(SET_SKIN_TONE_FACTOR);
+        }
         // If first time initialization is not finished, put it in the
         // message queue.
         if (!mFirstTimeInitialized) {
@@ -1330,6 +1797,7 @@
     public void onConfigurationChanged(Configuration newConfig) {
         Log.v(TAG, "onConfigurationChanged");
         setDisplayOrientation();
+        resizeForPreviewAspectRatio();
     }
 
     @Override
@@ -1362,6 +1830,10 @@
         }
     }
 
+    protected CameraManager.CameraProxy getCamera() {
+        return mCameraDevice;
+    }
+
     private boolean canTakePicture() {
         return isCameraIdle() && (mActivity.getStorageSpaceBytes() > Storage.LOW_STORAGE_THRESHOLD_BYTES);
     }
@@ -1375,9 +1847,11 @@
 
     @Override
     public void cancelAutoFocus() {
-        mCameraDevice.cancelAutoFocus();
-        setCameraState(IDLE);
-        setCameraParameters(UPDATE_PARAM_PREFERENCE);
+        if (null != mCameraDevice ) {
+            mCameraDevice.cancelAutoFocus();
+            setCameraState(IDLE);
+            setCameraParameters(UPDATE_PARAM_PREFERENCE);
+        }
     }
 
     // Preview area is touched. Handle touch focus.
@@ -1389,7 +1863,10 @@
                 || mCameraState == PREVIEW_STOPPED) {
             return;
         }
-
+        //If Touch AF/AEC is disabled in UI, return
+        if(this.mTouchAfAecFlag == false) {
+            return;
+        }
         // Check if metering area or focus area is supported.
         if (!mFocusAreaSupported && !mMeteringAreaSupported) return;
         mFocusManager.onSingleTapUp(x, y);
@@ -1418,6 +1895,36 @@
                     onShutterButtonClick();
                 }
                 return true;
+        case KeyEvent.KEYCODE_DPAD_LEFT:
+            if ( (mCameraState != PREVIEW_STOPPED) &&
+                  (mFocusManager.getCurrentFocusState() != mFocusManager.STATE_FOCUSING) &&
+                  (mFocusManager.getCurrentFocusState() != mFocusManager.STATE_FOCUSING_SNAP_ON_FINISH) ) {
+                if (mbrightness > MINIMUM_BRIGHTNESS) {
+                    mbrightness-=mbrightness_step;
+                    /* Set the "luma-adaptation" parameter */
+                    mParameters = mCameraDevice.getParameters();
+                    mParameters.set("luma-adaptation", String.valueOf(mbrightness));
+                    mCameraDevice.setParameters(mParameters);
+                }
+                brightnessProgressBar.setProgress(mbrightness);
+                brightnessProgressBar.setVisibility(View.VISIBLE);
+            }
+            break;
+           case KeyEvent.KEYCODE_DPAD_RIGHT:
+            if ( (mCameraState != PREVIEW_STOPPED) &&
+                  (mFocusManager.getCurrentFocusState() != mFocusManager.STATE_FOCUSING) &&
+                  (mFocusManager.getCurrentFocusState() != mFocusManager.STATE_FOCUSING_SNAP_ON_FINISH) ) {
+                if (mbrightness < MAXIMUM_BRIGHTNESS) {
+                    mbrightness+=mbrightness_step;
+                    /* Set the "luma-adaptation" parameter */
+                    mParameters = mCameraDevice.getParameters();
+                    mParameters.set("luma-adaptation", String.valueOf(mbrightness));
+                    mCameraDevice.setParameters(mParameters);
+                }
+                brightnessProgressBar.setProgress(mbrightness);
+                brightnessProgressBar.setVisibility(View.VISIBLE);
+            }
+            break;
             case KeyEvent.KEYCODE_DPAD_CENTER:
                 // If we get a dpad center event without any focused view, move
                 // the focus to the shutter button and press it.
@@ -1548,7 +2055,6 @@
         if (mCameraDevice != null && mCameraState != PREVIEW_STOPPED) {
             Log.v(TAG, "stopPreview");
             mCameraDevice.stopPreview();
-            mFaceDetectionStarted = false;
         }
         setCameraState(PREVIEW_STOPPED);
         if (mFocusManager != null) mFocusManager.onPreviewStopped();
@@ -1578,10 +2084,325 @@
     private void updateCameraParametersZoom() {
         // Set zoom.
         if (mParameters.isZoomSupported()) {
+            Parameters p = mCameraDevice.getParameters();
+            mZoomValue = p.getZoom();
             mParameters.setZoom(mZoomValue);
         }
     }
+    private boolean needRestart() {
+        mRestartPreview = false;
+        String zsl = mPreferences.getString(CameraSettings.KEY_ZSL,
+                                  mActivity.getString(R.string.pref_camera_zsl_default));
+        if(zsl.equals("on") && mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_ZSL
+           && mCameraState != PREVIEW_STOPPED) {
+            //Switch on ZSL Camera mode
+            Log.v(TAG, "Switching to ZSL Camera Mode. Restart Preview");
+            mRestartPreview = true;
+            return mRestartPreview;
+        }
+        if(zsl.equals("off") && mSnapshotMode != CameraInfo.CAMERA_SUPPORT_MODE_NONZSL
+                 && mCameraState != PREVIEW_STOPPED) {
+            //Switch on Normal Camera mode
+            Log.v(TAG, "Switching to Normal Camera Mode. Restart Preview");
+            mRestartPreview = true;
+            return mRestartPreview;
+        }
+        return mRestartPreview;
+    }
 
+    private void qcomUpdateCameraParametersPreference() {
+        //qcom Related Parameter update
+        //Set Brightness.
+        mParameters.set("luma-adaptation", String.valueOf(mbrightness));
+
+        if (Parameters.SCENE_MODE_AUTO.equals(mSceneMode)) {
+            // Set Touch AF/AEC parameter.
+            String touchAfAec = mPreferences.getString(
+                 CameraSettings.KEY_TOUCH_AF_AEC,
+                 mActivity.getString(R.string.pref_camera_touchafaec_default));
+            if (CameraUtil.isSupported(touchAfAec, mParameters.getSupportedTouchAfAec())) {
+                mCurrTouchAfAec = touchAfAec;
+                mParameters.setTouchAfAec(touchAfAec);
+            }
+        } else {
+            mParameters.setTouchAfAec(mParameters.TOUCH_AF_AEC_OFF);
+            mFocusManager.resetTouchFocus();
+        }
+        try {
+            if(mParameters.getTouchAfAec().equals(mParameters.TOUCH_AF_AEC_ON))
+                this.mTouchAfAecFlag = true;
+            else
+                this.mTouchAfAecFlag = false;
+        } catch(Exception e){
+            Log.e(TAG, "Handled NULL pointer Exception");
+        }
+
+        // Set Picture Format
+        // Picture Formats specified in UI should be consistent with
+        // PIXEL_FORMAT_JPEG and PIXEL_FORMAT_RAW constants
+        String pictureFormat = mPreferences.getString(
+                CameraSettings.KEY_PICTURE_FORMAT,
+                mActivity.getString(R.string.pref_camera_picture_format_default));
+        mParameters.set(KEY_PICTURE_FORMAT, pictureFormat);
+
+        // Set JPEG quality.
+        String jpegQuality = mPreferences.getString(
+                CameraSettings.KEY_JPEG_QUALITY,
+                mActivity.getString(R.string.pref_camera_jpegquality_default));
+        //mUnsupportedJpegQuality = false;
+        Size pic_size = mParameters.getPictureSize();
+        if (pic_size == null) {
+            Log.e(TAG, "error getPictureSize: size is null");
+        }
+        else{
+            if("100".equals(jpegQuality) && (pic_size.width >= 3200)){
+                //mUnsupportedJpegQuality = true;
+            }else {
+                mParameters.setJpegQuality(JpegEncodingQualityMappings.getQualityNumber(jpegQuality));
+            }
+        }
+
+        // Set Selectable Zone Af parameter.
+        String selectableZoneAf = mPreferences.getString(
+            CameraSettings.KEY_SELECTABLE_ZONE_AF,
+            mActivity.getString(R.string.pref_camera_selectablezoneaf_default));
+        List<String> str = mParameters.getSupportedSelectableZoneAf();
+        if (CameraUtil.isSupported(selectableZoneAf, mParameters.getSupportedSelectableZoneAf())) {
+            mParameters.setSelectableZoneAf(selectableZoneAf);
+        }
+
+        // Set wavelet denoise mode
+        if (mParameters.getSupportedDenoiseModes() != null) {
+            String Denoise = mPreferences.getString( CameraSettings.KEY_DENOISE,
+                             mActivity.getString(R.string.pref_camera_denoise_default));
+            mParameters.setDenoise(Denoise);
+        }
+        // Set Redeye Reduction
+        String redeyeReduction = mPreferences.getString(
+                CameraSettings.KEY_REDEYE_REDUCTION,
+                mActivity.getString(R.string.pref_camera_redeyereduction_default));
+        if (CameraUtil.isSupported(redeyeReduction,
+            mParameters.getSupportedRedeyeReductionModes())) {
+            mParameters.setRedeyeReductionMode(redeyeReduction);
+        }
+        // Set ISO parameter
+        String iso = mPreferences.getString(
+                CameraSettings.KEY_ISO,
+                mActivity.getString(R.string.pref_camera_iso_default));
+        if (CameraUtil.isSupported(iso,
+                mParameters.getSupportedIsoValues())) {
+                mParameters.setISOValue(iso);
+        }
+        // Set color effect parameter.
+        String colorEffect = mPreferences.getString(
+                CameraSettings.KEY_COLOR_EFFECT,
+                mActivity.getString(R.string.pref_camera_coloreffect_default));
+        Log.v(TAG, "Color effect value =" + colorEffect);
+        if (CameraUtil.isSupported(colorEffect, mParameters.getSupportedColorEffects())) {
+            mParameters.setColorEffect(colorEffect);
+        }
+        //Set Saturation
+        String saturationStr = mPreferences.getString(
+                CameraSettings.KEY_SATURATION,
+                mActivity.getString(R.string.pref_camera_saturation_default));
+        int saturation = Integer.parseInt(saturationStr);
+        Log.v(TAG, "Saturation value =" + saturation);
+        if((0 <= saturation) && (saturation <= mParameters.getMaxSaturation())){
+            mParameters.setSaturation(saturation);
+        }
+        // Set contrast parameter.
+        String contrastStr = mPreferences.getString(
+                CameraSettings.KEY_CONTRAST,
+                mActivity.getString(R.string.pref_camera_contrast_default));
+        int contrast = Integer.parseInt(contrastStr);
+        Log.v(TAG, "Contrast value =" +contrast);
+        if((0 <= contrast) && (contrast <= mParameters.getMaxContrast())){
+            mParameters.setContrast(contrast);
+        }
+        // Set sharpness parameter
+        String sharpnessStr = mPreferences.getString(
+                CameraSettings.KEY_SHARPNESS,
+                mActivity.getString(R.string.pref_camera_sharpness_default));
+        int sharpness = Integer.parseInt(sharpnessStr) *
+                (mParameters.getMaxSharpness()/MAX_SHARPNESS_LEVEL);
+        Log.v(TAG, "Sharpness value =" + sharpness);
+        if((0 <= sharpness) && (sharpness <= mParameters.getMaxSharpness())){
+            mParameters.setSharpness(sharpness);
+        }
+        // Set Face Recognition
+        String faceRC = mPreferences.getString(
+                CameraSettings.KEY_FACE_RECOGNITION,
+                mActivity.getString(R.string.pref_camera_facerc_default));
+        Log.v(TAG, "Face Recognition value = " + faceRC);
+        if (CameraUtil.isSupported(faceRC,
+                CameraSettings.getSupportedFaceRecognitionModes(mParameters))) {
+            mParameters.set(CameraSettings.KEY_QC_FACE_RECOGNITION, faceRC);
+        }
+        // Set AE Bracketing
+        String aeBracketing = mPreferences.getString(
+                CameraSettings.KEY_AE_BRACKET_HDR,
+                mActivity.getString(R.string.pref_camera_ae_bracket_hdr_default));
+        Log.v(TAG, "AE Bracketing value =" + aeBracketing);
+        if (CameraUtil.isSupported(aeBracketing,
+                CameraSettings.getSupportedAEBracketingModes(mParameters))) {
+            mParameters.set(CameraSettings.KEY_QC_AE_BRACKETING, aeBracketing);
+        }
+        // Set auto exposure parameter.
+        String autoExposure = mPreferences.getString(
+                CameraSettings.KEY_AUTOEXPOSURE,
+                mActivity.getString(R.string.pref_camera_autoexposure_default));
+        Log.v(TAG, "autoExposure value =" + autoExposure);
+        if (CameraUtil.isSupported(autoExposure, mParameters.getSupportedAutoexposure())) {
+            mParameters.setAutoExposure(autoExposure);
+        }
+
+        // Set anti banding parameter.
+        String antiBanding = mPreferences.getString(
+                 CameraSettings.KEY_ANTIBANDING,
+                 mActivity.getString(R.string.pref_camera_antibanding_default));
+        Log.v(TAG, "antiBanding value =" + antiBanding);
+        if (CameraUtil.isSupported(antiBanding, mParameters.getSupportedAntibanding())) {
+            mParameters.setAntibanding(antiBanding);
+        }
+
+        String zsl = mPreferences.getString(CameraSettings.KEY_ZSL,
+                                  mActivity.getString(R.string.pref_camera_zsl_default));
+        String hdr = mPreferences.getString(CameraSettings.KEY_CAMERA_HDR,
+                mActivity.getString(R.string.pref_camera_hdr_default));
+        mParameters.setZSLMode(zsl);
+        if(zsl.equals("on")) {
+            //Switch on ZSL Camera mode
+            mSnapshotMode = CameraInfo.CAMERA_SUPPORT_MODE_ZSL;
+            mParameters.setCameraMode(1);
+            mFocusManager.setZslEnable(true);
+
+            // Currently HDR is not supported under ZSL mode
+            Editor editor = mPreferences.edit();
+            editor.putString(CameraSettings.KEY_AE_BRACKET_HDR, mActivity.getString(R.string.setting_off_value));
+
+            //Raw picture format is not supported under ZSL mode
+            editor.putString(CameraSettings.KEY_PICTURE_FORMAT, mActivity.getString(R.string.pref_camera_picture_format_value_jpeg));
+            editor.apply();
+
+            if(!pictureFormat.equals(PIXEL_FORMAT_JPEG)) {
+                     mActivity.runOnUiThread(new Runnable() {
+                     public void run() {
+                Toast.makeText(mActivity, R.string.error_app_unsupported_raw,
+                    Toast.LENGTH_SHORT).show();
+                         }
+                    });
+            }
+
+            if(hdr.equals(mActivity.getString(R.string.setting_on_value))) {
+                     mActivity.runOnUiThread(new Runnable() {
+                     public void run() {
+                Toast.makeText(mActivity, R.string.error_app_unsupported_hdr_zsl,
+                    Toast.LENGTH_SHORT).show();
+                         }
+                    });
+            }
+        } else if(zsl.equals("off")) {
+            mSnapshotMode = CameraInfo.CAMERA_SUPPORT_MODE_NONZSL;
+            mParameters.setCameraMode(0);
+            mFocusManager.setZslEnable(false);
+        }
+        // Set face detetction parameter.
+        String faceDetection = mPreferences.getString(
+            CameraSettings.KEY_FACE_DETECTION,
+            mActivity.getString(R.string.pref_camera_facedetection_default));
+
+        if (CameraUtil.isSupported(faceDetection, mParameters.getSupportedFaceDetectionModes())) {
+            mParameters.setFaceDetectionMode(faceDetection);
+            if(faceDetection.equals("on") && mFaceDetectionEnabled == false) {
+                mFaceDetectionEnabled = true;
+                startFaceDetection();
+            }
+            if(faceDetection.equals("off") && mFaceDetectionEnabled == true) {
+                stopFaceDetection();
+                mFaceDetectionEnabled = false;
+            }
+        }
+        // skin tone ie enabled only for auto,party and portrait BSM
+        // when color effects are not enabled
+        if((Parameters.SCENE_MODE_PARTY.equals(mSceneMode) ||
+            Parameters.SCENE_MODE_PORTRAIT.equals(mSceneMode)) &&
+            (Parameters.EFFECT_NONE.equals(colorEffect))) {
+             //Set Skin Tone Correction factor
+             Log.v(TAG, "set tone bar: mSceneMode = " + mSceneMode);
+             if(mSeekBarInitialized == true)
+                 mHandler.sendEmptyMessage(SET_SKIN_TONE_FACTOR);
+        }
+
+        //Set Histogram
+        String histogram = mPreferences.getString(
+                CameraSettings.KEY_HISTOGRAM,
+                mActivity.getString(R.string.pref_camera_histogram_default));
+        if (CameraUtil.isSupported(histogram,
+            mParameters.getSupportedHistogramModes()) && mCameraDevice != null) {
+            // Call for histogram
+            if(histogram.equals("enable")) {
+                mActivity.runOnUiThread(new Runnable() {
+                    public void run() {
+                        if(mGraphView != null) {
+                            mGraphView.setVisibility(View.VISIBLE);
+                            mGraphView.PreviewChanged();
+                        }
+                    }
+                });
+                mCameraDevice.setHistogramMode(mStatsCallback);
+                mHiston = true;
+            } else {
+                mHiston = false;
+                mActivity.runOnUiThread(new Runnable() {
+                    public void run() {
+                         if (mGraphView != null)
+                             mGraphView.setVisibility(View.INVISIBLE);
+                         }
+                    });
+                mCameraDevice.setHistogramMode(null);
+            }
+        }
+        // Read Flip mode from adb command
+        //value: 0(default) - FLIP_MODE_OFF
+        //value: 1 - FLIP_MODE_H
+        //value: 2 - FLIP_MODE_V
+        //value: 3 - FLIP_MODE_VH
+        int preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0);
+        int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0);
+        int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0);
+        int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation);
+        mParameters.setRotation(rotation);
+        if (rotation == 90 || rotation == 270) {
+            // in case of 90 or 270 degree, V/H flip should reverse
+            if (preview_flip_value == 1) {
+                preview_flip_value = 2;
+            } else if (preview_flip_value == 2) {
+                preview_flip_value = 1;
+            }
+            if (video_flip_value == 1) {
+                video_flip_value = 2;
+            } else if (video_flip_value == 2) {
+                video_flip_value = 1;
+            }
+            if (picture_flip_value == 1) {
+                picture_flip_value = 2;
+            } else if (picture_flip_value == 2) {
+                picture_flip_value = 1;
+            }
+        }
+        String preview_flip = CameraUtil.getFilpModeString(preview_flip_value);
+        String video_flip = CameraUtil.getFilpModeString(video_flip_value);
+        String picture_flip = CameraUtil.getFilpModeString(picture_flip_value);
+        if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip);
+        }
+        if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip);
+        }
+        if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);
+        }
+    }
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
     private void setAutoExposureLockIfSupported() {
         if (mAeLockSupported) {
@@ -1620,9 +2441,19 @@
         if (pictureSize == null) {
             CameraSettings.initialCameraPictureSize(mActivity, mParameters);
         } else {
+            Size old_size = mParameters.getPictureSize();
+            Log.v(TAG, "old picture_size = " + old_size.width + " x " + old_size.height);
             List<Size> supported = mParameters.getSupportedPictureSizes();
             CameraSettings.setCameraPictureSize(
                     pictureSize, supported, mParameters);
+            Size size = mParameters.getPictureSize();
+            Log.v(TAG, "new picture_size = " + size.width + " x " + size.height);
+            if (old_size != null && size != null) {
+                if(!size.equals(old_size) && mCameraState != PREVIEW_STOPPED) {
+                    Log.v(TAG, "Picture Size changed. Restart Preview");
+                    mRestartPreview = true;
+                }
+            }
         }
         Size size = mParameters.getPictureSize();
 
@@ -1644,6 +2475,8 @@
                 mCameraDevice.setParameters(mParameters);
             }
             mParameters = mCameraDevice.getParameters();
+            Log.v(TAG, "Preview Size changed. Restart Preview");
+            mRestartPreview = true;
         }
 
         if(optimalSize.width != 0 && optimalSize.height != 0) {
@@ -1751,7 +2584,8 @@
         if (mContinuousFocusSupported && ApiHelper.HAS_AUTO_FOCUS_MOVE_CALLBACK) {
             updateAutoFocusMoveCallback();
         }
-
+        //QCom related parameters updated here.
+        qcomUpdateCameraParametersPreference();
         return doGcamModeSwitch;
     }
 
@@ -1802,7 +2636,16 @@
             return;
         } else if (isCameraIdle()) {
             setCameraParameters(mUpdateSet);
+             if(mRestartPreview && mCameraState != PREVIEW_STOPPED) {
+                Log.v(TAG, "Restarting Preview...");
+                stopPreview();
+                resizeForPreviewAspectRatio();
+                startPreview();
+                setCameraState(IDLE);
+            }
+            mRestartPreview = false;
             updateSceneMode();
+            updateHdrMode();
             mUpdateSet = 0;
         } else {
             if (!mHandler.hasMessages(SET_CAMERA_PARAMETERS_WHEN_IDLE)) {
@@ -1843,9 +2686,41 @@
         boolean recordLocation = RecordLocationPreference.get(
                 mPreferences, mContentResolver);
         mLocationManager.recordLocation(recordLocation);
-
-        setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
-        mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup, mPreferences);
+        if(needRestart()){
+            Log.v(TAG, "Restarting Preview... Camera Mode Changhed");
+            stopPreview();
+            startPreview();
+            setCameraState(IDLE);
+            mRestartPreview = false;
+        }
+        /* Check if the PhotoUI Menu is initialized or not. This
+         * should be initialized during onCameraOpen() which should
+         * have been called by now. But for some reason that is not
+         * executed till now, then schedule these functionality for
+         * later by posting a message to the handler */
+        if (mUI.mMenuInitialized) {
+            setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
+            mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup,
+                mPreferences);
+        } else {
+            mHandler.sendEmptyMessage(SET_PHOTO_UI_PARAMS);
+        }
+        resizeForPreviewAspectRatio();
+        if (mSeekBarInitialized == true){
+            Log.v(TAG, "onSharedPreferenceChanged Skin tone bar: change");
+            // skin tone is enabled only for party and portrait BSM
+            // when color effects are not enabled
+            String colorEffect = mPreferences.getString(
+                CameraSettings.KEY_COLOR_EFFECT,
+                mActivity.getString(R.string.pref_camera_coloreffect_default));
+            if((Parameters.SCENE_MODE_PARTY.equals(mSceneMode) ||
+                Parameters.SCENE_MODE_PORTRAIT.equals(mSceneMode)) &&
+                (Parameters.EFFECT_NONE.equals(colorEffect))) {
+                Log.v(TAG, "Party/Portrait + No effect, SkinToneBar enabled");
+            } else {
+                disableSkinToneSeekBar();
+            }
+        }
     }
 
     @Override
@@ -1985,12 +2860,91 @@
             mHeading += 360;
         }
     }
-
     @Override
     public void onPreviewFocusChanged(boolean previewFocused) {
         mUI.onPreviewFocusChanged(previewFocused);
     }
+    // TODO: Delete this function after old camera code is removed
+    @Override
+    public void onRestorePreferencesClicked() {}
+    private void setSkinToneFactor() {
+        if(mCameraDevice == null || mParameters == null || skinToneSeekBar == null)
+            return;
 
+        String skinToneEnhancementPref = "enable";
+        if(CameraUtil.isSupported(skinToneEnhancementPref,
+               mParameters.getSupportedSkinToneEnhancementModes())) {
+            if(skinToneEnhancementPref.equals("enable")) {
+                int skinToneValue =0;
+                int progress;
+                //get the value for the first time!
+                if (mskinToneValue ==0) {
+                    String factor = mPreferences.getString(
+                         CameraSettings.KEY_SKIN_TONE_ENHANCEMENT_FACTOR, "0");
+                    skinToneValue = Integer.parseInt(factor);
+                }
+
+                Log.v(TAG, "Skin tone bar: enable = " + mskinToneValue);
+                enableSkinToneSeekBar();
+                //As a wrokaround set progress again to show the actually progress on screen.
+                if (skinToneValue != 0) {
+                    progress = (skinToneValue/SCE_FACTOR_STEP)-MIN_SCE_FACTOR;
+                    skinToneSeekBar.setProgress(progress);
+                }
+            } else {
+                Log.v(TAG, "Skin tone bar: disable");
+                disableSkinToneSeekBar();
+            }
+        } else {
+            Log.v(TAG, "Skin tone bar: Not supported");
+            skinToneSeekBar.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void enableSkinToneSeekBar() {
+        int progress;
+        if(brightnessProgressBar != null)
+            brightnessProgressBar.setVisibility(View.INVISIBLE);
+        skinToneSeekBar.setMax(MAX_SCE_FACTOR-MIN_SCE_FACTOR);
+        skinToneSeekBar.setVisibility(View.VISIBLE);
+        skinToneSeekBar.requestFocus();
+        if (mskinToneValue != 0) {
+            progress = (mskinToneValue/SCE_FACTOR_STEP)-MIN_SCE_FACTOR;
+            mskinToneSeekListener.onProgressChanged(skinToneSeekBar, progress, false);
+        } else {
+            progress = (MAX_SCE_FACTOR-MIN_SCE_FACTOR)/2;
+            RightValue.setText("");
+            LeftValue.setText("");
+        }
+        skinToneSeekBar.setProgress(progress);
+        mActivity.findViewById(R.id.linear).bringToFront();
+        skinToneSeekBar.bringToFront();
+        Title.setText("Skin Tone Enhancement");
+        Title.setVisibility(View.VISIBLE);
+        RightValue.setVisibility(View.VISIBLE);
+        LeftValue.setVisibility(View.VISIBLE);
+        mSkinToneSeekBar = true;
+    }
+
+    private void disableSkinToneSeekBar() {
+        skinToneSeekBar.setVisibility(View.INVISIBLE);
+        Title.setVisibility(View.INVISIBLE);
+        RightValue.setVisibility(View.INVISIBLE);
+        LeftValue.setVisibility(View.INVISIBLE);
+        mskinToneValue = 0;
+        mSkinToneSeekBar = false;
+        Editor editor = mPreferences.edit();
+        editor.putString(CameraSettings.KEY_SKIN_TONE_ENHANCEMENT_FACTOR,
+            Integer.toString(mskinToneValue - MIN_SCE_FACTOR));
+        editor.apply();
+        if(brightnessProgressBar != null)
+             brightnessProgressBar.setVisibility(View.VISIBLE);
+}
+
+/*
+ * Provide a mapping for Jpeg encoding quality levels
+ * from String representation to numeric representation.
+ */
     @Override
     public boolean arePreviewControlsVisible() {
         return mUI.arePreviewControlsVisible();
@@ -2016,13 +2970,141 @@
             }
         }
     }
+}
 
 /* Below is no longer needed, except to get rid of compile error
  * TODO: Remove these
  */
+class JpegEncodingQualityMappings {
+    private static final String TAG = "JpegEncodingQualityMappings";
+    private static final int DEFAULT_QUALITY = 85;
+    private static HashMap<String, Integer> mHashMap =
+            new HashMap<String, Integer>();
 
-    // TODO: Delete this function after old camera code is removed
+    static {
+        mHashMap.put("normal",    CameraProfile.QUALITY_LOW);
+        mHashMap.put("fine",      CameraProfile.QUALITY_MEDIUM);
+        mHashMap.put("superfine", CameraProfile.QUALITY_HIGH);
+    }
+
+    // Retrieve and return the Jpeg encoding quality number
+    // for the given quality level.
+    public static int getQualityNumber(String jpegQuality) {
+        try{
+            int qualityPercentile = Integer.parseInt(jpegQuality);
+            if(qualityPercentile >= 0 && qualityPercentile <=100)
+                return qualityPercentile;
+            else
+                return DEFAULT_QUALITY;
+        } catch(NumberFormatException nfe){
+            //chosen quality is not a number, continue
+        }
+        Integer quality = mHashMap.get(jpegQuality);
+        if (quality == null) {
+            Log.w(TAG, "Unknown Jpeg quality: " + jpegQuality);
+            return DEFAULT_QUALITY;
+        }
+        return CameraProfile.getJpegEncodingQualityParameter(quality.intValue());
+    }
+}
+
+class GraphView extends View {
+    private Bitmap  mBitmap;
+    private Paint   mPaint = new Paint();
+    private Paint   mPaintRect = new Paint();
+    private Canvas  mCanvas = new Canvas();
+    private float   mScale = (float)3;
+    private float   mWidth;
+    private float   mHeight;
+    private PhotoModule mPhotoModule;
+    private CameraManager.CameraProxy mGraphCameraDevice;
+    private float scaled;
+    private static final int STATS_SIZE = 256;
+    private static final String TAG = "GraphView";
+
+
+    public GraphView(Context context, AttributeSet attrs) {
+        super(context,attrs);
+
+        mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
+        mPaintRect.setColor(0xFFFFFFFF);
+        mPaintRect.setStyle(Paint.Style.FILL);
+    }
     @Override
-    public void onRestorePreferencesClicked() {}
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
+        mCanvas.setBitmap(mBitmap);
+        mWidth = w;
+        mHeight = h;
+        super.onSizeChanged(w, h, oldw, oldh);
+    }
+    @Override
+    protected void onDraw(Canvas canvas) {
+        Log.v(TAG, "in Camera.java ondraw");
+        if(mPhotoModule == null || !mPhotoModule.mHiston ) {
+            Log.e(TAG, "returning as histogram is off ");
+            return;
+        }
 
+        if (mBitmap != null) {
+            final Paint paint = mPaint;
+            final Canvas cavas = mCanvas;
+            final float border = 5;
+            float graphheight = mHeight - (2 * border);
+            float graphwidth = mWidth - (2 * border);
+            float left,top,right,bottom;
+            float bargap = 0.0f;
+            float barwidth = graphwidth/STATS_SIZE;
+
+            cavas.drawColor(0xFFAAAAAA);
+            paint.setColor(Color.BLACK);
+
+            for (int k = 0; k <= (graphheight /32) ; k++) {
+                float y = (float)(32 * k)+ border;
+                cavas.drawLine(border, y, graphwidth + border , y, paint);
+            }
+            for (int j = 0; j <= (graphwidth /32); j++) {
+                float x = (float)(32 * j)+ border;
+                cavas.drawLine(x, border, x, graphheight + border, paint);
+            }
+            synchronized(PhotoModule.statsdata) {
+                 //Assumption: The first element contains
+                //            the maximum value.
+                int maxValue = Integer.MIN_VALUE;
+                if ( 0 == PhotoModule.statsdata[0] ) {
+                    for ( int i = 1 ; i <= STATS_SIZE ; i++ ) {
+                         if ( maxValue < PhotoModule.statsdata[i] ) {
+                             maxValue = PhotoModule.statsdata[i];
+                         }
+                    }
+                } else {
+                    maxValue = PhotoModule.statsdata[0];
+                }
+                mScale = ( float ) maxValue;
+                for(int i=1 ; i<=STATS_SIZE ; i++)  {
+                    scaled = (PhotoModule.statsdata[i]/mScale)*STATS_SIZE;
+                    if(scaled >= (float)STATS_SIZE)
+                        scaled = (float)STATS_SIZE;
+                    left = (bargap * (i+1)) + (barwidth * i) + border;
+                    top = graphheight + border;
+                    right = left + barwidth;
+                    bottom = top - scaled;
+                    cavas.drawRect(left, top, right, bottom, mPaintRect);
+                }
+            }
+            canvas.drawBitmap(mBitmap, 0, 0, null);
+        }
+        if (mPhotoModule.mHiston && mPhotoModule!= null) {
+            mGraphCameraDevice = mPhotoModule.getCamera();
+            if (mGraphCameraDevice != null){
+                mGraphCameraDevice.sendHistogramData();
+            }
+        }
+    }
+    public void PreviewChanged() {
+        invalidate();
+    }
+    public void setPhotoModuleObject(PhotoModule photoModule) {
+        mPhotoModule = photoModule;
+    }
 }
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 8308e15..fb5853d 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -19,6 +19,7 @@
 
 import android.app.AlertDialog;
 import android.content.DialogInterface;
+import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.Matrix;
@@ -106,6 +107,7 @@
 
     private int mPreviewWidth = 0;
     private int mPreviewHeight = 0;
+    public boolean mMenuInitialized = false;
     private float mSurfaceTextureUncroppedWidth;
     private float mSurfaceTextureUncroppedHeight;
 
@@ -116,6 +118,10 @@
     private TextureView mTextureView;
     private Matrix mMatrix = null;
     private float mAspectRatio = 4f / 3f;
+    private boolean mAspectRatioResize;
+
+    private boolean mOrientationResize;
+    private boolean mPrevOrientationResize;
     private View mPreviewCover;
     private final Object mSurfaceTextureLock = new Object();
 
@@ -129,10 +135,15 @@
                 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
             int width = right - left;
             int height = bottom - top;
-            if (mPreviewWidth != width || mPreviewHeight != height) {
+            if (mPreviewWidth != width || mPreviewHeight != height
+                    || (mOrientationResize != mPrevOrientationResize)
+                    || mAspectRatioResize) {
                 mPreviewWidth = width;
                 mPreviewHeight = height;
                 setTransformMatrix(width, height);
+                mController.onScreenSizeChanged((int) mSurfaceTextureUncroppedWidth,
+                        (int) mSurfaceTextureUncroppedHeight);
+                mAspectRatioResize = false;
             }
         }
     };
@@ -152,7 +163,7 @@
         protected Bitmap doInBackground(Void... params) {
             // Decode image in background.
             Bitmap bitmap = CameraUtil.downSample(mData, DOWN_SAMPLE_FACTOR);
-            if (mOrientation != 0 || mMirror) {
+            if ((mOrientation != 0 || mMirror) && (bitmap != null)) {
                 Matrix m = new Matrix();
                 if (mMirror) {
                     // Flip horizontally
@@ -218,6 +229,29 @@
         }
         mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls);
         mAnimationManager = new AnimationManager();
+
+        mOrientationResize = false;
+        mPrevOrientationResize = false;
+    }
+
+     public void cameraOrientationPreviewResize(boolean orientation){
+        mPrevOrientationResize = mOrientationResize;
+        mOrientationResize = orientation;
+     }
+
+    public void setAspectRatio(float ratio) {
+        if (ratio <= 0.0) throw new IllegalArgumentException();
+
+        if (mOrientationResize &&
+                mActivity.getResources().getConfiguration().orientation
+                != Configuration.ORIENTATION_PORTRAIT) {
+            ratio = 1 / ratio;
+        }
+
+        Log.d(TAG,"setAspectRatio() ratio["+ratio+"] mAspectRatio["+mAspectRatio+"]");
+        mAspectRatio = ratio;
+        mAspectRatioResize = true;
+        mTextureView.requestLayout();
     }
 
     public void setSurfaceTextureSizeChangedListener(SurfaceTextureSizeChangedListener listener) {
@@ -246,16 +280,26 @@
         mMatrix = mTextureView.getTransform(mMatrix);
         float scaleX = 1f, scaleY = 1f;
         float scaledTextureWidth, scaledTextureHeight;
-        if (width > height) {
-            scaledTextureWidth = Math.max(width,
-                    (int) (height * mAspectRatio));
-            scaledTextureHeight = Math.max(height,
-                    (int)(width / mAspectRatio));
+        if (mOrientationResize){
+            scaledTextureWidth = height * mAspectRatio;
+            if(scaledTextureWidth > width){
+                scaledTextureWidth = width;
+                scaledTextureHeight = scaledTextureWidth / mAspectRatio;
+            } else {
+                scaledTextureHeight = height;
+            }
         } else {
-            scaledTextureWidth = Math.max(width,
-                    (int) (height / mAspectRatio));
-            scaledTextureHeight = Math.max(height,
-                    (int) (width * mAspectRatio));
+            if (width > height) {
+                scaledTextureWidth = Math.max(width,
+                        (int) (height * mAspectRatio));
+                scaledTextureHeight = Math.max(height,
+                        (int)(width / mAspectRatio));
+            } else {
+                scaledTextureWidth = Math.max(width,
+                        (int) (height / mAspectRatio));
+                scaledTextureHeight = Math.max(height,
+                        (int) (width * mAspectRatio));
+            }
         }
 
         if (mSurfaceTextureUncroppedWidth != scaledTextureWidth ||
@@ -341,6 +385,7 @@
             mMenu.setListener(listener);
         }
         mMenu.initialize(prefGroup);
+        mMenuInitialized = true;
 
         if (mZoomRenderer == null) {
             mZoomRenderer = new ZoomRenderer(mActivity);
@@ -516,12 +561,13 @@
     public void hideGpsOnScreenIndicator() { }
 
     public void overrideSettings(final String ... keyvalues) {
+        if (mMenu == null) return;
         mMenu.overrideSettings(keyvalues);
     }
 
     public void updateOnScreenIndicators(Camera.Parameters params,
             PreferenceGroup group, ComboPreferences prefs) {
-        if (params == null) return;
+        if (params == null || group == null) return;
         mOnScreenIndicators.updateSceneOnScreenIndicator(params.getSceneMode());
         mOnScreenIndicators.updateExposureOnScreenIndicator(params,
                 CameraSettings.readExposure(prefs));
@@ -725,6 +771,7 @@
         @Override
         public void onZoomStart() {
             if (mPieRenderer != null) {
+                mPieRenderer.hide();
                 mPieRenderer.setBlockFocus(true);
             }
         }
@@ -770,6 +817,7 @@
                 (ViewGroup) mRootView, true);
         mCountDownView = (CountDownView) (mRootView.findViewById(R.id.count_down_to_capture));
         mCountDownView.setCountDownFinishedListener((OnCountDownFinishedListener) mController);
+        mCountDownView.bringToFront();
     }
 
     public boolean isCountingDown() {
diff --git a/src/com/android/camera/ShutterButton.java b/src/com/android/camera/ShutterButton.java
old mode 100755
new mode 100644
index a1bbb1a..f1d969f
--- a/src/com/android/camera/ShutterButton.java
+++ b/src/com/android/camera/ShutterButton.java
@@ -29,7 +29,18 @@
  */
 public class ShutterButton extends ImageView {
 
+    private class LongClickListener implements View.OnLongClickListener {
+         public boolean onLongClick(View v) {
+             if ( null != mListener ) {
+                 mListener.onShutterButtonLongClick();
+                 return true;
+             }
+             return false;
+         }
+    }
+
     private boolean mTouchEnabled = true;
+    private LongClickListener mLongClick = new LongClickListener();
 
     /**
      * A callback to be invoked when a ShutterButton's pressed state changes.
@@ -42,6 +53,7 @@
          */
         void onShutterButtonFocus(boolean pressed);
         void onShutterButtonClick();
+        void onShutterButtonLongClick();
     }
 
     private OnShutterButtonListener mListener;
@@ -53,6 +65,7 @@
 
     public void setOnShutterButtonListener(OnShutterButtonListener listener) {
         mListener = listener;
+        setOnLongClickListener(mLongClick);
     }
 
     @Override
@@ -66,6 +79,7 @@
 
     public void enableTouch(boolean enable) {
         mTouchEnabled = enable;
+        setLongClickable(enable);
     }
 
     /**
diff --git a/src/com/android/camera/Storage.java b/src/com/android/camera/Storage.java
index b09eeda..29dad8a 100644
--- a/src/com/android/camera/Storage.java
+++ b/src/com/android/camera/Storage.java
@@ -43,6 +43,7 @@
             Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString();
 
     public static final String DIRECTORY = DCIM + "/Camera";
+    public static final String RAW_DIRECTORY = DCIM + "/Camera/raw";
     public static final String JPEG_POSTFIX = ".jpg";
 
     // Match the code in MediaProvider.computeBucketValues().
@@ -63,14 +64,20 @@
         }
     }
 
-    public static void writeFile(String path, byte[] jpeg, ExifInterface exif) {
-        if (exif != null) {
+    public static void writeFile(String path, byte[] jpeg, ExifInterface exif,
+            String mimeType) {
+        if (exif != null && (mimeType == null ||
+            mimeType.equalsIgnoreCase("jpeg"))) {
             try {
                 exif.writeExif(jpeg, path);
             } catch (Exception e) {
                 Log.e(TAG, "Failed to write data", e);
             }
-        } else {
+        } else if (jpeg != null) {
+            if (!(mimeType.equalsIgnoreCase("jpeg") || mimeType == null)) {
+                 File dir = new File(RAW_DIRECTORY);
+                 dir.mkdirs();
+            }
             writeFile(path, jpeg);
         }
     }
@@ -91,22 +98,13 @@
         }
     }
 
-    // Save the image and add it to the MediaStore.
-    public static Uri addImage(ContentResolver resolver, String title, long date,
-            Location location, int orientation, ExifInterface exif, byte[] jpeg, int width,
-            int height) {
-
-        return addImage(resolver, title, date, location, orientation, exif, jpeg, width, height,
-                LocalData.MIME_TYPE_JPEG);
-    }
-
     // Save the image with a given mimeType and add it the MediaStore.
     public static Uri addImage(ContentResolver resolver, String title, long date,
             Location location, int orientation, ExifInterface exif, byte[] jpeg, int width,
             int height, String mimeType) {
 
-        String path = generateFilepath(title);
-        writeFile(path, jpeg, exif);
+        String path = generateFilepath(title, mimeType);
+        writeFile(path, jpeg, exif, mimeType);
         return addImage(resolver, title, date, location, orientation,
                 jpeg.length, path, width, height, mimeType);
     }
@@ -115,12 +113,16 @@
     public static ContentValues getContentValuesForData(String title,
             long date, Location location, int orientation, int jpegLength,
             String path, int width, int height, String mimeType) {
-
-        ContentValues values = new ContentValues(11);
+        // Insert into MediaStore.
+        ContentValues values = new ContentValues(9);
         values.put(ImageColumns.TITLE, title);
-        values.put(ImageColumns.DISPLAY_NAME, title + JPEG_POSTFIX);
+        if (mimeType.equalsIgnoreCase("jpeg") || mimeType == null) {
+            values.put(ImageColumns.DISPLAY_NAME, title + ".jpg");
+        } else {
+            values.put(ImageColumns.DISPLAY_NAME, title + ".raw");
+        }
         values.put(ImageColumns.DATE_TAKEN, date);
-        values.put(ImageColumns.MIME_TYPE, mimeType);
+        values.put(ImageColumns.MIME_TYPE, "image/jpeg");
         // Clockwise rotation in degrees. 0, 90, 180, or 270.
         values.put(ImageColumns.ORIENTATION, orientation);
         values.put(ImageColumns.DATA, path);
@@ -152,8 +154,8 @@
     public static void updateImage(Uri imageUri, ContentResolver resolver, String title, long date,
             Location location, int orientation, ExifInterface exif, byte[] jpeg, int width,
             int height, String mimeType) {
-        String path = generateFilepath(title);
-        writeFile(path, jpeg, exif);
+        String path = generateFilepath(title, mimeType);
+        writeFile(path, jpeg, exif, mimeType);
         updateImage(imageUri, resolver, title, date, location, orientation, jpeg.length, path,
                 width, height, mimeType);
     }
@@ -190,8 +192,12 @@
         }
     }
 
-    public static String generateFilepath(String title) {
-        return DIRECTORY + '/' + title + ".jpg";
+    public static String generateFilepath(String title, String pictureFormat) {
+        if (pictureFormat.equalsIgnoreCase("jpeg") || pictureFormat == null) {
+            return DIRECTORY + '/' + title + ".jpg";
+        } else {
+            return RAW_DIRECTORY + '/' + title + ".raw";
+        }
     }
 
     public static long getAvailableSpace() {
diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java
index f0c7db2..01b9ddb 100644
--- a/src/com/android/camera/VideoMenu.java
+++ b/src/com/android/camera/VideoMenu.java
@@ -36,13 +36,17 @@
     private static String TAG = "CAM_VideoMenu";
 
     private VideoUI mUI;
-    private String[] mOtherKeys;
-    private AbstractSettingPopup mPopup;
+    private String[] mOtherKeys1;
+    private String[] mOtherKeys2;
+
+    private AbstractSettingPopup mPopup1;
+    private AbstractSettingPopup mPopup2;
 
     private static final int POPUP_NONE = 0;
     private static final int POPUP_FIRST_LEVEL = 1;
     private static final int POPUP_SECOND_LEVEL = 2;
     private int mPopupStatus;
+    private int popupNum;
     private CameraActivity mActivity;
 
     public VideoMenu(CameraActivity activity, VideoUI ui, PieRenderer pie) {
@@ -51,37 +55,65 @@
         mActivity = activity;
     }
 
-
     public void initialize(PreferenceGroup group) {
         super.initialize(group);
-        mPopup = null;
+        mPopup1 = null;
+        mPopup2 = null;
+        popupNum = 0;
         mPopupStatus = POPUP_NONE;
         PieItem item = null;
-        // white balance
-        if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
-            item = makeItem(CameraSettings.KEY_WHITE_BALANCE);
-            mRenderer.addItem(item);
-        }
         // settings popup
-        mOtherKeys = new String[] {
+        mOtherKeys1 = new String[] {
+                CameraSettings.KEY_DIS,
                 CameraSettings.KEY_VIDEO_EFFECT,
                 CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL,
                 CameraSettings.KEY_VIDEO_QUALITY,
+                CameraSettings.KEY_VIDEO_ENCODER,
+                CameraSettings.KEY_AUDIO_ENCODER,
+                CameraSettings.KEY_VIDEO_DURATION,
                 CameraSettings.KEY_RECORD_LOCATION
         };
-        item = makeItem(R.drawable.ic_settings_holo_light);
-        item.setLabel(mActivity.getResources().getString(R.string.camera_menu_settings_label));
-        item.setOnClickListener(new OnClickListener() {
+
+       //settings popup
+       mOtherKeys2 = new String[] {
+                CameraSettings.KEY_COLOR_EFFECT,
+                CameraSettings.KEY_VIDEO_HDR,
+                CameraSettings.KEY_POWER_MODE,
+                CameraSettings.KEY_WHITE_BALANCE,
+                CameraSettings.KEY_VIDEO_HIGH_FRAME_RATE,
+                CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE,
+       };
+
+        PieItem item1 = makeItem(R.drawable.ic_settings_holo_light);
+        item1.setLabel(mActivity.getResources().getString(R.string.camera_menu_more_label));
+        item1.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(PieItem item) {
-                if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+                if (mPopup1 == null || mPopupStatus != POPUP_FIRST_LEVEL) {
                     initializePopup();
                     mPopupStatus = POPUP_FIRST_LEVEL;
                 }
-                mUI.showPopup(mPopup);
+                mUI.showPopup(mPopup1);
+                popupNum = 1;
             }
         });
-        mRenderer.addItem(item);
+        mRenderer.addItem(item1);
+
+        PieItem item2 = makeItem(R.drawable.ic_settings_holo_light);
+        item2.setLabel(mActivity.getResources().getString(R.string.camera_menu_more_label));
+        item2.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(PieItem item) {
+                if (mPopup2 == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+                    initializePopup();
+                    mPopupStatus = POPUP_FIRST_LEVEL;
+                }
+                mUI.showPopup(mPopup2);
+                popupNum = 2;
+            }
+        });
+        mRenderer.addItem(item2);
+
         // camera switcher
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeItem(R.drawable.ic_switch_back);
@@ -114,37 +146,38 @@
             });
             mRenderer.addItem(item);
         }
-        // flash
-        if (group.findPreference(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE) != null) {
-            item = makeItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE);
-            mRenderer.addItem(item);
-        }
     }
 
     @Override
     public void reloadPreferences() {
         super.reloadPreferences();
-        if (mPopup != null) {
-            mPopup.reloadPreference();
+        if (mPopup1 != null) {
+            mPopup1.reloadPreference();
+        }
+        if (mPopup2 != null) {
+            mPopup2.reloadPreference();
         }
     }
 
     @Override
     public void overrideSettings(final String ... keyvalues) {
         super.overrideSettings(keyvalues);
-        if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+        if (((mPopup1 == null) && (mPopup2 == null)) || mPopupStatus != POPUP_FIRST_LEVEL) {
             mPopupStatus = POPUP_FIRST_LEVEL;
             initializePopup();
         }
-        ((MoreSettingPopup) mPopup).overrideSettings(keyvalues);
+        ((MoreSettingPopup) mPopup1).overrideSettings(keyvalues);
+        ((MoreSettingPopup) mPopup2).overrideSettings(keyvalues);
     }
 
     @Override
     // Hit when an item in the second-level popup gets selected
     public void onListPrefChanged(ListPreference pref) {
-        if (mPopup != null) {
+        if (mPopup1 != null && mPopup2 != null) {
             if (mPopupStatus == POPUP_SECOND_LEVEL) {
                 mUI.dismissPopup(true);
+                mPopup1.reloadPreference();
+                mPopup2.reloadPreference();
             }
         }
         super.onSettingChanged(pref);
@@ -154,15 +187,21 @@
         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
 
-        MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate(
+        MoreSettingPopup popup1 = (MoreSettingPopup) inflater.inflate(
                 R.layout.more_setting_popup, null, false);
-        popup.setSettingChangedListener(this);
-        popup.initialize(mPreferenceGroup, mOtherKeys);
+        popup1.setSettingChangedListener(this);
+        popup1.initialize(mPreferenceGroup, mOtherKeys1);
         if (mActivity.isSecureCamera()) {
             // Prevent location preference from getting changed in secure camera mode
-            popup.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false);
+            popup1.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false);
         }
-        mPopup = popup;
+        mPopup1 = popup1;
+
+        MoreSettingPopup popup2 = (MoreSettingPopup) inflater.inflate(
+                R.layout.more_setting_popup, null, false);
+        popup2.setSettingChangedListener(this);
+        popup2.initialize(mPreferenceGroup, mOtherKeys2);
+        mPopup2 = popup2;
     }
 
     public void popupDismissed(boolean topPopupOnly) {
@@ -170,7 +209,12 @@
         if (mPopupStatus == POPUP_SECOND_LEVEL) {
             initializePopup();
             mPopupStatus = POPUP_FIRST_LEVEL;
-            if (topPopupOnly) mUI.showPopup(mPopup);
+            if (topPopupOnly) {
+                if(popupNum == 1) mUI.showPopup(mPopup1);
+                else if(popupNum == 2) mUI.showPopup(mPopup2);
+            }
+        } else {
+            initializePopup();
         }
     }
 
@@ -189,16 +233,17 @@
             timeInterval.initialize((IconListPreference) pref);
             timeInterval.setSettingChangedListener(this);
             mUI.dismissPopup(true);
-            mPopup = timeInterval;
+            mPopup1 = timeInterval;
         } else {
             ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
                     R.layout.list_pref_setting_popup, null, false);
             basic.initialize(pref);
             basic.setSettingChangedListener(this);
             mUI.dismissPopup(true);
-            mPopup = basic;
+            mPopup1 = basic;
         }
-        mUI.showPopup(mPopup);
+        mUI.showPopup(mPopup1);
         mPopupStatus = POPUP_SECOND_LEVEL;
     }
+
 }
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 0ee62bb..f8f4167 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -29,6 +29,7 @@
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.SurfaceTexture;
+import android.graphics.ImageFormat;
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
@@ -41,6 +42,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.SystemProperties;
 import android.os.ParcelFileDescriptor;
 import android.os.SystemClock;
 import android.provider.MediaStore;
@@ -63,13 +65,14 @@
 import com.android.camera.util.CameraUtil;
 import com.android.camera.util.UsageStatistics;
 import com.android.camera2.R;
-
+import com.android.camera.PhotoModule;
 import java.io.File;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.HashMap;
 
 public class VideoModule implements CameraModule,
     VideoController,
@@ -172,6 +175,12 @@
 
     private int mZoomValue;  // The current zoom value.
 
+    private boolean mStartRecPending = false;
+    private boolean mStopRecPending = false;
+    private boolean mStartPrevPending = false;
+    private boolean mStopPrevPending = false;
+
+
     private final MediaSaveService.OnMediaSavedListener mOnVideoSavedListener =
             new MediaSaveService.OnMediaSavedListener() {
                 @Override
@@ -214,8 +223,82 @@
             return;
         }
         mParameters = mCameraDevice.getParameters();
+        String sceneMode = mParameters.getSceneMode();
+        if ((null != sceneMode) && (!sceneMode.equals(Parameters.SCENE_MODE_AUTO))){
+            if (CameraUtil.isSupported(Parameters.SCENE_MODE_AUTO,
+                                           mParameters.getSupportedSceneModes())){
+                mParameters.setSceneMode(Parameters.SCENE_MODE_AUTO);
+            }
+        }
     }
 
+    //QCOM data Members Starts here
+    static class DefaultHashMap<K, V> extends HashMap<K, V> {
+        private V mDefaultValue;
+
+        public void putDefault(V defaultValue) {
+            mDefaultValue = defaultValue;
+        }
+
+        @Override
+        public V get(Object key) {
+            V value = super.get(key);
+            return (value == null) ? mDefaultValue : value;
+        }
+        public K getKey(V toCheck) {
+            Iterator<K> it = this.keySet().iterator();
+            V val;
+            K key;
+            while(it.hasNext()) {
+                key = it.next();
+                val = this.get(key);
+                if (val.equals(toCheck)) {
+                    return key;
+                }
+            }
+        return null;
+        }
+    }
+
+
+    private static final DefaultHashMap<String, Integer>
+            OUTPUT_FORMAT_TABLE = new DefaultHashMap<String, Integer>();
+    private static final DefaultHashMap<String, Integer>
+            VIDEO_ENCODER_TABLE = new DefaultHashMap<String, Integer>();
+    private static final DefaultHashMap<String, Integer>
+            AUDIO_ENCODER_TABLE = new DefaultHashMap<String, Integer>();
+    private static final DefaultHashMap<String, Integer>
+            VIDEOQUALITY_BITRATE_TABLE = new DefaultHashMap<String, Integer>();
+
+    static {
+        OUTPUT_FORMAT_TABLE.put("3gp", MediaRecorder.OutputFormat.THREE_GPP);
+        OUTPUT_FORMAT_TABLE.put("mp4", MediaRecorder.OutputFormat.MPEG_4);
+        OUTPUT_FORMAT_TABLE.putDefault(MediaRecorder.OutputFormat.DEFAULT);
+
+        VIDEO_ENCODER_TABLE.put("h263", MediaRecorder.VideoEncoder.H263);
+        VIDEO_ENCODER_TABLE.put("h264", MediaRecorder.VideoEncoder.H264);
+        VIDEO_ENCODER_TABLE.put("m4v", MediaRecorder.VideoEncoder.MPEG_4_SP);
+        VIDEO_ENCODER_TABLE.putDefault(MediaRecorder.VideoEncoder.DEFAULT);
+
+        AUDIO_ENCODER_TABLE.put("amrnb", MediaRecorder.AudioEncoder.AMR_NB);
+        // Enabled once support is added in MediaRecorder.
+        // AUDIO_ENCODER_TABLE.put("qcelp", MediaRecorder.AudioEncoder.QCELP);
+        // AUDIO_ENCODER_TABLE.put("evrc", MediaRecorder.AudioEncoder.EVRC);
+        AUDIO_ENCODER_TABLE.put("amrwb", MediaRecorder.AudioEncoder.AMR_WB);
+        AUDIO_ENCODER_TABLE.put("aac", MediaRecorder.AudioEncoder.AAC);
+        AUDIO_ENCODER_TABLE.putDefault(MediaRecorder.AudioEncoder.DEFAULT);
+
+    }
+
+    private int mVideoEncoder;
+    private int mAudioEncoder;
+    private boolean mRestartPreview = false;
+    private int videoWidth;
+    private int videoHeight;
+    boolean mUnsupportedResolution = false;
+    private boolean mUnsupportedHFRVideoSize = false;
+    private boolean mUnsupportedHFRVideoCodec = false;
+
     // This Handler is used to post message back onto the main thread of the
     // application
     private class MainHandler extends Handler {
@@ -435,6 +518,11 @@
 
         if (mOrientation != newOrientation) {
             mOrientation = newOrientation;
+            Log.v(TAG, "onOrientationChanged, update parameters");
+            if ((mParameters != null) && (true == mPreviewing)){
+                setCameraParameters();
+            }
+
         }
 
         // Show the toast after getting the first orientation changed.
@@ -520,12 +608,32 @@
         // Consume clicks
     }
 
+    public boolean isPreviewReady() {
+        if ((mStartPrevPending == true || mStopPrevPending == true))
+            return false;
+        else
+            return true;
+    }
+
+    public boolean isRecorderReady() {
+        if ((mStartRecPending == true || mStopRecPending == true))
+            return false;
+        else
+            return true;
+    }
+
     @Override
     public void onShutterButtonClick() {
         if (mUI.collapseCameraControls() || mSwitchingCamera) return;
 
         boolean stop = mMediaRecorderRecording;
 
+        if (isPreviewReady() == false)
+            return;
+
+        if (isRecorderReady() == false)
+            return;
+
         if (stop) {
             onStopVideoRecording();
         } else {
@@ -547,15 +655,67 @@
         mUI.setShutterPressed(pressed);
     }
 
+    @Override
+    public void onShutterButtonLongClick() {}
+
+    private void qcomReadVideoPreferences() {
+        String videoEncoder = mPreferences.getString(
+               CameraSettings.KEY_VIDEO_ENCODER,
+               mActivity.getString(R.string.pref_camera_videoencoder_default));
+        mVideoEncoder = VIDEO_ENCODER_TABLE.get(videoEncoder);
+
+        Log.v(TAG, "Video Encoder selected = " +mVideoEncoder);
+
+        String audioEncoder = mPreferences.getString(
+               CameraSettings.KEY_AUDIO_ENCODER,
+               mActivity.getString(R.string.pref_camera_audioencoder_default));
+        mAudioEncoder = AUDIO_ENCODER_TABLE.get(audioEncoder);
+
+        Log.v(TAG, "Audio Encoder selected = " +mAudioEncoder);
+
+        String minutesStr = mPreferences.getString(
+              CameraSettings.KEY_VIDEO_DURATION,
+              mActivity.getString(R.string.pref_camera_video_duration_default));
+        int minutes = -1;
+        try {
+            minutes = Integer.parseInt(minutesStr);
+        } catch(NumberFormatException npe) {
+            // use default value continue
+            minutes = Integer.parseInt(mActivity.getString(
+                         R.string.pref_camera_video_duration_default));
+        }
+        if (minutes == -1) {
+            // User wants lowest, set 30s */
+            mMaxVideoDurationInMs = 30000;
+        } else {
+            // 1 minute = 60000ms
+            mMaxVideoDurationInMs = 60000 * minutes;
+        }
+
+        if(mParameters.isPowerModeSupported()) {
+            String powermode = mPreferences.getString(
+                    CameraSettings.KEY_POWER_MODE,
+                    mActivity.getString(R.string.pref_camera_powermode_default));
+            Log.v(TAG, "read videopreferences power mode =" +powermode);
+            String old_mode = mParameters.getPowerMode();
+            if(!old_mode.equals(powermode) && mPreviewing)
+                mRestartPreview = true;
+
+            mParameters.setPowerMode(powermode);
+        }
+   }
+
     private void readVideoPreferences() {
         // The preference stores values from ListPreference and is thus string type for all values.
         // We need to convert it to int manually.
         String videoQuality = mPreferences.getString(CameraSettings.KEY_VIDEO_QUALITY,
                         null);
         if (videoQuality == null) {
+             mParameters = mCameraDevice.getParameters();
             // check for highest quality before setting default value
             videoQuality = CameraSettings.getSupportedHighestVideoQuality(mCameraId,
-                    mActivity.getResources().getString(R.string.pref_video_quality_default));
+                    mActivity.getResources().getString(R.string.pref_video_quality_default),
+                                                       mParameters);
             mPreferences.edit().putString(CameraSettings.KEY_VIDEO_QUALITY, videoQuality);
         }
         int quality = Integer.valueOf(videoQuality);
@@ -592,6 +752,7 @@
         if (mCaptureTimeLapse) quality += 1000;
         mProfile = CamcorderProfile.get(mCameraId, quality);
         getDesiredPreviewSize();
+        qcomReadVideoPreferences();
         mPreferenceRead = true;
     }
 
@@ -626,7 +787,19 @@
                 ". mDesiredPreviewHeight=" + mDesiredPreviewHeight);
     }
 
-    private void resizeForPreviewAspectRatio() {
+    void setPreviewFrameLayoutCameraOrientation(){
+        CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+
+        //if camera mount angle is 0 or 180, we want to resize preview
+        if (info.orientation % 180 == 0)
+            mUI.cameraOrientationPreviewResize(true);
+        else
+            mUI.cameraOrientationPreviewResize(false);
+    }
+
+    @Override
+    public void resizeForPreviewAspectRatio() {
+        setPreviewFrameLayoutCameraOrientation();
         mUI.setAspectRatio(
                 (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
     }
@@ -721,10 +894,12 @@
 
     private void startPreview() {
         Log.v(TAG, "startPreview");
+        mStartPrevPending = true;
 
         SurfaceTexture surfaceTexture = mUI.getSurfaceTexture();
         if (!mPreferenceRead || surfaceTexture == null || mPaused == true ||
                 mCameraDevice == null) {
+            mStartPrevPending = false;
             return;
         }
 
@@ -746,6 +921,7 @@
             closeCamera();
             throw new RuntimeException("startPreview failed", ex);
         }
+        mStartPrevPending = false;
     }
 
     private void onPreviewStarted() {
@@ -754,9 +930,15 @@
 
     @Override
     public void stopPreview() {
-        if (!mPreviewing) return;
+        mStopPrevPending = true;
+
+        if (!mPreviewing) {
+            mStopPrevPending = false;
+            return;
+        }
         mCameraDevice.stopPreview();
         mPreviewing = false;
+        mStopPrevPending = false;
     }
 
     private void closeCamera() {
@@ -946,6 +1128,19 @@
         Intent intent = mActivity.getIntent();
         Bundle myExtras = intent.getExtras();
 
+        videoWidth = mProfile.videoFrameWidth;
+        videoHeight = mProfile.videoFrameHeight;
+        mUnsupportedResolution = false;
+
+        if (mVideoEncoder == MediaRecorder.VideoEncoder.H263) {
+            if (videoWidth >= 1280 && videoHeight >= 720) {
+                    mUnsupportedResolution = true;
+                    Toast.makeText(mActivity, R.string.error_app_unsupported,
+                    Toast.LENGTH_LONG).show();
+                    return;
+            }
+        }
+
         long requestedSizeLimit = 0;
         closeVideoFileDescriptor();
         mCurrentVideoUriFromMediaSaved = false;
@@ -969,10 +1164,19 @@
         // Unlock the camera object before passing it to media recorder.
         mCameraDevice.unlock();
         mMediaRecorder.setCamera(mCameraDevice.getCamera());
-        if (!mCaptureTimeLapse) {
+        String hfr = mParameters.getVideoHighFrameRate();
+        if (!mCaptureTimeLapse && ((hfr == null) || ("off".equals(hfr)))) {
             mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
+            mProfile.audioCodec = mAudioEncoder;
+        } else {
+            mProfile.audioCodec = -1; //not set
         }
+
         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+
+        mProfile.videoCodec = mVideoEncoder;
+        mProfile.duration = mMaxVideoDurationInMs;
+
         mMediaRecorder.setProfile(mProfile);
         mMediaRecorder.setMaxDuration(mMaxVideoDurationInMs);
         if (mCaptureTimeLapse) {
@@ -1170,22 +1374,44 @@
 
     private void startVideoRecording() {
         Log.v(TAG, "startVideoRecording");
+        mStartRecPending = true;
         mUI.cancelAnimations();
         mUI.setSwipingEnabled(false);
 
         mActivity.updateStorageSpaceAndHint();
         if (mActivity.getStorageSpaceBytes() <= Storage.LOW_STORAGE_THRESHOLD_BYTES) {
             Log.v(TAG, "Storage issue, ignore the start request");
+            mStartRecPending = false;
             return;
         }
 
+        if( mUnsupportedHFRVideoSize == true) {
+            Log.e(TAG, "Unsupported HFR and video size combinations");
+            Toast.makeText(mActivity,R.string.error_app_unsupported_hfr, Toast.LENGTH_SHORT).show();
+            mStartRecPending = false;
+            return;
+        }
+
+        if( mUnsupportedHFRVideoCodec == true) {
+            Log.e(TAG, "Unsupported HFR and video codec combinations");
+            Toast.makeText(mActivity, R.string.error_app_unsupported_hfr_codec,
+            Toast.LENGTH_SHORT).show();
+            mStartRecPending = false;
+            return;
+        }
         //??
         //if (!mCameraDevice.waitDone()) return;
         mCurrentVideoUri = null;
 
         initializeRecorder();
+        if (mUnsupportedResolution == true) {
+              Log.v(TAG, "Unsupported Resolution according to target");
+              mStartRecPending = false;
+              return;
+        }
         if (mMediaRecorder == null) {
             Log.e(TAG, "Fail to initialize media recorder");
+            mStartRecPending = false;
             return;
         }
 
@@ -1198,6 +1424,7 @@
             releaseMediaRecorder();
             // If start fails, frameworks will not lock the camera for us.
             mCameraDevice.lock();
+            mStartRecPending = false;
             return;
         }
 
@@ -1226,6 +1453,7 @@
         keepScreenOn();
         UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
                 UsageStatistics.ACTION_CAPTURE_START, "Video");
+        mStartRecPending = false;
     }
 
     private Bitmap getVideoThumbnail() {
@@ -1267,6 +1495,7 @@
 
     private boolean stopVideoRecording() {
         Log.v(TAG, "stopVideoRecording");
+        mStopRecPending = true;
         mUI.setSwipingEnabled(true);
         if (!isVideoCaptureIntent()) {
             mUI.showSwitcher();
@@ -1336,6 +1565,7 @@
                 fail ? UsageStatistics.ACTION_CAPTURE_FAIL :
                     UsageStatistics.ACTION_CAPTURE_DONE, "Video",
                     SystemClock.uptimeMillis() - mRecordingStartTime);
+        mStopRecPending = false;
         return fail;
     }
 
@@ -1460,8 +1690,127 @@
         return supported == null ? false : supported.indexOf(value) >= 0;
     }
 
+     private void qcomSetCameraParameters(){
+        // add QCOM Parameters here
+        // Set color effect parameter.
+        String colorEffect = mPreferences.getString(
+            CameraSettings.KEY_COLOR_EFFECT,
+            mActivity.getString(R.string.pref_camera_coloreffect_default));
+        Log.v(TAG, "Color effect value =" + colorEffect);
+        if (isSupported(colorEffect, mParameters.getSupportedColorEffects())) {
+            mParameters.setColorEffect(colorEffect);
+        }
+
+        String disMode = mPreferences.getString(
+                CameraSettings.KEY_DIS,
+                mActivity.getString(R.string.pref_camera_dis_default));
+        Log.v(TAG, "DIS value =" + disMode);
+        if (isSupported(disMode,
+                        CameraSettings.getSupportedDISModes(mParameters))) {
+            mParameters.set(CameraSettings.KEY_QC_DIS_MODE, disMode);
+        }
+
+        mUnsupportedHFRVideoSize = false;
+        mUnsupportedHFRVideoCodec = false;
+        // To set preview format as YV12 , run command
+        // "adb shell setprop "debug.camera.yv12" true"
+        String yv12formatset = SystemProperties.get("debug.camera.yv12");
+        if(yv12formatset.equals("true")) {
+            Log.v(TAG, "preview format set to YV12");
+            mParameters.setPreviewFormat (ImageFormat.YV12);
+        }
+
+        // Set High Frame Rate.
+        String HighFrameRate = mPreferences.getString(
+            CameraSettings.KEY_VIDEO_HIGH_FRAME_RATE,
+            mActivity. getString(R.string.pref_camera_hfr_default));
+        if(!("off".equals(HighFrameRate))){
+            mUnsupportedHFRVideoSize = true;
+            String hfrsize = videoWidth+"x"+videoHeight;
+            Log.v(TAG, "current set resolution is : "+hfrsize);
+            try {
+                for(Size size :  mParameters.getSupportedHfrSizes()){
+                    if(size != null) {
+                        Log.v(TAG, "supported hfr size : "+ size.width+ " "+size.height);
+                        if(videoWidth <= size.width && videoHeight <= size.height) {
+                            mUnsupportedHFRVideoSize = false;
+                            Log.v(TAG,"Current hfr resolution is supported");
+                            break;
+                        }
+                    }
+                }
+            } catch (NullPointerException e){
+                Log.e(TAG, "supported hfr sizes is null");
+            }
+
+            if(mUnsupportedHFRVideoSize)
+                Log.v(TAG,"Unsupported hfr resolution");
+
+            if(mVideoEncoder != MediaRecorder.VideoEncoder.H264)
+                mUnsupportedHFRVideoCodec = true;
+        }
+        if (isSupported(HighFrameRate,
+                mParameters.getSupportedVideoHighFrameRateModes()) &&
+                !mUnsupportedHFRVideoSize) {
+            mParameters.setVideoHighFrameRate(HighFrameRate);
+            } else
+            mParameters.setVideoHighFrameRate("off");
+
+        // Read Flip mode from adb command
+        //value: 0(default) - FLIP_MODE_OFF
+        //value: 1 - FLIP_MODE_H
+        //value: 2 - FLIP_MODE_V
+        //value: 3 - FLIP_MODE_VH
+        int preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0);
+        int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0);
+        int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0);
+        int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation);
+        mParameters.setRotation(rotation);
+        if (rotation == 90 || rotation == 270) {
+            // in case of 90 or 270 degree, V/H flip should reverse
+            if (preview_flip_value == 1) {
+                preview_flip_value = 2;
+            } else if (preview_flip_value == 2) {
+                preview_flip_value = 1;
+            }
+            if (video_flip_value == 1) {
+                video_flip_value = 2;
+            } else if (video_flip_value == 2) {
+                video_flip_value = 1;
+            }
+            if (picture_flip_value == 1) {
+                picture_flip_value = 2;
+            } else if (picture_flip_value == 2) {
+                picture_flip_value = 1;
+            }
+        }
+        String preview_flip = CameraUtil.getFilpModeString(preview_flip_value);
+        String video_flip = CameraUtil.getFilpModeString(video_flip_value);
+        String picture_flip = CameraUtil.getFilpModeString(picture_flip_value);
+
+        if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip);
+        }
+        if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip);
+        }
+        if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){
+            mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);
+        }
+
+        // Set Video HDR.
+        String videoHDR = mPreferences.getString(
+                CameraSettings.KEY_VIDEO_HDR,
+                mActivity.getString(R.string.pref_camera_video_hdr_default));
+        Log.v(TAG, "Video HDR Setting =" + videoHDR);
+        if (isSupported(videoHDR, mParameters.getSupportedVideoHDRModes())) {
+             mParameters.setVideoHDRMode(videoHDR);
+        } else
+             mParameters.setVideoHDRMode("off");
+    }
     @SuppressWarnings("deprecation")
     private void setCameraParameters() {
+        Log.d(TAG,"Preview dimension in App->"+mDesiredPreviewWidth+"X"+mDesiredPreviewHeight);
         mParameters.setPreviewSize(mDesiredPreviewWidth, mDesiredPreviewHeight);
         int[] fpsRange = CameraUtil.getMaxPreviewFpsRange(mParameters);
         if (fpsRange.length > 0) {
@@ -1473,7 +1822,11 @@
         }
 
         forceFlashOffIfSupported(!mUI.isVisible());
-
+        videoWidth = mProfile.videoFrameWidth;
+        videoHeight = mProfile.videoFrameHeight;
+        String recordSize = videoWidth + "x" + videoHeight;
+        Log.e(TAG,"Video dimension in App->"+recordSize);
+        mParameters.set("video-size", recordSize);
         // Set white balance parameter.
         String whiteBalance = mPreferences.getString(
                 CameraSettings.KEY_WHITE_BALANCE,
@@ -1490,6 +1843,8 @@
 
         // Set zoom.
         if (mParameters.isZoomSupported()) {
+            Parameters p = mCameraDevice.getParameters();
+            mZoomValue = p.getZoom();
             mParameters.setZoom(mZoomValue);
         }
 
@@ -1526,7 +1881,8 @@
         int jpegQuality = CameraProfile.getJpegEncodingQualityParameter(mCameraId,
                 CameraProfile.QUALITY_HIGH);
         mParameters.setJpegQuality(jpegQuality);
-
+        //Call Qcom related Camera Parameters
+        qcomSetCameraParameters();
         mCameraDevice.setParameters(mParameters);
         // Keep preview size up to date.
         mParameters = mCameraDevice.getParameters();
@@ -1544,6 +1900,7 @@
     public void onConfigurationChanged(Configuration newConfig) {
         Log.v(TAG, "onConfigurationChanged");
         setDisplayOrientation();
+        resizeForPreviewAspectRatio();
     }
 
     @Override
@@ -1575,7 +1932,7 @@
             // We need to restart the preview if preview size is changed.
             Size size = mParameters.getPreviewSize();
             if (size.width != mDesiredPreviewWidth
-                    || size.height != mDesiredPreviewHeight) {
+                    || size.height != mDesiredPreviewHeight || mRestartPreview) {
 
                 stopPreview();
                 resizeForPreviewAspectRatio();
@@ -1583,6 +1940,7 @@
             } else {
                 setCameraParameters();
             }
+            mRestartPreview = false;
             mUI.updateOnScreenIndicators(mParameters, mPreferences);
         }
     }
@@ -1730,10 +2088,11 @@
         String title = CameraUtil.createJpegName(dateTaken);
         ExifInterface exif = Exif.getExif(data);
         int orientation = Exif.getOrientation(exif);
-
+        Size s = mParameters.getPictureSize();
         mActivity.getMediaSaveService().addImage(
-                data, title, dateTaken, loc, orientation,
-                exif, mOnPhotoSavedListener, mContentResolver);
+                data, title, dateTaken, loc, s.width, s.height, orientation,
+                exif, mOnPhotoSavedListener, mContentResolver,
+                PhotoModule.PIXEL_FORMAT_JPEG);
     }
 
     private String convertOutputFormatToMimeType(int outputFileFormat) {
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index a8819e0..bb270b7 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -16,6 +16,7 @@
 
 package com.android.camera;
 
+import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.Matrix;
@@ -92,6 +93,8 @@
     private List<Integer> mZoomRatios;
     private View mPreviewThumb;
     private View mFlashOverlay;
+    private boolean mOrientationResize;
+    private boolean mPrevOrientationResize;
 
     private View mPreviewCover;
     private SurfaceView mSurfaceView = null;
@@ -100,6 +103,7 @@
     private float mSurfaceTextureUncroppedWidth;
     private float mSurfaceTextureUncroppedHeight;
     private float mAspectRatio = 4f / 3f;
+    private boolean mAspectRatioResize;
     private Matrix mMatrix = null;
     private final AnimationManager mAnimationManager;
     private final Handler mHandler = new Handler() {
@@ -127,10 +131,13 @@
                 w = height;
                 h = width;
             }
-            if (mPreviewWidth != width || mPreviewHeight != height) {
+            if (mPreviewWidth != width || mPreviewHeight != height
+                    || (mOrientationResize != mPrevOrientationResize)
+                    || (mAspectRatioResize)) {
                 mPreviewWidth = width;
                 mPreviewHeight = height;
                 onScreenSizeChanged(width, height, w, h);
+                mAspectRatioResize = false;
             }
         }
     };
@@ -186,8 +193,14 @@
         initializeControlByIntent();
         initializeOverlay();
         mAnimationManager = new AnimationManager();
+        mOrientationResize = false;
+        mPrevOrientationResize = false;
     }
 
+    public void cameraOrientationPreviewResize(boolean orientation){
+       mPrevOrientationResize = mOrientationResize;
+       mOrientationResize = orientation;
+    }
 
     public void initializeSurfaceView() {
         mSurfaceView = new SurfaceView(mActivity);
@@ -247,10 +260,21 @@
             Log.w(TAG, "Preview size should not be 0.");
             return;
         }
+        float ratio;
         if (width > height) {
-            mAspectRatio = (float) width / height;
+            ratio = (float) width / height;
         } else {
-            mAspectRatio = (float) height / width;
+            ratio = (float) height / width;
+        }
+        if (mOrientationResize &&
+                mActivity.getResources().getConfiguration().orientation
+                != Configuration.ORIENTATION_PORTRAIT) {
+            ratio = 1 / ratio;
+        }
+
+        if (ratio != mAspectRatio){
+            mAspectRatioResize = true;
+            mAspectRatio = ratio;
         }
         mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
     }
@@ -272,16 +296,26 @@
         int orientation = CameraUtil.getDisplayRotation(mActivity);
         float scaleX = 1f, scaleY = 1f;
         float scaledTextureWidth, scaledTextureHeight;
-        if (width > height) {
-            scaledTextureWidth = Math.max(width,
-                    (int) (height * mAspectRatio));
-            scaledTextureHeight = Math.max(height,
-                    (int)(width / mAspectRatio));
+        if (mOrientationResize){
+            if (width/mAspectRatio > height){
+                scaledTextureHeight = height;
+                scaledTextureWidth = (int)(height * mAspectRatio + 0.5f);
+            } else {
+                scaledTextureWidth = width;
+                scaledTextureHeight = (int)(width / mAspectRatio + 0.5f);
+            }
         } else {
-            scaledTextureWidth = Math.max(width,
-                    (int) (height / mAspectRatio));
-            scaledTextureHeight = Math.max(height,
-                    (int) (width * mAspectRatio));
+            if (width > height) {
+                scaledTextureWidth = Math.max(width,
+                        (int) (height * mAspectRatio));
+                scaledTextureHeight = Math.max(height,
+                        (int)(width / mAspectRatio));
+            } else {
+                scaledTextureWidth = Math.max(width,
+                        (int) (height / mAspectRatio));
+                scaledTextureHeight = Math.max(height,
+                        (int) (width * mAspectRatio));
+            }
         }
 
         if (mSurfaceTextureUncroppedWidth != scaledTextureWidth ||
@@ -489,7 +523,18 @@
     }
 
     public void setAspectRatio(double ratio) {
-      //  mPreviewFrameLayout.setAspectRatio(ratio);
+        if (mOrientationResize &&
+                mActivity.getResources().getConfiguration().orientation
+                != Configuration.ORIENTATION_PORTRAIT) {
+            ratio = 1 / ratio;
+        }
+
+        if (ratio != mAspectRatio){
+            mAspectRatioResize = true;
+            mAspectRatio = (float)ratio;
+        }
+        mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
+
     }
 
     public void showTimeLapseUI(boolean enable) {
@@ -705,10 +750,17 @@
 
         @Override
         public void onZoomStart() {
+            if (mPieRenderer != null) {
+                if (!mRecordingStarted) mPieRenderer.hide();
+                mPieRenderer.setBlockFocus(true);
+            }
         }
 
         @Override
         public void onZoomEnd() {
+            if (mPieRenderer != null) {
+                mPieRenderer.setBlockFocus(false);
+            }
         }
     }
 
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index 34b3071..85f983e 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -43,7 +43,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
-
+import com.android.camera.PhotoModule;
 import com.android.camera.CameraManager.CameraProxy;
 import com.android.camera.app.OrientationManager;
 import com.android.camera.data.LocalData;
@@ -130,6 +130,7 @@
     private int mDeviceOrientation;
     private int mDeviceOrientationAtCapture;
     private int mCameraOrientation;
+    private int mPanoAngle;
     private int mOrientationCompensation;
 
     private SoundClips.Player mSoundPlayer;
@@ -329,6 +330,13 @@
             return false;
         }
         Parameters parameters = mCameraDevice.getParameters();
+        String sceneMode = parameters.getSceneMode();
+        if ((null != sceneMode) && (!sceneMode.equals(Parameters.SCENE_MODE_AUTO))){
+            if (CameraUtil.isSupported(Parameters.SCENE_MODE_AUTO,
+                                           parameters.getSupportedSceneModes())){
+                parameters.setSceneMode(Parameters.SCENE_MODE_AUTO);
+            }
+        }
         setupCaptureParams(parameters);
         configureCamera(parameters);
         return true;
@@ -482,9 +490,24 @@
     @Override
     public void onPreviewUILayoutChange(int l, int t, int r, int b) {
         Log.d(TAG, "layout change: " + (r - l) + "/" + (b - t));
+        boolean capturePending = false;
+        if (mCaptureState == CAPTURE_STATE_MOSAIC){
+            capturePending = true;
+        }
         mPreviewUIWidth = r - l;
         mPreviewUIHeight = b - t;
         configMosaicPreview();
+        if (capturePending == true){
+            mMainHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    if (!mPaused){
+                        mMainHandler.removeMessages(MSG_RESET_TO_PREVIEW);
+                        startCapture();
+                    }
+                }
+            });
+        }
     }
 
     @Override
@@ -641,9 +664,9 @@
         if (mUsingFrontCamera) {
             // mCameraOrientation is negative with respect to the front facing camera.
             // See document of android.hardware.Camera.Parameters.setRotation.
-            orientation = (mDeviceOrientationAtCapture - mCameraOrientation + 360) % 360;
+            orientation = (mDeviceOrientationAtCapture - mCameraOrientation - mPanoAngle + 360) % 360;
         } else {
-            orientation = (mDeviceOrientationAtCapture + mCameraOrientation) % 360;
+            orientation = (mDeviceOrientationAtCapture + mCameraOrientation - mPanoAngle) % 360;
         }
         return orientation;
     }
@@ -742,7 +765,8 @@
         if (jpegData != null) {
             String filename = PanoUtil.createName(
                     mActivity.getResources().getString(R.string.pano_file_name_format), mTimeTaken);
-            String filepath = Storage.generateFilepath(filename);
+            String filepath = Storage.generateFilepath(filename,
+                              PhotoModule.PIXEL_FORMAT_JPEG);
 
             UsageStatistics.onEvent(UsageStatistics.COMPONENT_PANORAMA,
                     UsageStatistics.ACTION_CAPTURE_DONE, null, 0,
@@ -854,6 +878,10 @@
     }
 
     @Override
+    public void resizeForPreviewAspectRatio() {
+    }
+
+    @Override
     public void onResumeBeforeSuper() {
         mPaused = false;
     }
@@ -976,8 +1004,13 @@
             // Set the display orientation to 0, so that the underlying mosaic
             // library can always get undistorted mCameraPreviewWidth x mCameraPreviewHeight
             // image data from SurfaceTexture.
-            mCameraDevice.setDisplayOrientation(0);
+            // as Panoroma will add 90 degree rotation compensation during
+            // postprocessing, we need to consider both camera mount angle and
+            // this compensation angle
+            mPanoAngle = (mCameraOrientation - 90 + 360) % 360;
+            mCameraDevice.setDisplayOrientation(mPanoAngle);
 
+            if (mCameraTexture != null)
             mCameraTexture.setOnFrameAvailableListener(this);
             mCameraDevice.setPreviewTexture(mCameraTexture);
         }
diff --git a/src/com/android/camera/WideAnglePanoramaUI.java b/src/com/android/camera/WideAnglePanoramaUI.java
index 268c82b..2cf2757 100644
--- a/src/com/android/camera/WideAnglePanoramaUI.java
+++ b/src/com/android/camera/WideAnglePanoramaUI.java
@@ -321,6 +321,9 @@
     }
 
     @Override
+    public void onShutterButtonLongClick() {}
+
+    @Override
     public void onLayoutChange(
             View v, int l, int t, int r, int b,
             int oldl, int oldt, int oldr, int oldb) {
diff --git a/src/com/android/camera/tinyplanet/TinyPlanetFragment.java b/src/com/android/camera/tinyplanet/TinyPlanetFragment.java
index 9cde87b..d1d5af9 100644
--- a/src/com/android/camera/tinyplanet/TinyPlanetFragment.java
+++ b/src/com/android/camera/tinyplanet/TinyPlanetFragment.java
@@ -43,6 +43,7 @@
 import com.adobe.xmp.XMPMeta;
 import com.android.camera.CameraActivity;
 import com.android.camera.MediaSaveService;
+import com.android.camera.PhotoModule;
 import com.android.camera.MediaSaveService.OnMediaSavedListener;
 import com.android.camera.exif.ExifInterface;
 import com.android.camera.tinyplanet.TinyPlanetPreview.PreviewSizeListener;
@@ -321,7 +322,7 @@
                 mediaSaveService.addImage(image.mJpegData, tinyPlanetTitle, (new Date()).getTime(),
                         null,
                         image.mSize, image.mSize, 0, null, doneListener, getActivity()
-                                .getContentResolver());
+                                .getContentResolver(),PhotoModule.PIXEL_FORMAT_JPEG);
             }
         }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index 6b2b7f5..89da018 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -409,6 +409,8 @@
         public void goToFilmStrip();
 
         public void goToFullScreen();
+
+        public void clearSurfaceViews();
     }
 
     /**
@@ -1852,7 +1854,7 @@
         // Check the current one.
         ViewItem curr = mViewItem[mCurrentItem];
         int dataId = curr.getId();
-        if (reporter.isDataRemoved(dataId)) {
+        if (reporter.isDataRemoved(dataId) || mDataAdapter.getTotalNumber() == 1) {
             reload();
             return;
         }
@@ -2354,6 +2356,19 @@
             scaleTo(1f, GEOMETRY_ADJUST_TIME_MS);
         }
 
+        @Override
+        public void clearSurfaceViews() {
+            for(ViewItem item: mViewItem) {
+                if (item == null) {
+                    continue;
+                }
+                View v = item.getView();
+                if (v != mCameraView) {
+                    removeView(v);
+                }
+            }
+        }
+
         private void cancelFlingAnimation() {
             // Cancels flinging for zoomed images
             if (isFlingAnimationRunning()) {
diff --git a/src/com/android/camera/ui/MoreSettingPopup.java b/src/com/android/camera/ui/MoreSettingPopup.java
index 8da26c9..30c021c 100644
--- a/src/com/android/camera/ui/MoreSettingPopup.java
+++ b/src/com/android/camera/ui/MoreSettingPopup.java
@@ -82,13 +82,14 @@
 
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
-            if (convertView != null) return convertView;
-
             ListPreference pref = mListItem.get(position);
-
             int viewLayoutId = getSettingLayoutId(pref);
-            InLineSettingItem view = (InLineSettingItem)
-                    mInflater.inflate(viewLayoutId, parent, false);
+            InLineSettingItem view = (InLineSettingItem)convertView;
+
+            if (view == null) {
+                view = (InLineSettingItem)
+                        mInflater.inflate(viewLayoutId, parent, false);
+            }
 
             view.initialize(pref); // no init for restore one
             view.setSettingChangedListener(MoreSettingPopup.this);
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index f1a5a9a..0039aa2 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -118,7 +118,7 @@
     private int mPieCenterX;
     private int mPieCenterY;
     private int mSliceRadius;
-    private int mArcRadius;
+    private int mArcRadius, mMaxArcRadius;
     private int mArcOffset;
 
     private int mDialAngle;
@@ -225,6 +225,7 @@
         mMenuArcPaint.setStyle(Paint.Style.STROKE);
         mSliceRadius = res.getDimensionPixelSize(R.dimen.pie_item_radius);
         mArcRadius = res.getDimensionPixelSize(R.dimen.pie_arc_radius);
+        mMaxArcRadius = mArcRadius;
         mArcOffset = res.getDimensionPixelSize(R.dimen.pie_arc_offset);
         mLabel = new TextDrawable(res);
         mLabel.setDropShadow(true);
@@ -357,6 +358,12 @@
         mCenterX = (r - l) / 2;
         mCenterY = (b - t) / 2;
 
+        int layoutWidth = r - l;
+        if( (layoutWidth > 0) && ((mMaxArcRadius + mCenterX) > layoutWidth) ){
+            mArcRadius = layoutWidth - mCenterX;
+        } else {
+            mArcRadius = mMaxArcRadius;
+        }
         mFocusX = mCenterX;
         mFocusY = mCenterY;
         resetPieCenter();
diff --git a/src/com/android/camera/util/ApiHelper.java b/src/com/android/camera/util/ApiHelper.java
index dd5208c..4a91779 100644
--- a/src/com/android/camera/util/ApiHelper.java
+++ b/src/com/android/camera/util/ApiHelper.java
@@ -49,7 +49,8 @@
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
     public static final boolean HAS_ROTATION_ANIMATION =
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
-
+    public static final boolean HAS_FINE_RESOLUTION_QUALITY_LEVELS =
+            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
     public static final boolean HAS_HIDEYBARS = isKitKatOrHigher();
 
     public static int getIntFieldIfExists(Class<?> klass, String fieldName,
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 708308b..68211d6 100644
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -56,6 +56,7 @@
 import com.android.camera.CameraDisabledException;
 import com.android.camera.CameraHolder;
 import com.android.camera.CameraManager;
+import com.android.camera.CameraSettings;
 import com.android.camera.util.IntentHelper;
 import com.android.camera2.R;
 
@@ -820,7 +821,20 @@
             }
         }
     }
-
+   public static String getFilpModeString(int value){
+        switch(value){
+            case 0:
+                return CameraSettings.FLIP_MODE_OFF;
+            case 1:
+                return CameraSettings.FLIP_MODE_H;
+            case 2:
+                return CameraSettings.FLIP_MODE_V;
+            case 3:
+                return CameraSettings.FLIP_MODE_VH;
+            default:
+                return null;
+        }
+    }
     /**
      * For still image capture, we need to get the right fps range such that the
      * camera can slow down the framerate to allow for less-noisy/dark