summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk2
-rw-r--r--AndroidManifest.xml5
-rw-r--r--proguard.flags2
-rw-r--r--res/layout/photo_module.xml66
-rw-r--r--res/values/arrays.xml83
-rw-r--r--res/values/qcomarrays.xml565
-rw-r--r--res/values/qcomstrings.xml627
-rw-r--r--res/values/strings.xml10
-rw-r--r--res/xml/camera_preferences.xml129
-rw-r--r--res/xml/video_preferences.xml55
-rw-r--r--src/com/android/camera/AndroidCameraManagerImpl.java34
-rw-r--r--src/com/android/camera/CameraActivity.java39
-rw-r--r--src/com/android/camera/CameraErrorCallback.java3
-rw-r--r--src/com/android/camera/CameraManager.java19
-rw-r--r--src/com/android/camera/CameraModule.java2
-rw-r--r--src/com/android/camera/CameraSettings.java334
-rw-r--r--src/com/android/camera/CountDownTimerPreference.java3
-rw-r--r--src/com/android/camera/FocusOverlayManager.java29
-rw-r--r--src/com/android/camera/ListPreference.java4
-rw-r--r--src/com/android/camera/MediaSaveService.java17
-rw-r--r--src/com/android/camera/PhotoController.java4
-rw-r--r--src/com/android/camera/PhotoMenu.java278
-rw-r--r--src/com/android/camera/PhotoModule.java1146
-rw-r--r--src/com/android/camera/PhotoUI.java72
-rw-r--r--[-rwxr-xr-x]src/com/android/camera/ShutterButton.java14
-rw-r--r--src/com/android/camera/Storage.java50
-rw-r--r--src/com/android/camera/VideoMenu.java115
-rw-r--r--src/com/android/camera/VideoModule.java381
-rw-r--r--src/com/android/camera/VideoUI.java78
-rw-r--r--src/com/android/camera/WideAnglePanoramaModule.java43
-rw-r--r--src/com/android/camera/WideAnglePanoramaUI.java3
-rw-r--r--src/com/android/camera/tinyplanet/TinyPlanetFragment.java3
-rw-r--r--src/com/android/camera/ui/FilmStripView.java17
-rw-r--r--src/com/android/camera/ui/MoreSettingPopup.java11
-rw-r--r--src/com/android/camera/ui/PieRenderer.java9
-rw-r--r--src/com/android/camera/util/ApiHelper.java3
-rw-r--r--src/com/android/camera/util/CameraUtil.java16
37 files changed, 3991 insertions, 280 deletions
diff --git a/Android.mk b/Android.mk
index 0aeee7467..bb2b0d8c9 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,7 +23,7 @@ LOCAL_AAPT_FLAGS := \
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 e14a251b2..0a98e1622 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 198df7556..d5e8d60b8 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 0410f16fc..5d00da102 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 050f5a6d7..c77cdb314 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 000000000..3d08bab1f
--- /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 000000000..05eec50a5
--- /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 9879864a9..5d2b09bcc 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 975a15dea..36165abc0 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 ce36219f8..ab876b81c 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 e26b6a90e..5b70897e3 100644
--- a/src/com/android/camera/AndroidCameraManagerImpl.java
+++ b/src/com/android/camera/AndroidCameraManagerImpl.java
@@ -39,6 +39,8 @@ import android.os.Looper;
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 @@ class AndroidCameraManagerImpl implements CameraManager {
// 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 @@ class AndroidCameraManagerImpl implements CameraManager {
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 @@ class AndroidCameraManagerImpl implements CameraManager {
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 e7ccbb1e5..9e5ddb0b2 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -175,6 +175,7 @@ public class CameraActivity extends Activity
private Menu mActionBarMenu;
private ViewGroup mUndoDeletionBar;
private boolean mIsUndoingDeletion = false;
+ private boolean mIsEditActivityInProgress = false;
private Uri[] mNfcPushUris = new Uri[1];
@@ -335,6 +336,9 @@ public class CameraActivity extends Activity
@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 @@ public class CameraActivity extends Activity
@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 @@ public class CameraActivity extends Activity
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 @@ public class CameraActivity extends Activity
}
mLocalImagesObserver.setActivityPaused(false);
mLocalVideosObserver.setActivityPaused(false);
+ updateStorageSpaceAndHint();
}
@Override
@@ -1327,6 +1346,7 @@ public class CameraActivity extends Activity
public void onBackPressed() {
if (!mFilmStripView.inCameraFullscreen()) {
mFilmStripView.getController().goToFirstItem();
+ mCurrentModule.resizeForPreviewAspectRatio();
} else if (!mCurrentModule.onBackPressed()) {
super.onBackPressed();
}
@@ -1458,14 +1478,17 @@ public class CameraActivity extends Activity
* 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 22f800ef9..7029ac427 100644
--- a/src/com/android/camera/CameraErrorCallback.java
+++ b/src/com/android/camera/CameraErrorCallback.java
@@ -25,7 +25,8 @@ public class CameraErrorCallback
@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 909e1ca75..8ad0d52d6 100644
--- a/src/com/android/camera/CameraManager.java
+++ b/src/com/android/camera/CameraManager.java
@@ -25,6 +25,7 @@ import android.hardware.Camera.Parameters;
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 @@ public interface CameraManager {
* {@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 55cae9f0c..48d7eec4a 100644
--- a/src/com/android/camera/CameraModule.java
+++ b/src/com/android/camera/CameraModule.java
@@ -66,4 +66,6 @@ public interface CameraModule {
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 55867a1e8..243f1e35d 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 com.android.camera2.R;
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 class CameraSettings {
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 class CameraSettings {
}
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 @@ public class CameraSettings {
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 @@ public class CameraSettings {
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 @@ public class CameraSettings {
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 @@ public class CameraSettings {
|| !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 @@ public class CameraSettings {
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 9a7e44bfb..14819fa48 100644
--- a/src/com/android/camera/CountDownTimerPreference.java
+++ b/src/com/android/camera/CountDownTimerPreference.java
@@ -39,7 +39,8 @@ public class CountDownTimerPreference extends ListPreference {
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 f382a2ad6..9558944c0 100644
--- a/src/com/android/camera/FocusOverlayManager.java
+++ b/src/com/android/camera/FocusOverlayManager.java
@@ -63,12 +63,12 @@ public class FocusOverlayManager {
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 @@ public class FocusOverlayManager {
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 @@ public class FocusOverlayManager {
}
private void lockAeAwbIfNeeded() {
- if (mLockAeAwbNeeded && !mAeAwbLock) {
+ if (mLockAeAwbNeeded && !mAeAwbLock && !mZslEnabled) {
mAeAwbLock = true;
mListener.setFocusParameters();
}
@@ -520,6 +521,10 @@ public class FocusOverlayManager {
// 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 @@ public class FocusOverlayManager {
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 @@ public class FocusOverlayManager {
|| 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 909b32c55..2a33fb098 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -128,7 +128,9 @@ public class ListPreference extends CameraPreference {
}
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 e8ec08d57..7761f7f4c 100644
--- a/src/com/android/camera/MediaSaveService.java
+++ b/src/com/android/camera/MediaSaveService.java
@@ -28,7 +28,7 @@ import android.os.Binder;
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 class MediaSaveService extends Service {
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 @@ public class MediaSaveService extends Service {
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 @@ public class MediaSaveService extends Service {
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 @@ public class MediaSaveService extends Service {
this.exif = exif;
this.resolver = resolver;
this.listener = listener;
+ this.pictureFormat = pictureFormat;
}
@Override
@@ -180,7 +183,7 @@ public class MediaSaveService extends Service {
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 833c82574..c1c3a8562 100644
--- a/src/com/android/camera/PhotoController.java
+++ b/src/com/android/camera/PhotoController.java
@@ -31,6 +31,8 @@ public interface PhotoController extends OnShutterButtonListener {
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 interface PhotoController extends OnShutterButtonListener {
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 08ce3374e..0f4d3b74a 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -24,21 +24,39 @@ import android.hardware.Camera.Parameters;
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 class PhotoMenu extends PieController
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 @@ public class PhotoMenu extends PieController
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 @@ public class PhotoMenu extends PieController
});
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 @@ public class PhotoMenu extends PieController
// 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 9b1853a8a..4444e4d38 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -50,6 +50,12 @@ import android.view.KeyEvent;
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.IOException;
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
private int mCameraId;
private Parameters mParameters;
private boolean mPaused;
+ private View mRootView;
private PhotoUI mUI;
@@ -146,6 +178,8 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
: null;
private final CameraErrorCallback mErrorCallback = new CameraErrorCallback();
+ private final StatsCallback mStatsCallback = new StatsCallback();
private long mFocusStartTime;
private long mShutterCallbackTime;
@@ -236,6 +295,7 @@ public class PhotoModule
private FocusOverlayManager mFocusManager;
private String mSceneMode;
+ private String mCurrTouchAfAec = Parameters.TOUCH_AF_AEC_ON;
private final Handler mHandler = new MainHandler();
@@ -347,10 +407,45 @@ public class PhotoModule
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 @@ public class PhotoModule
@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 @@ public class PhotoModule
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 @@ public class PhotoModule
int height = root.getHeight();
mFocusManager.setPreviewSize(width, height);
openCameraCommon();
+ resizeForPreviewAspectRatio();
}
private void switchCamera() {
@@ -461,6 +573,7 @@ public class PhotoModule
closeCamera();
mUI.collapseCameraControls();
mUI.clearFaces();
+ disableSkinToneSeekBar();
if (mFocusManager != null) mFocusManager.removeMessages();
// Restart the camera and initialize the UI. From onCreate.
@@ -484,6 +597,7 @@ public class PhotoModule
// reset zoom value index
mZoomValue = 0;
+ resizeForPreviewAspectRatio();
openCameraCommon();
// Start switch camera animation. Post a message because
@@ -506,12 +620,18 @@ public class PhotoModule
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 @@ public class PhotoModule
}
}
+ 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 @@ public class PhotoModule
}
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 @@ public class PhotoModule
@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 @@ public class PhotoModule
@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 class PhotoModule
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 @@ public class PhotoModule
}
}
}
-
+ 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 @@ public class PhotoModule
}
}
+ 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 @@ public class PhotoModule
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 @@ public class PhotoModule
+ 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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
}
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 @@ public class PhotoModule
}
}
+ 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 @@ public class PhotoModule
// 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 @@ public class PhotoModule
|| (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 @@ public class PhotoModule
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 @@ public class PhotoModule
}
@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 @@ public class PhotoModule
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 class PhotoModule
public void onConfigurationChanged(Configuration newConfig) {
Log.v(TAG, "onConfigurationChanged");
setDisplayOrientation();
+ resizeForPreviewAspectRatio();
}
@Override
@@ -1362,6 +1830,10 @@ public class PhotoModule
}
}
+ protected CameraManager.CameraProxy getCamera() {
+ return mCameraDevice;
+ }
+
private boolean canTakePicture() {
return isCameraIdle() && (mActivity.getStorageSpaceBytes() > Storage.LOW_STORAGE_THRESHOLD_BYTES);
}
@@ -1375,9 +1847,11 @@ public class PhotoModule
@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 @@ public class PhotoModule
|| 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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
if (mContinuousFocusSupported && ApiHelper.HAS_AUTO_FOCUS_MOVE_CALLBACK) {
updateAutoFocusMoveCallback();
}
-
+ //QCom related parameters updated here.
+ qcomUpdateCameraParametersPreference();
return doGcamModeSwitch;
}
@@ -1802,7 +2636,16 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
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 @@ public class PhotoModule
}
}
}
+}
/* 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>();
+
+ 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());
+ }
+}
- // TODO: Delete this function after old camera code is removed
+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 8308e1561..fb5853da2 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -19,6 +19,7 @@ package com.android.camera;
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 @@ public class PhotoUI implements PieListener,
private int mPreviewWidth = 0;
private int mPreviewHeight = 0;
+ public boolean mMenuInitialized = false;
private float mSurfaceTextureUncroppedWidth;
private float mSurfaceTextureUncroppedHeight;
@@ -116,6 +118,10 @@ public class PhotoUI implements PieListener,
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 @@ public class PhotoUI implements PieListener,
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 @@ public class PhotoUI implements PieListener,
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 @@ public class PhotoUI implements PieListener,
}
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 @@ public class PhotoUI implements PieListener,
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 @@ public class PhotoUI implements PieListener,
mMenu.setListener(listener);
}
mMenu.initialize(prefGroup);
+ mMenuInitialized = true;
if (mZoomRenderer == null) {
mZoomRenderer = new ZoomRenderer(mActivity);
@@ -516,12 +561,13 @@ public class PhotoUI implements PieListener,
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 @@ public class PhotoUI implements PieListener,
@Override
public void onZoomStart() {
if (mPieRenderer != null) {
+ mPieRenderer.hide();
mPieRenderer.setBlockFocus(true);
}
}
@@ -770,6 +817,7 @@ public class PhotoUI implements PieListener,
(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
index a1bbb1a0d..f1d969f9d 100755..100644
--- a/src/com/android/camera/ShutterButton.java
+++ b/src/com/android/camera/ShutterButton.java
@@ -29,7 +29,18 @@ import android.widget.ImageView;
*/
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 @@ public class ShutterButton extends ImageView {
*/
void onShutterButtonFocus(boolean pressed);
void onShutterButtonClick();
+ void onShutterButtonLongClick();
}
private OnShutterButtonListener mListener;
@@ -53,6 +65,7 @@ public class ShutterButton extends ImageView {
public void setOnShutterButtonListener(OnShutterButtonListener listener) {
mListener = listener;
+ setOnLongClickListener(mLongClick);
}
@Override
@@ -66,6 +79,7 @@ public class ShutterButton extends ImageView {
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 b09eedafe..29dad8aa4 100644
--- a/src/com/android/camera/Storage.java
+++ b/src/com/android/camera/Storage.java
@@ -43,6 +43,7 @@ public class Storage {
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 class Storage {
}
}
- 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 @@ public class Storage {
}
}
- // 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 class Storage {
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 class Storage {
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 class Storage {
}
}
- 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 f0c7db272..01b9ddbc4 100644
--- a/src/com/android/camera/VideoMenu.java
+++ b/src/com/android/camera/VideoMenu.java
@@ -36,13 +36,17 @@ public class VideoMenu extends PieController
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 @@ public class VideoMenu extends PieController
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 @@ public class VideoMenu extends PieController
});
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 @@ public class VideoMenu extends PieController
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 @@ public class VideoMenu extends PieController
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 @@ public class VideoMenu extends PieController
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 0ee62bb9d..f8f416786 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -29,6 +29,7 @@ import android.content.SharedPreferences.Editor;
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.Build;
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.ApiHelper;
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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
// 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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
if (mCaptureTimeLapse) quality += 1000;
mProfile = CamcorderProfile.get(mCameraId, quality);
getDesiredPreviewSize();
+ qcomReadVideoPreferences();
mPreferenceRead = true;
}
@@ -626,7 +787,19 @@ public class VideoModule implements CameraModule,
". 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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
closeCamera();
throw new RuntimeException("startPreview failed", ex);
}
+ mStartPrevPending = false;
}
private void onPreviewStarted() {
@@ -754,9 +930,15 @@ public class VideoModule implements CameraModule,
@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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
// 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 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
releaseMediaRecorder();
// If start fails, frameworks will not lock the camera for us.
mCameraDevice.lock();
+ mStartRecPending = false;
return;
}
@@ -1226,6 +1453,7 @@ public class VideoModule implements CameraModule,
keepScreenOn();
UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
UsageStatistics.ACTION_CAPTURE_START, "Video");
+ mStartRecPending = false;
}
private Bitmap getVideoThumbnail() {
@@ -1267,6 +1495,7 @@ public class VideoModule implements CameraModule,
private boolean stopVideoRecording() {
Log.v(TAG, "stopVideoRecording");
+ mStopRecPending = true;
mUI.setSwipingEnabled(true);
if (!isVideoCaptureIntent()) {
mUI.showSwitcher();
@@ -1336,6 +1565,7 @@ public class VideoModule implements CameraModule,
fail ? UsageStatistics.ACTION_CAPTURE_FAIL :
UsageStatistics.ACTION_CAPTURE_DONE, "Video",
SystemClock.uptimeMillis() - mRecordingStartTime);
+ mStopRecPending = false;
return fail;
}
@@ -1460,8 +1690,127 @@ public class VideoModule implements CameraModule,
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 @@ public class VideoModule implements CameraModule,
}
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 @@ public class VideoModule implements CameraModule,
// Set zoom.
if (mParameters.isZoomSupported()) {
+ Parameters p = mCameraDevice.getParameters();
+ mZoomValue = p.getZoom();
mParameters.setZoom(mZoomValue);
}
@@ -1526,7 +1881,8 @@ public class VideoModule implements CameraModule,
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 class VideoModule implements CameraModule,
public void onConfigurationChanged(Configuration newConfig) {
Log.v(TAG, "onConfigurationChanged");
setDisplayOrientation();
+ resizeForPreviewAspectRatio();
}
@Override
@@ -1575,7 +1932,7 @@ public class VideoModule implements CameraModule,
// 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 @@ public class VideoModule implements CameraModule,
} else {
setCameraParameters();
}
+ mRestartPreview = false;
mUI.updateOnScreenIndicators(mParameters, mPreferences);
}
}
@@ -1730,10 +2088,11 @@ public class VideoModule implements CameraModule,
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 a8819e054..bb270b7f8 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 @@ public class VideoUI implements PieRenderer.PieListener,
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 @@ public class VideoUI implements PieRenderer.PieListener,
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 @@ public class VideoUI implements PieRenderer.PieListener,
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 @@ public class VideoUI implements PieRenderer.PieListener,
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 @@ public class VideoUI implements PieRenderer.PieListener,
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 @@ public class VideoUI implements PieRenderer.PieListener,
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 class VideoUI implements PieRenderer.PieListener,
}
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 @@ public class VideoUI implements PieRenderer.PieListener,
@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 34b3071a4..85f983ea8 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -43,7 +43,7 @@ import android.view.OrientationEventListener;
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 @@ public class WideAnglePanoramaModule
private int mDeviceOrientation;
private int mDeviceOrientationAtCapture;
private int mCameraOrientation;
+ private int mPanoAngle;
private int mOrientationCompensation;
private SoundClips.Player mSoundPlayer;
@@ -329,6 +330,13 @@ public class WideAnglePanoramaModule
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 @@ public class WideAnglePanoramaModule
@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 @@ public class WideAnglePanoramaModule
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 @@ public class WideAnglePanoramaModule
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 @@ public class WideAnglePanoramaModule
}
@Override
+ public void resizeForPreviewAspectRatio() {
+ }
+
+ @Override
public void onResumeBeforeSuper() {
mPaused = false;
}
@@ -976,8 +1004,13 @@ public class WideAnglePanoramaModule
// 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 268c82b2b..2cf27576d 100644
--- a/src/com/android/camera/WideAnglePanoramaUI.java
+++ b/src/com/android/camera/WideAnglePanoramaUI.java
@@ -321,6 +321,9 @@ public class WideAnglePanoramaUI implements
}
@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 9cde87b16..d1d5af91c 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.XMPException;
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 @@ public class TinyPlanetFragment extends DialogFragment implements PreviewSizeLis
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 6b2b7f5e0..89da0184e 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -409,6 +409,8 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
public void goToFilmStrip();
public void goToFullScreen();
+
+ public void clearSurfaceViews();
}
/**
@@ -1852,7 +1854,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
// 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 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
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 8da26c946..30c021ca3 100644
--- a/src/com/android/camera/ui/MoreSettingPopup.java
+++ b/src/com/android/camera/ui/MoreSettingPopup.java
@@ -82,13 +82,14 @@ public class MoreSettingPopup extends AbstractSettingPopup
@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 f1a5a9a4b..0039aa22c 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -118,7 +118,7 @@ public class PieRenderer extends OverlayRenderer
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 @@ public class PieRenderer extends OverlayRenderer
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 @@ public class PieRenderer extends OverlayRenderer
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 dd5208cc8..4a917799e 100644
--- a/src/com/android/camera/util/ApiHelper.java
+++ b/src/com/android/camera/util/ApiHelper.java
@@ -49,7 +49,8 @@ public class ApiHelper {
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 708308b63..68211d648 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.CameraActivity;
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 class CameraUtil {
}
}
}
-
+ 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