summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/layout/capture_module.xml3
-rw-r--r--res/values/attrs.xml1
-rw-r--r--res/values/camera2arrays.xml579
-rw-r--r--res/values/qcomarrays.xml42
-rw-r--r--res/values/qcomstrings.xml63
-rw-r--r--res/xml/camera_preferences.xml31
-rw-r--r--res/xml/capture_preferences.xml154
-rw-r--r--src/com/android/camera/CameraActivity.java15
-rw-r--r--src/com/android/camera/CameraSettings.java20
-rw-r--r--src/com/android/camera/CaptureMenu.java571
-rw-r--r--src/com/android/camera/CaptureModule.java809
-rw-r--r--src/com/android/camera/CaptureUI.java1367
-rw-r--r--src/com/android/camera/ComboPreferences.java6
-rw-r--r--src/com/android/camera/ListPreference.java15
-rw-r--r--src/com/android/camera/PhotoMenu.java14
-rw-r--r--src/com/android/camera/PhotoModule.java9
-rw-r--r--src/com/android/camera/PreviewGestures.java29
-rw-r--r--src/com/android/camera/RecordLocationPreference.java5
-rw-r--r--src/com/android/camera/SettingsManager.java539
-rw-r--r--src/com/android/camera/VideoModule.java6
-rw-r--r--src/com/android/camera/WideAnglePanoramaModule.java3
-rw-r--r--src/com/android/camera/ui/FilmStripView.java32
-rw-r--r--src/com/android/camera/ui/ListMenu.java63
-rw-r--r--src/com/android/camera/ui/ListMenuItem.java22
-rw-r--r--src/com/android/camera/ui/ListSubMenu.java3
-rw-r--r--src/com/android/camera/util/CameraUtil.java29
26 files changed, 2837 insertions, 1593 deletions
diff --git a/res/layout/capture_module.xml b/res/layout/capture_module.xml
index a68af5e08..d91b49a97 100644
--- a/res/layout/capture_module.xml
+++ b/res/layout/capture_module.xml
@@ -36,7 +36,8 @@
<com.android.camera.ui.AutoFitSurfaceView
android:id="@+id/mdp_preview_content"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
<com.android.camera.ui.AutoFitSurfaceView
android:id="@+id/mdp_preview_content2"
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index b9c04f290..a243e5fa6 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -30,6 +30,7 @@
<attr name="entryValues" format="reference" />
<attr name="entries" format="reference" />
<attr name="labelList" format="reference" />
+ <attr name="dependencyList" format="reference" />
</declare-styleable>
<declare-styleable name="IconIndicator">
<attr name="icons" format="reference" />
diff --git a/res/values/camera2arrays.xml b/res/values/camera2arrays.xml
new file mode 100644
index 000000000..9865e3900
--- /dev/null
+++ b/res/values/camera2arrays.xml
@@ -0,0 +1,579 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (c) 2016, The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<resources>
+ <string-array name="pref_camera2_camera2_entries" translatable="true">
+ <item>@string/pref_camera2_camera2_entry_disable</item>
+ <item>@string/pref_camera2_camera2_entry_enable</item>
+ </string-array>
+
+ <string-array name="pref_camera2_camera2_entryvalues" translatable="false">
+ <item>@string/pref_camera2_camera2_value_disable</item>
+ <item>@string/pref_camera2_camera2_value_enable</item>
+ </string-array>
+
+ <string-array name="pref_camera2_dual_camera_entries" translatable="true">
+ <item>@string/pref_camera2_dual_camera_entry_dual</item>
+ <item>@string/pref_camera2_dual_camera_entry_bayer</item>
+ <item>@string/pref_camera2_dual_camera_entry_mono</item>
+ </string-array>
+
+ <string-array name="pref_camera2_dual_camera_entryvalues" translatable="false">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ </string-array>
+
+ <string-array name="pref_camera2_dual_camera_dependencylist" translatable="false">
+ <item>pref_camera2_mono_preview_key</item>
+ <item>pref_camera2_clearsight_key</item>
+ </string-array>
+
+ <string-array name="pref_camera2_mono_preview_entries" translatable="true">
+ <item>@string/pref_camera2_mono_preview_entry_off</item>
+ <item>@string/pref_camera2_mono_preview_entry_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_mono_preview_entryvalues" translatable="false">
+ <item>@string/pref_camera2_mono_preview_value_off</item>
+ <item>@string/pref_camera2_mono_preview_value_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_clearsight_entries" translatable="true">
+ <item>@string/pref_camera2_clearsight_entry_off</item>
+ <item>@string/pref_camera2_clearsight_entry_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_clearsight_entryvalues" translatable="false">
+ <item>@string/pref_camera2_clearsight_value_off</item>
+ <item>@string/pref_camera2_clearsight_value_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_scenemode_dependencylist" translatable="false">
+ <item>pref_camera2_coloreffect_key</item>
+ <item>pref_camera2_flashmode_key</item>
+ <item>pref_camera2_whitebalance_key</item>
+ </string-array>
+
+ <!-- Refer to CONTROL_SCENE_MODE of Camera2 API for values
+ -1 refers to ones not supported in Camera2 API
+ 0 is special case added for auto (meaning off)
+ -->
+ <string-array name="pref_camera2_scenemode_entryvalues" translatable="false">
+ <item>0</item>
+ <item>18</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>3</item>
+ <item>4</item>
+ <item>13</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>15</item>
+ <item>10</item>
+ <item>5</item>
+ <item>8</item>
+ <item>9</item>
+ <item>-1</item>
+ </string-array>
+
+ <!-- Camera Preferences Scene Mode dialog box entries -->
+ <string-array name="pref_camera2_scenemode_entries" translatable="false">
+ <item>@string/pref_camera_scenemode_entry_auto</item>
+ <item>@string/pref_camera_scenemode_entry_hdr</item>
+ <item>@string/pref_camera_scenemode_entry_refocus</item>
+ <item>@string/pref_camera_scenemode_entry_optizoom</item>
+ <item>@string/pref_camera_scenemode_entry_portrait</item>
+ <item>@string/pref_camera_scenemode_entry_landscape</item>
+ <item>@string/pref_camera_scenemode_entry_sports</item>
+ <item>@string/pref_camera_scenemode_entry_flowers</item>
+ <item>@string/pref_camera_scenemode_entry_backlight</item>
+ <item>@string/pref_camera_scenemode_entry_candlelight</item>
+ <item>@string/pref_camera_scenemode_entry_sunset</item>
+ <item>@string/pref_camera_scenemode_entry_night</item>
+ <item>@string/pref_camera_scenemode_entry_beach</item>
+ <item>@string/pref_camera_scenemode_entry_snow</item>
+ <item>@string/pref_camera_scenemode_entry_asd</item>
+ </string-array>
+
+ <array name="pref_camera2_scenemode_thumbnails" translatable="false">
+ <item>@drawable/ic_scene_mode_auto</item>
+ <item>@drawable/ic_scene_mode_hdr</item>
+ <item>@drawable/ic_scene_mode_refocus</item>
+ <item>@drawable/ic_scene_mode_optizoom</item>
+ <item>@drawable/ic_scene_mode_portrait</item>
+ <item>@drawable/ic_scene_mode_landscape</item>
+ <item>@drawable/ic_scene_mode_sports</item>
+ <item>@drawable/ic_scene_mode_flower</item>
+ <item>@drawable/ic_scene_mode_backlight</item>
+ <item>@drawable/ic_scene_mode_candlelight</item>
+ <item>@drawable/ic_scene_mode_sunset</item>
+ <item>@drawable/ic_scene_mode_night</item>
+ <item>@drawable/ic_scene_mode_beach</item>
+ <item>@drawable/ic_scene_mode_snow</item>
+ <item>@drawable/ic_scene_mode_smartauto</item>
+ </array>
+
+ <string-array name="pref_camera2_scenemode_labels">
+ <item>@string/pref_camera_scenemode_label_action</item>
+ <item>@string/pref_camera_scenemode_label_night</item>
+ <item>@string/pref_camera_scenemode_label_auto</item>
+ <item>@string/pref_camera_scenemode_label_sunset</item>
+ <item>@string/pref_camera_scenemode_label_party</item>
+ </string-array>
+
+ <array name="pref_camera2_scenemode_icons">
+ <item>@drawable/ic_sce_action</item>
+ <item>@drawable/ic_sce_night</item>
+ <item>@drawable/ic_sce_off</item>
+ <item>@drawable/ic_sce_sunset</item>
+ <item>@drawable/ic_sce_party</item>
+ </array>
+
+ <string-array name="pref_camera2_whitebalance_entryvalues" translatable="false">
+ <item>2</item>
+ <item>4</item>
+ <item>1</item>
+ <item>5</item>
+ <item>6</item>
+ </string-array>
+
+ <!-- Camera Preferences White Balance dialog box entries -->
+ <string-array name="pref_camera2_whitebalance_entries" translatable="false">
+ <item>@string/pref_camera_whitebalance_entry_incandescent</item>
+ <item>@string/pref_camera_whitebalance_entry_fluorescent</item>
+ <item>@string/pref_camera_whitebalance_entry_auto</item>
+ <item>@string/pref_camera_whitebalance_entry_daylight</item>
+ <item>@string/pref_camera_whitebalance_entry_cloudy</item>
+ </string-array>
+
+ <string-array name="pref_camera2_whitebalance_labels" translatable="false">
+ <item>@string/pref_camera_whitebalance_label_incandescent</item>
+ <item>@string/pref_camera_whitebalance_label_fluorescent</item>
+ <item>@string/pref_camera_whitebalance_label_auto</item>
+ <item>@string/pref_camera_whitebalance_label_daylight</item>
+ <item>@string/pref_camera_whitebalance_label_cloudy</item>
+ </string-array>
+
+ <array name="pref_camera2_whitebalance_icons" translatable="false">
+ <item>@drawable/ic_wb_incandescent</item>
+ <item>@drawable/ic_wb_fluorescent</item>
+ <item>@drawable/ic_wb_auto</item>
+ <item>@drawable/ic_wb_sunlight</item>
+ <item>@drawable/ic_wb_cloudy</item>
+ </array>
+
+ <array name="pref_camera2_whitebalance_largeicons" translatable="false">
+ <item>@drawable/ic_wb_incandescent</item>
+ <item>@drawable/ic_wb_fluorescent</item>
+ <item>@drawable/ic_wb_auto</item>
+ <item>@drawable/ic_wb_sunlight</item>
+ <item>@drawable/ic_wb_cloudy</item>
+ </array>
+
+ <!-- Refer to CONTROL_EFFECT_MODE of Camera2 API for values
+ -1 refers to ones not supported in Camera2 API
+ -->
+ <string-array name="pref_camera2_coloreffect_entryvalues" translatable="false">
+ <item>0</item>
+ <item>1</item>
+ <item>4</item>
+ <item>2</item>
+ <item>3</item>
+ <item>5</item>
+ <item>8</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ <item>-1</item>
+ </string-array>
+
+ <string-array name="pref_camera2_coloreffect_icons" translatable="false">
+ <item>@drawable/ic_settings_filter</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ </string-array>
+
+ <!-- Camera Preferences Color effect dialog box entries -->
+ <string-array name="pref_camera2_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>
+
+ <array name="pref_camera2_coloreffect_thumbnails" translatable="false">
+ <item>@drawable/thumb_filter_nofilter</item>
+ <item>@drawable/thumb_filter_monochrome</item>
+ <item>@drawable/thumb_filter_sepia</item>
+ <item>@drawable/thumb_filter_negative</item>
+ <item>@drawable/thumb_filter_solarize</item>
+ <item>@drawable/thumb_filter_posterize</item>
+ <item>@drawable/thumb_filter_aqua</item>
+ <item>@drawable/thumb_filter_emboss</item>
+ <item>@drawable/thumb_filter_sketch</item>
+ <item>@drawable/thumb_filter_neon</item>
+ <item>0</item>
+ <item>0</item>
+ <item>0</item>
+ <item>0</item>
+ <item>0</item>
+ </array>
+
+ <!-- Camera Preferences flash mode dialog box entries -->
+ <string-array name="pref_camera2_flashmode_entries" translatable="false">
+ <item>@string/pref_camera_flashmode_entry_off</item>
+ <item>@string/pref_camera_flashmode_entry_auto</item>
+ <item>@string/pref_camera_flashmode_entry_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_flashmode_labels" translatable="false">
+ <item>@string/pref_camera_flashmode_label_off</item>
+ <item>@string/pref_camera_flashmode_label_auto</item>
+ <item>@string/pref_camera_flashmode_label_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_flashmode_entryvalues" translatable="false">
+ <item>off</item>
+ <item>auto</item>
+ <item>on</item>
+ </string-array>
+
+ <array name="pref_camera2_flashmode_icons" translatable="false">
+ <item>@drawable/ic_flash_off_holo_light</item>
+ <item>@drawable/ic_flash_auto_holo_light</item>
+ <item>@drawable/ic_flash_on_holo_light</item>
+ </array>
+
+ <array name="pref_camera2_flashmode_largeicons" translatable="false">
+ <item>@drawable/ic_flash_off_holo_light</item>
+ <item>@drawable/ic_flash_auto_holo_light</item>
+ <item>@drawable/ic_flash_on_holo_light</item>
+ </array>
+
+ <!-- Camera Preference save path entries -->
+ <string-array name="pref_camera2_savepath_entries" translatable="false">
+ <item>@string/pref_camera_savepath_entry_0</item>
+ <item>@string/pref_camera_savepath_entry_1</item>
+ </string-array>
+
+ <string-array name="pref_camera2_savepath_entryvalues" translatable="false">
+ <item>0</item>
+ <item>1</item>
+ </string-array>
+
+ <!-- Camera Preferences Picture size dialog box entries -->
+ <string-array name="pref_camera2_picturesize_entries" translatable="false">
+ <item>@string/pref_camera_picturesize_entry_24mp</item>
+ <item>@string/pref_camera_picturesize_entry_21mp</item>
+ <item>@string/pref_camera_picturesize_entry_16mp</item>
+ <item>@string/pref_camera_picturesize_entry_16mp_wide</item>
+ <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_square</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_wide</item>
+ <item>@string/pref_camera_picturesize_entry_3mp</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_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_800x600</item>
+ <item>@string/pref_camera_picturesize_entry_800x480</item>
+ <item>@string/pref_camera_picturesize_entry_960x720</item>
+ <item>@string/pref_camera_picturesize_entry_720x480</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_camera2_picturesize_entryvalues" translatable="false">
+ <item>5656x4242</item>
+ <item>5344x4008</item>
+ <item>4608x3456</item>
+ <item>5312x2988</item>
+ <item>4160x3120</item>
+ <item>4000x3000</item>
+ <item>3840x2160</item>
+ <item>3264x2448</item>
+ <item>2976x2976</item>
+ <item>2592x1944</item>
+ <item>2592x1936</item>
+ <item>2560x1920</item>
+ <item>2688x1512</item>
+ <item>2048x1536</item>
+ <item>2048x1520</item>
+ <item>1920x1080</item>
+ <item>1600x1200</item>
+ <item>1920x1088</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 -->
+ <string-array name="pref_camera2_focusmode_entries" translatable="false">
+ <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_camera2_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_camera2_focusmode_labels" translatable="false">
+ <item>@string/pref_camera_focusmode_label_auto</item>
+ <item>@string/pref_camera_focusmode_label_infinity</item>
+ <item>@string/pref_camera_focusmode_label_macro</item>
+ </string-array>
+
+ <string-array name="pref_camera2_recordlocation_entryvalues" translatable="false">
+ <item>off</item>
+ <item>on</item>
+ </string-array>
+
+ <array name="pref_camera2_recordlocation_entries" translatable="false">
+ <item>@string/setting_off</item>
+ <item>@string/setting_on</item>
+ </array>
+
+ <array name="pref_camera2_recordlocation_labels" translatable="false">
+ <item>@string/pref_camera_location_label</item>
+ <item>@string/pref_camera_location_label</item>
+ </array>
+
+ <array name="pref_camera2_recordlocation_icons" translatable="false">
+ <item>@drawable/ic_location_off</item>
+ <item>@drawable/ic_location</item>
+ </array>
+
+ <array name="pref_camera2_recordlocation_largeicons" translatable="false">
+ <item>@drawable/ic_location_off</item>
+ <item>@drawable/ic_location</item>
+ </array>
+
+ <array name="pref_camera2_id_entries" translatable="false">
+ <item>@string/pref_camera_id_entry_back</item>
+ <item>@string/pref_camera_id_entry_front</item>
+ </array>
+
+ <array name="pref_camera2_id_labels" translatable="false">
+ <item>@string/pref_camera_id_label_back</item>
+ <item>@string/pref_camera_id_label_front</item>
+ </array>
+
+ <array name="pref_camera2_id_icons" translatable="false">
+ <item>@drawable/ic_switch_back</item>
+ <item>@drawable/ic_switch_front</item>
+ </array>
+
+ <array name="pref_camera2_id_largeicons" translatable="false">
+ <item>@drawable/ic_switch_back</item>
+ <item>@drawable/ic_switch_front</item>
+ </array>
+
+ <string-array name="pref_camera2_timer_sound_entries" translatable="false">
+ <item>@string/setting_off</item>
+ <item>@string/setting_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_timer_sound_entryvalues" translatable="false">
+ <item>@string/setting_off_value</item>
+ <item>@string/setting_on_value</item>
+ </string-array>
+
+ <!-- Icons for exposure compensation -->
+ <array name="pref_camera2_exposure_icons" translatable="false">
+ <item>@drawable/ic_exposure_n3</item>
+ <item>@drawable/ic_exposure_n2</item>
+ <item>@drawable/ic_exposure_n1</item>
+ <item>@drawable/ic_exposure_0</item>
+ <item>@drawable/ic_exposure_p1</item>
+ <item>@drawable/ic_exposure_p2</item>
+ <item>@drawable/ic_exposure_p3</item>
+ </array>
+
+ <!-- Labels for Countdown timer -->
+ <string-array name="pref_camera2_countdown_labels">
+ <item>@string/pref_camera_countdown_label_off</item>
+ <item>@string/pref_camera_countdown_label_one</item>
+ <item>@string/pref_camera_countdown_label_three</item>
+ <item>@string/pref_camera_countdown_label_ten</item>
+ <item>@string/pref_camera_countdown_label_fifteen</item>
+ </string-array>
+
+ <!-- Camera Preferences JPEG quality dialog box entries -->
+ <string-array name="pref_camera2_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>
+ </string-array>
+
+ <string-array name="pref_camera2_jpegquality_entryvalues" translatable="false">
+ <item>55</item>
+ <item>85</item>
+ <item>100</item>
+ </string-array>
+
+ <!-- Rough estimates of jpeg compression ratio corresponding to qualities defined above. -->
+ <integer-array name="pref_camera2_jpegquality_compression_ratio">
+ <item>48</item>
+ <item>20</item>
+ <item>6</item>
+ </integer-array>
+
+ <!-- Camera Preferences ISO dialog box entries -->
+ <string-array name="pref_camera2_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_camera2_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 Auto Exposure dialog box entries -->
+ <string-array name="pref_camera2_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_camera2_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 Redeye Reduction dialog box entries -->
+ <string-array name="pref_camera2_redeyereduction_entries" translatable="false">
+ <item>@string/pref_camera_redeyereduction_entry_disable</item>
+ <item>@string/pref_camera_redeyereduction_entry_enable</item>
+ </string-array>
+
+ <string-array name="pref_camera2_redeyereduction_entryvalues" translatable="false">
+ <item>disable</item>
+ <item>enable</item>
+ </string-array>
+
+ <!-- Camera Preferences Long Shot dialog box entries -->
+ <string-array name="pref_camera2_longshot_entries" translatable="false">
+ <item>@string/setting_off</item>
+ <item>@string/setting_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_longshot_entryvalues" translatable="false">
+ <item>@string/setting_off_value</item>
+ <item>@string/setting_on_value</item>
+ </string-array>
+
+ <string-array name="pref_camera2_filter_mode_entries" translatable="false">
+ <item>@string/pref_camera_filter_mode_entry_off</item>
+ <item>@string/pref_camera_filter_mode_entry_on</item>
+ </string-array>
+ <string-array name="pref_camera2_filter_mode_entryvalues" translatable="false">
+ <item>Off</item>
+ <item>On</item>
+ </string-array>
+
+ <string-array name="pref_camera2_filter_mode_icons" translatable="false">
+ <item>@drawable/ic_settings_filter</item>
+ <item>@drawable/ic_settings_filter_on</item>
+ </string-array>
+
+</resources>
diff --git a/res/values/qcomarrays.xml b/res/values/qcomarrays.xml
index 3772e1729..2b565fd56 100644
--- a/res/values/qcomarrays.xml
+++ b/res/values/qcomarrays.xml
@@ -823,46 +823,4 @@
<item>0</item>
<item>1</item>
</string-array>
-
- <string-array name="pref_camera_camera2_entries" translatable="true">
- <item>@string/pref_camera_camera2_entry_enable</item>
- <item>@string/pref_camera_camera2_entry_disable</item>
- </string-array>
-
- <string-array name="pref_camera_camera2_entryvalues" translatable="false">
- <item>@string/pref_camera_camera2_value_enable</item>
- <item>@string/pref_camera_camera2_value_disable</item>
- </string-array>
-
- <string-array name="pref_camera_dual_camera_entries" translatable="true">
- <item>@string/pref_camera_dual_camera_entry_dual</item>
- <item>@string/pref_camera_dual_camera_entry_bayer</item>
- <item>@string/pref_camera_dual_camera_entry_mono</item>
- </string-array>
-
- <string-array name="pref_camera_dual_camera_entryvalues" translatable="false">
- <item>@string/pref_camera_dual_camera_value_dual</item>
- <item>@string/pref_camera_dual_camera_value_bayer</item>
- <item>@string/pref_camera_dual_camera_value_mono</item>
- </string-array>
-
- <string-array name="pref_camera_mono_preview_entries" translatable="true">
- <item>@string/pref_camera_mono_preview_entry_on</item>
- <item>@string/pref_camera_mono_preview_entry_off</item>
- </string-array>
-
- <string-array name="pref_camera_mono_preview_entryvalues" translatable="false">
- <item>@string/pref_camera_mono_preview_value_on</item>
- <item>@string/pref_camera_mono_preview_value_off</item>
- </string-array>
-
- <string-array name="pref_camera_clearsight_entries" translatable="true">
- <item>@string/pref_camera_clearsight_entry_on</item>
- <item>@string/pref_camera_clearsight_entry_off</item>
- </string-array>
-
- <string-array name="pref_camera_clearsight_entryvalues" translatable="false">
- <item>@string/pref_camera_clearsight_value_on</item>
- <item>@string/pref_camera_clearsight_value_off</item>
- </string-array>
</resources>
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index b0c84b790..6acae8260 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -418,7 +418,6 @@
<!-- HDR mode -->
<string name="pref_camera_hdr_mode_title">HDR mode</string>
<string name="pref_camera_hdr_mode_default" translatable="false">hdr-mode-multiframe</string>
-
<string name="pref_camera_hdr_mode_entry_sensor">Sensor HDR</string>
<string name="pref_camera_hdr_mode_entry_multi_frame">Multi-frame HDR</string>
@@ -533,41 +532,37 @@
<string name="pref_camera_dis_value_disable" translatable="false">disable</string>
- <string name="pref_camera_camera2_title">Camera2 Mode</string>
- <string name="pref_camera_camera2_default">disable</string>
- <string name="pref_camera_camera2_entry_enable">Enable</string>
- <string name="pref_camera_camera2_entry_disable">Disable</string>
-
- <string name="pref_camera_camera2_value_enable">enable</string>
- <string name="pref_camera_camera2_value_disable">disable</string>
-
- <string name="pref_camera_dual_camera_title">Dual Camera Mode</string>
- <string name="pref_camera_dual_camera_default">dual</string>
- <string name="pref_camera_dual_camera_entry_dual">Dual-camera Linked</string>
- <string name="pref_camera_dual_camera_entry_bayer">Single Bayer Camera</string>
- <string name="pref_camera_dual_camera_entry_mono">Single Mono Camera</string>
-
- <string name="pref_camera_dual_camera_value_dual">dual</string>
- <string name="pref_camera_dual_camera_value_bayer">bayer</string>
- <string name="pref_camera_dual_camera_value_mono">mono</string>
-
- <string name="pref_camera_mono_preview_title">Mono Preview</string>
- <string name="pref_camera_mono_preview_default">off</string>
- <string name="pref_camera_mono_preview_entry_on">On</string>
- <string name="pref_camera_mono_preview_entry_off">Off</string>
-
- <string name="pref_camera_mono_preview_value_on">on</string>
- <string name="pref_camera_mono_preview_value_off">off</string>
-
- <string name="pref_camera_clearsight_title">ClearSight</string>
- <string name="pref_camera_clearsight_default" translatable="false">off</string>
- <string name="pref_camera_clearsight_entry_on">On</string>
- <string name="pref_camera_clearsight_entry_off">Off</string>
-
- <string name="pref_camera_clearsight_value_on" translatable="false">on</string>
- <string name="pref_camera_clearsight_value_off" translatable="false">off</string>
+ <string name="pref_camera2_camera2_title" translatable="true">Camera2 Mode</string>
+ <string name="pref_camera2_camera2_entry_enable" translatable="true">Enable</string>
+ <string name="pref_camera2_camera2_entry_disable" translatable="true">Disable</string>
+ <string name="pref_camera2_camera2_default" translatable="false">disable</string>
+ <string name="pref_camera2_camera2_value_enable" translatable="false">enable</string>
+ <string name="pref_camera2_camera2_value_disable" translatable="false">disable</string>
+
+ <string name="pref_camera2_dual_camera_title" translatable="true">Dual Camera Mode</string>
+ <string name="pref_camera2_dual_camera_entry_dual" translatable="true">Dual-camera Linked</string>
+ <string name="pref_camera2_dual_camera_entry_bayer" translatable="true">Single Bayer Camera</string>
+ <string name="pref_camera2_dual_camera_entry_mono" translatable="true">Single Mono Camera</string>
+ <string name="pref_camera2_dual_camera_default" translatable="false">1</string>
+
+ <string name="pref_camera2_mono_preview_title" translatable="true">Mono Preview</string>
+ <string name="pref_camera2_mono_preview_entry_on" translatable="true">On</string>
+ <string name="pref_camera2_mono_preview_entry_off" translatable="true">Off</string>
+ <string name="pref_camera2_mono_preview_default" translatable="false">off</string>
+ <string name="pref_camera2_mono_preview_value_on" translatable="false">on</string>
+ <string name="pref_camera2_mono_preview_value_off" translatable="false">off</string>
+
+ <string name="pref_camera2_clearsight_title" translatable="true">ClearSight</string>
+ <string name="pref_camera2_clearsight_default" translatable="false">off</string>
+ <string name="pref_camera2_clearsight_entry_on" translatable="false">On</string>
+ <string name="pref_camera2_clearsight_entry_off" translatable="false">Off</string>
+
+ <string name="pref_camera2_clearsight_value_on" translatable="false">on</string>
+ <string name="pref_camera2_clearsight_value_off" translatable="false">off</string>
<string name="clearsight_capture_success">ClearSight capture successful</string>
<string name="clearsight_capture_fail">ClearSight capture failed</string>
+ <string name="pref_camera2_scenemode_default" translatable="false">0</string>
+
</resources>
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 0507472f7..12fe7145c 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -366,30 +366,9 @@
camera:singleIcon="@drawable/ic_settings_bright_screen"
camera:entryValues="@array/pref_switch_entryvalues" />
<ListPreference
- camera:key="pref_camera_camera2_key"
- camera:defaultValue="@string/pref_camera_camera2_default"
- camera:title="@string/pref_camera_camera2_title"
- camera:entries="@array/pref_camera_camera2_entries"
- camera:entryValues="@array/pref_camera_camera2_entryvalues" />
- <ListPreference
- camera:key="pref_camera_dual_camera_key"
- camera:defaultValue="@string/pref_camera_dual_camera_default"
- camera:title="@string/pref_camera_dual_camera_title"
- camera:entries="@array/pref_camera_dual_camera_entries"
- camera:entryValues="@array/pref_camera_dual_camera_entryvalues" />
-
- <ListPreference
- camera:defaultValue="@string/pref_camera_mono_preview_default"
- camera:entries="@array/pref_camera_mono_preview_entries"
- camera:entryValues="@array/pref_camera_mono_preview_entryvalues"
- camera:key="pref_camera_mono_preview_key"
- camera:title="@string/pref_camera_mono_preview_title" />
-
- <ListPreference
- camera:defaultValue="@string/pref_camera_clearsight_default"
- camera:entries="@array/pref_camera_clearsight_entries"
- camera:entryValues="@array/pref_camera_clearsight_entryvalues"
- camera:key="pref_camera_clearsight_key"
- camera:title="@string/pref_camera_clearsight_title" />
-
+ camera:key="pref_camera2_camera2_key"
+ camera:defaultValue="@string/pref_camera2_camera2_default"
+ camera:title="@string/pref_camera2_camera2_title"
+ camera:entries="@array/pref_camera2_camera2_entries"
+ camera:entryValues="@array/pref_camera2_camera2_entryvalues" />
</PreferenceGroup>
diff --git a/res/xml/capture_preferences.xml b/res/xml/capture_preferences.xml
new file mode 100644
index 000000000..59803aeb8
--- /dev/null
+++ b/res/xml/capture_preferences.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (c) 2016, The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<PreferenceGroup
+ xmlns:camera="http://schemas.android.com/apk/res/org.codeaurora.snapcam"
+ camera:title="@string/pref_camera_settings_category">
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_flashmode_default"
+ camera:entries="@array/pref_camera2_flashmode_entries"
+ camera:entryValues="@array/pref_camera2_flashmode_entryvalues"
+ camera:icons="@array/pref_camera2_flashmode_icons"
+ camera:key="pref_camera2_flashmode_key"
+ camera:labelList="@array/pref_camera2_flashmode_labels"
+ camera:largeIcons="@array/pref_camera2_flashmode_largeicons"
+ camera:singleIcon="@drawable/ic_settings_flash"
+ camera:title="@string/pref_camera_flashmode_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_whitebalance_default"
+ camera:entries="@array/pref_camera2_whitebalance_entries"
+ camera:entryValues="@array/pref_camera2_whitebalance_entryvalues"
+ camera:icons="@array/pref_camera2_whitebalance_icons"
+ camera:key="pref_camera2_whitebalance_key"
+ camera:labelList="@array/pref_camera2_whitebalance_labels"
+ camera:largeIcons="@array/pref_camera2_whitebalance_largeicons"
+ camera:singleIcon="@drawable/ic_settings_lightsource"
+ camera:title="@string/pref_camera_whitebalance_title"/>
+
+ <RecordLocationPreference
+ camera:defaultValue="@string/pref_camera_recordlocation_default"
+ camera:entries="@array/pref_camera2_recordlocation_entries"
+ camera:entryValues="@array/pref_camera2_recordlocation_entryvalues"
+ camera:icons="@array/pref_camera2_recordlocation_icons"
+ camera:key="pref_camera2_recordlocation_key"
+ camera:labelList="@array/pref_camera2_recordlocation_labels"
+ camera:largeIcons="@array/pref_camera2_recordlocation_largeicons"
+ camera:singleIcon="@drawable/ic_settings_location"
+ camera:title="@string/pref_camera_recordlocation_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_jpegquality_default"
+ camera:entries="@array/pref_camera2_jpegquality_entries"
+ camera:entryValues="@array/pref_camera2_jpegquality_entryvalues"
+ camera:key="pref_camera2_jpegquality_key"
+ camera:singleIcon="@drawable/ic_settings_quality"
+ camera:title="@string/pref_camera_jpegquality_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_savepath_default"
+ camera:entries="@array/pref_camera2_savepath_entries"
+ camera:entryValues="@array/pref_camera2_savepath_entryvalues"
+ camera:key="pref_camera2_savepath_key"
+ camera:singleIcon="@drawable/ic_settings_storage"
+ camera:title="@string/pref_camera_savepath_title"/>
+
+ <ListPreference
+ camera:defaultValue="@string/pref_camera2_camera2_default"
+ camera:entries="@array/pref_camera2_camera2_entries"
+ camera:entryValues="@array/pref_camera2_camera2_entryvalues"
+ camera:key="pref_camera2_camera2_key"
+ camera:title="@string/pref_camera2_camera2_title"/>
+
+ <ListPreference
+ camera:defaultValue="@string/pref_camera2_dual_camera_default"
+ camera:dependencyList="@array/pref_camera2_dual_camera_dependencylist"
+ camera:entries="@array/pref_camera2_dual_camera_entries"
+ camera:entryValues="@array/pref_camera2_dual_camera_entryvalues"
+ camera:key="pref_camera2_dual_camera_key"
+ camera:title="@string/pref_camera2_dual_camera_title"/>
+
+ <ListPreference
+ camera:defaultValue="@string/pref_camera2_mono_preview_default"
+ camera:entries="@array/pref_camera2_mono_preview_entries"
+ camera:entryValues="@array/pref_camera2_mono_preview_entryvalues"
+ camera:key="pref_camera2_mono_preview_key"
+ camera:title="@string/pref_camera2_mono_preview_title"/>
+
+ <ListPreference
+ camera:defaultValue="@string/pref_camera2_clearsight_default"
+ camera:entries="@array/pref_camera2_clearsight_entries"
+ camera:entryValues="@array/pref_camera2_clearsight_entryvalues"
+ camera:key="pref_camera2_clearsight_key"
+ camera:title="@string/pref_camera2_clearsight_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_coloreffect_default"
+ camera:entries="@array/pref_camera2_coloreffect_entries"
+ camera:entryValues="@array/pref_camera2_coloreffect_entryvalues"
+ camera:key="pref_camera2_coloreffect_key"
+ camera:largeIcons="@array/pref_camera2_coloreffect_icons"
+ camera:singleIcon="@drawable/ic_settings_filter"
+ camera:thumbnails="@array/pref_camera2_coloreffect_thumbnails"
+ camera:title="@string/pref_camera_coloreffect_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera2_scenemode_default"
+ camera:dependencyList="@array/pref_camera2_scenemode_dependencylist"
+ camera:entries="@array/pref_camera2_scenemode_entries"
+ camera:entryValues="@array/pref_camera2_scenemode_entryvalues"
+ camera:key="pref_camera2_scenemode_key"
+ camera:singleIcon="@drawable/ic_settings_scenemode"
+ camera:thumbnails="@array/pref_camera2_scenemode_thumbnails"
+ camera:title="@string/pref_camera_scenemode_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_redeyereduction_default"
+ camera:entries="@array/pref_camera2_redeyereduction_entries"
+ camera:entryValues="@array/pref_camera2_redeyereduction_entryvalues"
+ camera:key="pref_camera2_redeyereduction_key"
+ camera:singleIcon="@drawable/ic_settings_redeye"
+ camera:title="@string/pref_camera_redeyereduction_title"/>
+
+ <IconListPreference
+ camera:defaultValue="@string/pref_camera_id_default"
+ camera:entries="@array/pref_camera2_id_entries"
+ camera:icons="@array/pref_camera2_id_icons"
+ camera:key="pref_camera2_id_key"
+ camera:labelList="@array/pref_camera2_id_labels"
+ camera:largeIcons="@array/pref_camera2_id_largeicons"
+ camera:title="@string/pref_camera_id_title"/>
+
+ <IconListPreference
+ camera:entries="@array/pref_camera2_picturesize_entries"
+ camera:entryValues="@array/pref_camera2_picturesize_entryvalues"
+ camera:key="pref_camera2_picturesize_key"
+ camera:singleIcon="@drawable/ic_settings_picturesize"
+ camera:title="@string/pref_camera_picturesize_title"/>
+</PreferenceGroup>
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 19c80a72b..543e67231 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -168,8 +168,6 @@ public class CameraActivity extends Activity
/** Whether onResume should reset the view to the preview. */
private boolean mResetToPreviewOnResume = true;
- public static boolean CAMERA_2_ON = false;
-
// Supported operations at FilmStripView. Different data has different
// set of supported operations.
private static final int SUPPORT_DELETE = 1 << 0;
@@ -1491,6 +1489,8 @@ public class CameraActivity extends Activity
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
+ SettingsManager.createInstance(this);
+
LayoutInflater inflater = getLayoutInflater();
View rootLayout = inflater.inflate(R.layout.camera, null, false);
mCameraRootFrame = (FrameLayout)rootLayout.findViewById(R.id.camera_root_frame);
@@ -1525,10 +1525,9 @@ public class CameraActivity extends Activity
moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
}
}
- SharedPreferences pref = PreferenceManager
- .getDefaultSharedPreferences(this);
- CAMERA_2_ON = pref.getBoolean(CameraSettings.KEY_CAMERA2, false);
- if (CAMERA_2_ON && moduleIndex == ModuleSwitcher.PHOTO_MODULE_INDEX)
+
+ boolean cam2on = SettingsManager.getInstance().isCamera2On();
+ if (cam2on && moduleIndex == ModuleSwitcher.PHOTO_MODULE_INDEX)
moduleIndex = ModuleSwitcher.CAPTURE_MODULE_INDEX;
setContentView(R.layout.camera_filmstrip);
@@ -2017,7 +2016,9 @@ public class CameraActivity extends Activity
@Override
public void onModuleSelected(int moduleIndex) {
- if (moduleIndex == 0 && CAMERA_2_ON) moduleIndex = ModuleSwitcher.CAPTURE_MODULE_INDEX;
+ boolean cam2on = SettingsManager.getInstance().isCamera2On();
+ if (cam2on && moduleIndex == ModuleSwitcher.PHOTO_MODULE_INDEX)
+ moduleIndex = ModuleSwitcher.CAPTURE_MODULE_INDEX;
if (mCurrentModuleIndex == moduleIndex) {
if (mCurrentModuleIndex != ModuleSwitcher.CAPTURE_MODULE_INDEX) {
return;
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index a7fade722..3d2b3b6c6 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -243,11 +243,6 @@ public class CameraSettings {
public static final String KEY_REQUEST_PERMISSION = "request_permission";
- public static final String KEY_CAMERA2 = "pref_camera_camera2_key";
- public static final String KEY_DUAL_CAMERA = "pref_camera_dual_camera_key";
- public static final String KEY_MONO_PREVIEW = "pref_camera_mono_preview_key";
- public static final String KEY_CLEARSIGHT = "pref_camera_clearsight_key";
-
public static final String KEY_SELFIE_FLASH = "pref_selfie_flash_key";
public static final String EXPOSURE_DEFAULT_VALUE = "0";
@@ -1115,7 +1110,7 @@ public class CameraSettings {
return false;
}
- private void filterUnsupportedOptions(PreferenceGroup group,
+ public static void filterUnsupportedOptions(PreferenceGroup group,
ListPreference pref, List<String> supported) {
// Remove the preference if the parameter is not supported or there is
@@ -1144,7 +1139,7 @@ public class CameraSettings {
resetIfInvalid(pref);
}
- private void resetIfInvalid(ListPreference pref) {
+ private static void resetIfInvalid(ListPreference pref) {
// Set the value to the first entry if it is invalid.
String value = pref.getValue();
if (pref.findIndexOfValue(value) == NOT_FOUND) {
@@ -1267,6 +1262,17 @@ public class CameraSettings {
return Integer.parseInt(pref.getString(KEY_CAMERA_ID, rearCameraId));
}
+ public static int getInitialCameraId(SharedPreferences pref) {
+ int id = Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0"));
+ if (id == CaptureModule.BAYER_ID) {
+ int mode = Integer.parseInt(pref.getString(SettingsManager.KEY_DUAL_CAMERA, "1"));
+ if (mode == CaptureModule.MONO_MODE) return CaptureModule.MONO_ID;
+ else return CaptureModule.BAYER_ID;
+ } else {
+ return CaptureModule.FRONT_ID;
+ }
+ }
+
public static void writePreferredCameraId(SharedPreferences pref,
int cameraId) {
Editor editor = pref.edit();
diff --git a/src/com/android/camera/CaptureMenu.java b/src/com/android/camera/CaptureMenu.java
deleted file mode 100644
index 8b8f5c357..000000000
--- a/src/com/android/camera/CaptureMenu.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright (c) 2016, The Linux Foundation. All rights reserved.
- * Not a Contribution.
- *
- * Copyright (C) 2012 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.
- */
-
-package com.android.camera;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.graphics.Rect;
-import android.preference.PreferenceManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewPropertyAnimator;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.Toast;
-
-import com.android.camera.ui.CameraControls;
-import com.android.camera.ui.CountdownTimerPopup;
-import com.android.camera.ui.ListMenu;
-import com.android.camera.ui.ListSubMenu;
-import com.android.camera.ui.ModuleSwitcher;
-import com.android.camera.ui.RotateTextToast;
-
-import org.codeaurora.snapcam.R;
-
-import java.util.Locale;
-
-public class CaptureMenu extends MenuController
- implements ListMenu.Listener,
- CountdownTimerPopup.Listener,
- ListSubMenu.Listener {
- private static final int POPUP_NONE = 0;
- private static final int POPUP_FIRST_LEVEL = 1;
- private static final int POPUP_SECOND_LEVEL = 2;
- private static final int POPUP_IN_ANIMATION_SLIDE = 3;
- private static final int POPUP_IN_ANIMATION_FADE = 4;
- private static final int DEVELOPER_MENU_TOUCH_COUNT = 10;
- private static final int ANIMATION_DURATION = 300;
- private static final String TAG = "SnapCam_CaptureMenu";
- private String[] mOtherKeys1;
- private String[] mOtherKeys2;
- private ListMenu mListMenu;
- private CaptureUI mUI;
- private int mPopupStatus;
- private ListSubMenu mListSubMenu;
- private CameraActivity mActivity;
- private int privateCounter = 0;
-
- public CaptureMenu(CameraActivity activity, CaptureUI ui) {
- super(activity);
- mUI = ui;
- mActivity = activity;
- }
-
- // Return true if the preference has the specified key but not the value.
- private static boolean notSame(ListPreference pref, String key, String value) {
- return (key.equals(pref.getKey()) && !value.equals(pref.getValue()));
- }
-
- // Return true if the preference has the specified key and the value.
- private static boolean same(ListPreference pref, String key, String value) {
- return (key.equals(pref.getKey()) && value.equals(pref.getValue()));
- }
-
- public void initialize(PreferenceGroup group) {
- super.initialize(group);
- mListSubMenu = null;
- mListMenu = null;
- mPopupStatus = POPUP_NONE;
-
- mOtherKeys1 = new String[]{
- CameraSettings.KEY_FLASH_MODE,
- CameraSettings.KEY_RECORD_LOCATION,
- CameraSettings.KEY_JPEG_QUALITY,
- CameraSettings.KEY_CAMERA_SAVEPATH,
- CameraSettings.KEY_WHITE_BALANCE,
- CameraSettings.KEY_CAMERA2,
- CameraSettings.KEY_DUAL_CAMERA,
- CameraSettings.KEY_CLEARSIGHT
- };
-
- //Todo: 2nd string to contain only developer settings
- mOtherKeys2 = new String[]{
- CameraSettings.KEY_FLASH_MODE,
- CameraSettings.KEY_RECORD_LOCATION,
- CameraSettings.KEY_JPEG_QUALITY,
- CameraSettings.KEY_CAMERA_SAVEPATH,
- CameraSettings.KEY_WHITE_BALANCE,
- CameraSettings.KEY_CAMERA2,
- CameraSettings.KEY_DUAL_CAMERA,
- CameraSettings.KEY_CLEARSIGHT,
- CameraSettings.KEY_MONO_PREVIEW
- };
-
- }
-
- @Override
- // Hit when an item in a popup gets selected
- public void onListPrefChanged(ListPreference pref) {
- onSettingChanged(pref);
- closeView();
- }
-
- public boolean handleBackKey() {
- if (mPopupStatus == POPUP_NONE)
- return false;
- if (mPopupStatus == POPUP_FIRST_LEVEL) {
- animateSlideOut(mListMenu, 1);
- } else if (mPopupStatus == POPUP_SECOND_LEVEL) {
- animateFadeOut(mListSubMenu, 2);
- ((ListMenu) mListMenu).resetHighlight();
- }
- return true;
- }
-
- public void tryToCloseSubList() {
- if (mListMenu != null)
- ((ListMenu) mListMenu).resetHighlight();
-
- if (mPopupStatus == POPUP_SECOND_LEVEL) {
- mUI.dismissLevel2();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
- }
-
- private void animateFadeOut(final ListView v, final int level) {
- if (v == null || mPopupStatus == POPUP_IN_ANIMATION_FADE)
- return;
- mPopupStatus = POPUP_IN_ANIMATION_FADE;
-
- ViewPropertyAnimator vp = v.animate();
- vp.alpha(0f).setDuration(ANIMATION_DURATION);
- vp.setListener(new AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
-
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (level == 1) {
- mUI.dismissLevel1();
- initializePopup();
- mPopupStatus = POPUP_NONE;
- mUI.cleanupListview();
- } else if (level == 2) {
- mUI.dismissLevel2();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- if (level == 1) {
- mUI.dismissLevel1();
- initializePopup();
- mPopupStatus = POPUP_NONE;
- mUI.cleanupListview();
- } else if (level == 2) {
- mUI.dismissLevel2();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
-
- }
- });
- vp.start();
- }
-
- private void animateSlideOut(final ListView v, final int level) {
- if (v == null || mPopupStatus == POPUP_IN_ANIMATION_SLIDE)
- return;
- mPopupStatus = POPUP_IN_ANIMATION_SLIDE;
-
- ViewPropertyAnimator vp = v.animate();
- if (View.LAYOUT_DIRECTION_RTL == TextUtils
- .getLayoutDirectionFromLocale(Locale.getDefault())) {
- switch (mUI.getOrientation()) {
- case 0:
- vp.translationXBy(v.getWidth());
- break;
- case 90:
- vp.translationYBy(-2 * v.getHeight());
- break;
- case 180:
- vp.translationXBy(-2 * v.getWidth());
- break;
- case 270:
- vp.translationYBy(v.getHeight());
- break;
- }
- } else {
- switch (mUI.getOrientation()) {
- case 0:
- vp.translationXBy(-v.getWidth());
- break;
- case 90:
- vp.translationYBy(2 * v.getHeight());
- break;
- case 180:
- vp.translationXBy(2 * v.getWidth());
- break;
- case 270:
- vp.translationYBy(-v.getHeight());
- break;
- }
- }
- vp.setListener(new AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
-
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (level == 1) {
- mUI.dismissLevel1();
- initializePopup();
- mPopupStatus = POPUP_NONE;
- mUI.cleanupListview();
- } else if (level == 2) {
- mUI.dismissLevel2();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- if (level == 1) {
- mUI.dismissLevel1();
- initializePopup();
- mPopupStatus = POPUP_NONE;
- mUI.cleanupListview();
- } else if (level == 2) {
- mUI.dismissLevel2();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
-
- }
- });
- vp.setDuration(ANIMATION_DURATION).start();
- }
-
- public void animateFadeIn(final ListView v) {
- ViewPropertyAnimator vp = v.animate();
- vp.alpha(0.85f).setDuration(ANIMATION_DURATION);
- vp.start();
- }
-
- public void animateSlideIn(final View v, int delta, boolean forcePortrait) {
- int orientation = mUI.getOrientation();
- if (!forcePortrait)
- orientation = 0;
-
- ViewPropertyAnimator vp = v.animate();
- float dest;
- if (View.LAYOUT_DIRECTION_RTL == TextUtils
- .getLayoutDirectionFromLocale(Locale.getDefault())) {
- switch (orientation) {
- case 0:
- dest = v.getX();
- v.setX(-(dest - delta));
- vp.translationX(dest);
- break;
- case 90:
- dest = v.getY();
- v.setY(-(dest + delta));
- vp.translationY(dest);
- break;
- case 180:
- dest = v.getX();
- v.setX(-(dest + delta));
- vp.translationX(dest);
- break;
- case 270:
- dest = v.getY();
- v.setY(-(dest - delta));
- vp.translationY(dest);
- break;
- }
- } else {
- switch (orientation) {
- case 0:
- dest = v.getX();
- v.setX(dest - delta);
- vp.translationX(dest);
- break;
- case 90:
- dest = v.getY();
- v.setY(dest + delta);
- vp.translationY(dest);
- break;
- case 180:
- dest = v.getX();
- v.setX(dest + delta);
- vp.translationX(dest);
- break;
- case 270:
- dest = v.getY();
- v.setY(dest - delta);
- vp.translationY(dest);
- break;
- }
- }
- vp.setDuration(ANIMATION_DURATION).start();
- }
-
- public boolean isOverMenu(MotionEvent ev) {
- if (mPopupStatus == POPUP_NONE
- || mPopupStatus == POPUP_IN_ANIMATION_SLIDE
- || mPopupStatus == POPUP_IN_ANIMATION_FADE)
- return false;
- if (mUI.getMenuLayout() == null)
- return false;
- Rect rec = new Rect();
- mUI.getMenuLayout().getChildAt(0).getHitRect(rec);
- return rec.contains((int) ev.getX(), (int) ev.getY());
- }
-
- public boolean isOverPreviewMenu(MotionEvent ev) {
- return false;
- }
-
- public boolean isMenuBeingShown() {
- return mPopupStatus != POPUP_NONE;
- }
-
- public boolean isMenuBeingAnimated() {
- return mPopupStatus == POPUP_IN_ANIMATION_SLIDE || mPopupStatus == POPUP_IN_ANIMATION_FADE;
- }
-
- public boolean isPreviewMenuBeingShown() {
- return false;
- }
-
- public boolean isPreviewMenuBeingAnimated() {
- return false;
- }
-
- public boolean sendTouchToPreviewMenu(MotionEvent ev) {
- return mUI.sendTouchToPreviewMenu(ev);
- }
-
- public boolean sendTouchToMenu(MotionEvent ev) {
- return mUI.sendTouchToMenu(ev);
- }
-
- @Override
- public void overrideSettings(final String... keyvalues) {
- super.overrideSettings(keyvalues);
- if ((mListMenu == null))
- initializePopup();
- mListMenu.overrideSettings(keyvalues);
- }
-
- protected void initializePopup() {
- LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- ListMenu listMenu = (ListMenu) inflater.inflate(
- R.layout.list_menu, null, false);
-
- listMenu.setSettingChangedListener(this);
-
- String[] keys = mOtherKeys1;
- if (mActivity.isDeveloperMenuEnabled())
- keys = mOtherKeys2;
- listMenu.initialize(mPreferenceGroup, keys);
- mListMenu = listMenu;
-
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_DUAL_CAMERA);
- if (!pref.getValue().equals("dual")) {
- setPreference(CameraSettings.KEY_MONO_PREVIEW, "off");
- mListMenu.setPreferenceEnabled(CameraSettings.KEY_MONO_PREVIEW, false);
- setPreference(CameraSettings.KEY_CLEARSIGHT, "off");
- mListMenu.setPreferenceEnabled(CameraSettings.KEY_CLEARSIGHT, false);
- }
-
- if (mListener != null) {
- mListener.onSharedPreferenceChanged();
- }
- }
-
- public void initSwitchItem(final String prefKey, View switcher) {
- final IconListPreference pref =
- (IconListPreference) mPreferenceGroup.findPreference(prefKey);
- if (pref == null)
- return;
-
- int[] iconIds = pref.getLargeIconIds();
- int resid = -1;
- int index = pref.findIndexOfValue(pref.getValue());
- if (!pref.getUseSingleIcon() && iconIds != null) {
- // Each entry has a corresponding icon.
- resid = iconIds[index];
- } else {
- // The preference only has a single icon to represent it.
- resid = pref.getSingleIcon();
- }
- ((ImageView) switcher).setImageResource(resid);
- switcher.setVisibility(View.VISIBLE);
- mPreferences.add(pref);
- mPreferenceMap.put(pref, switcher);
- switcher.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- IconListPreference pref = (IconListPreference) mPreferenceGroup
- .findPreference(prefKey);
- if (pref == null)
- return;
- int index = pref.findIndexOfValue(pref.getValue());
- CharSequence[] values = pref.getEntryValues();
- index = (index + 1) % values.length;
- pref.setValueIndex(index);
- ((ImageView) v).setImageResource(
- ((IconListPreference) pref).getLargeIconIds()[index]);
- if (prefKey.equals(CameraSettings.KEY_CAMERA_ID))
- mListener.onCameraPickerClicked(index);
- reloadPreference(pref);
- onSettingChanged(pref);
- }
- });
- }
-
- public void openFirstLevel() {
- if (isMenuBeingShown() || CameraControls.isAnimating()) {
- return;
- }
- if (mListMenu == null || mPopupStatus != POPUP_FIRST_LEVEL) {
- initializePopup();
- mPopupStatus = POPUP_FIRST_LEVEL;
- }
- mUI.showPopup(mListMenu, 1, true);
- }
-
- @Override
- // Hit when an item in the first-level popup gets selected, then bring up
- // the second-level popup
- public void onPreferenceClicked(ListPreference pref) {
- onPreferenceClicked(pref, 0);
- }
-
- public void onPreferenceClicked(ListPreference pref, int y) {
- if (!mActivity.isDeveloperMenuEnabled()) {
- if (pref.getKey().equals(CameraSettings.KEY_REDEYE_REDUCTION)) {
- privateCounter++;
- if (privateCounter >= DEVELOPER_MENU_TOUCH_COUNT) {
- mActivity.enableDeveloperMenu();
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(mActivity);
- prefs.edit().putBoolean(CameraSettings.KEY_DEVELOPER_MENU, true).apply();
- RotateTextToast.makeText(mActivity,
- "Camera developer option is enabled now", Toast.LENGTH_SHORT).show();
- }
- } else {
- privateCounter = 0;
- }
- }
-
- LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- ListSubMenu basic = (ListSubMenu) inflater.inflate(
- R.layout.list_sub_menu, null, false);
- basic.initialize(pref, y);
- basic.setSettingChangedListener(this);
- basic.setAlpha(0f);
- mListSubMenu = basic;
- mUI.removeLevel2();
- if (mPopupStatus == POPUP_SECOND_LEVEL) {
- mUI.showPopup(mListSubMenu, 2, false);
- } else {
- mUI.showPopup(mListSubMenu, 2, true);
- }
- mPopupStatus = POPUP_SECOND_LEVEL;
- }
-
- public void onListMenuTouched() {
- mUI.removeLevel2();
- }
-
- public void removeAllView() {
- if (mUI != null)
- mUI.removeLevel2();
-
- if (mListMenu != null) {
- mUI.dismissLevel1();
- mPopupStatus = POPUP_NONE;
- }
- mUI.cleanupListview();
- }
-
- public void closeView() {
- if (mUI != null)
- mUI.removeLevel2();
-
- if (mListMenu != null && mPopupStatus != POPUP_NONE)
- animateSlideOut(mListMenu, 1);
- }
-
- public void setPreference(String key, String value) {
- ListPreference pref = mPreferenceGroup.findPreference(key);
- if (pref != null && !value.equals(pref.getValue())) {
- pref.setValue(value);
- reloadPreferences();
- }
- }
-
- @Override
- public void onSettingChanged(ListPreference pref) {
- super.onSettingChanged(pref);
- String key = pref.getKey();
- String value = pref.getValue();
- Log.d(TAG, "" + key + " " + value);
- //Todo: restructure by using switch and create function for each case
- if (key.equals(CameraSettings.KEY_CAMERA2)) {
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(mActivity);
- if (value.equals("enable")) {
- prefs.edit().putBoolean(CameraSettings.KEY_CAMERA2, true).apply();
- CameraActivity.CAMERA_2_ON = true;
- mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
- } else if (value.equals("disable")) {
- prefs.edit().putBoolean(CameraSettings.KEY_CAMERA2, false).apply();
- CameraActivity.CAMERA_2_ON = false;
- mActivity.onModuleSelected(ModuleSwitcher.PHOTO_MODULE_INDEX);
- }
- } else if (key.equals(CameraSettings.KEY_DUAL_CAMERA)) {
- boolean changeMode = CaptureModule.setMode(value);
- if (changeMode) mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
- } else if (key.equals(CameraSettings.KEY_MONO_PREVIEW)) {
- if (value.equals("on")) {
- } else if (value.equals("off")) {
- }
- } else if (key.equals(CameraSettings.KEY_CLEARSIGHT)) {
- // restart module to re-create sessions and callbacks
- mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
- }
- }
-
- public int getOrientation() {
- return mUI == null ? 0 : mUI.getOrientation();
- }
-}
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index 90e1794ac..574fe4daf 100644
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -19,22 +19,6 @@
package com.android.camera;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-import org.codeaurora.snapcam.R;
-import org.codeaurora.snapcam.filter.ClearSightImageProcessor;
-import org.codeaurora.snapcam.filter.ClearSightNativeEngine.ClearsightImage;
-
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -42,7 +26,6 @@ import android.content.res.Configuration;
import android.graphics.ImageFormat;
import android.graphics.Point;
import android.graphics.Rect;
-import android.graphics.YuvImage;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
@@ -78,11 +61,31 @@ import com.android.camera.PhotoModule.NamedImages.NamedEntity;
import com.android.camera.ui.RotateTextToast;
import com.android.camera.util.CameraUtil;
+import org.codeaurora.snapcam.R;
+import org.codeaurora.snapcam.filter.ClearSightImageProcessor;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
public class CaptureModule implements CameraModule, PhotoController,
- MediaSaveService.Listener, ClearSightImageProcessor.Callback {
+ MediaSaveService.Listener, ClearSightImageProcessor.Callback,
+ SettingsManager.Listener {
public static final int DUAL_MODE = 0;
public static final int BAYER_MODE = 1;
public static final int MONO_MODE = 2;
+ //Todo: Read ids from the device dynamically
+ public static final int BAYER_ID = 0;
+ public static final int MONO_ID = 1;
+ public static final int FRONT_ID = 1;
+ private static final int BACK_MODE = 0;
+ private static final int FRONT_MODE = 1;
private static final int CANCEL_TOUCH_FOCUS_DELAY = 3000;
private static final int OPEN_CAMERA = 0;
private static final int CANCEL_TOUCH_FOCUS = 1;
@@ -117,11 +120,7 @@ public class CaptureModule implements CameraModule, PhotoController,
* Camera state: Waiting for the touch-to-focus to converge.
*/
private static final int STATE_WAITING_TOUCH_FOCUS = 5;
- //Todo: Read ids from the device dynamically
- private static final int BAYER_ID = 0;
- private static final int MONO_ID = 1;
private static final String TAG = "SnapCam_CaptureModule";
- private static int MODE = DUAL_MODE;
static {
ORIENTATIONS.append(Surface.ROTATION_0, 90);
@@ -149,7 +148,6 @@ public class CaptureModule implements CameraModule, PhotoController,
// The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
private int mJpegQuality;
- private Map<String, String> mSettings = new HashMap<String, String>();
private boolean mFirstTimeInitialized;
private boolean mInitialized = false;
private boolean mIsLinked = false;
@@ -161,13 +159,11 @@ public class CaptureModule implements CameraModule, PhotoController,
private String[] mCameraId = new String[MAX_NUM_CAM];
private CaptureUI mUI;
private CameraActivity mActivity;
- private PreferenceGroup mPreferenceGroup;
- private ComboPreferences mPreferences;
- private CameraCharacteristics[] mCharacteristics = new CameraCharacteristics[MAX_NUM_CAM];
- private List<Integer> mCharacteristicsIndex;
+ private List<Integer> mCameraIdList;
private float mZoomValue = 1f;
private FocusStateListener mFocusStateListener;
private LocationManager mLocationManager;
+ private SettingsManager mSettingsManager;
/**
* A {@link CameraCaptureSession } for camera preview.
*/
@@ -257,7 +253,7 @@ public class CaptureModule implements CameraModule, PhotoController,
CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED == afState) {
// CONTROL_AE_STATE can be null on some devices
if (aeState == null || (aeState == CaptureResult
- .CONTROL_AE_STATE_CONVERGED) && isFlashOff()) {
+ .CONTROL_AE_STATE_CONVERGED) && isFlashOff(id)) {
mState[id] = STATE_PICTURE_TAKEN;
captureStillPicture(id);
} else {
@@ -311,52 +307,7 @@ public class CaptureModule implements CameraModule, PhotoController,
process(result);
}
};
- private final CameraPreference.OnPreferenceChangedListener prefListener = new
- CameraPreference.OnPreferenceChangedListener() {
- @Override
- public void onSharedPreferenceChanged(ListPreference pref) {
- if (mPaused) return;
- if (CameraSettings.KEY_CAMERA_SAVEPATH.equals(pref.getKey())) {
- Storage.setSaveSDCard(
- mPreferences.getString(CameraSettings.KEY_CAMERA_SAVEPATH, "0")
- .equals("1"));
- mActivity.updateStorageSpaceAndHint();
- }
- switch (MODE) {
- case BAYER_MODE:
- applyPreference(0, pref);
- break;
- case MONO_MODE:
- applyPreference(1, pref);
- break;
- case DUAL_MODE:
- applyPreference(0, pref);
- applyPreference(1, pref);
- }
- mUI.overrideSettings(pref.getKey(), null);
- }
-
- @Override
- public void onSharedPreferenceChanged() {
- if (mPaused) return;
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
- mLocationManager.recordLocation(recordLocation);
- }
-
- @Override
- public void onRestorePreferencesClicked() {
- }
-
- @Override
- public void onOverriddenPreferencesClicked() {
- }
-
- @Override
- public void onCameraPickerClicked(int cameraId) {
- }
- };
private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
@@ -367,7 +318,7 @@ public class CaptureModule implements CameraModule, PhotoController,
if (mPaused) {
return;
}
- if (MODE == DUAL_MODE && id == BAYER_ID) {
+ if (isBackMode() && getMode() == DUAL_MODE && id == BAYER_ID) {
Message msg = mCameraHandler.obtainMessage(OPEN_CAMERA, MONO_ID);
mCameraHandler.sendMessage(msg);
}
@@ -376,8 +327,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
- mUI.onCameraOpened(mCharacteristics, mCharacteristicsIndex,
- mPreferenceGroup, prefListener);
+ mUI.onCameraOpened(mCameraIdList);
}
});
}
@@ -418,23 +368,22 @@ public class CaptureModule implements CameraModule, PhotoController,
};
- public static boolean setMode(String value) {
- int mode = DUAL_MODE;
- switch (value) {
- case "dual":
- mode = DUAL_MODE;
+ private boolean isBackMode() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID);
+ if (value == null) return true;
+ if (Integer.parseInt(value) == BAYER_ID) return true;
+ return false;
+ }
+
+ private int getMode() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_DUAL_CAMERA);
+ return Integer.parseInt(value);
+ }
- break;
- case "bayer":
- mode = BAYER_MODE;
- break;
- case "mono":
- mode = MONO_MODE;
- break;
- }
- if (MODE == mode) return false;
- MODE = mode;
- return true;
+ private boolean isClearSightOn() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_CLEARSIGHT);
+ if (value == null) return false;
+ return isBackMode() && getMode() == DUAL_MODE && value.equals("on");
}
public static int getQualityNumber(String jpegQuality) {
@@ -471,8 +420,7 @@ public class CaptureModule implements CameraModule, PhotoController,
//Todo: test record location. Jack to provide instructions
// Initialize location service.
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = getRecordLocation();
mLocationManager.recordLocation(recordLocation);
mUI.initializeFirstTime();
@@ -489,31 +437,38 @@ public class CaptureModule implements CameraModule, PhotoController,
private void initializeSecondTime() {
// Start location update if needed.
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = getRecordLocation();
mLocationManager.recordLocation(recordLocation);
MediaSaveService s = mActivity.getMediaSaveService();
if (s != null) {
s.setListener(this);
}
mNamedImages = new NamedImages();
- mUI.initializeSecondTime();
}
private void createSession(final int id) {
if (mPaused || !mCameraOpened[id] || !mSurfaceReady) return;
+ Log.d(TAG, "createSession " + id);
List<Surface> list = new LinkedList<Surface>();
mUI.hidePreviewCover();
try {
Surface surface;
- if (id == BAYER_ID || (id == MONO_ID && MODE == MONO_MODE)) {
- SurfaceHolder sh = mUI.getSurfaceHolder();
- if (sh == null) {
- return;
+ if (isBackMode()) {
+ if (id == BAYER_ID || (id == MONO_ID && getMode() == MONO_MODE)) {
+ SurfaceHolder sh = mUI.getSurfaceHolder();
+ if (sh == null) {
+ return;
+ }
+ surface = sh.getSurface();
+ } else {
+ SurfaceHolder sh = mUI.getSurfaceHolder2();
+ if (sh == null) {
+ return;
+ }
+ surface = sh.getSurface();
}
- surface = sh.getSurface();
} else {
- SurfaceHolder sh = mUI.getSurfaceHolder2();
+ SurfaceHolder sh = mUI.getSurfaceHolder();
if (sh == null) {
return;
}
@@ -528,48 +483,46 @@ public class CaptureModule implements CameraModule, PhotoController,
CameraCaptureSession.StateCallback captureSessionCallback =
new CameraCaptureSession.StateCallback() {
- @Override
- public void onConfigured(CameraCaptureSession cameraCaptureSession) {
- // The camera is already closed
- if (mPaused || null == mCameraDevice[id]) {
- return;
- }
- // When the session is ready, we start displaying the preview.
- mCaptureSession[id] = cameraCaptureSession;
- initializePreviewConfiguration(id);
- try {
- if (MODE == DUAL_MODE) {
- linkBayerMono(id);
- mIsLinked = true;
+ @Override
+ public void onConfigured(CameraCaptureSession cameraCaptureSession) {
+ // The camera is already closed
+ if (mPaused || null == mCameraDevice[id]) {
+ return;
+ }
+ // When the session is ready, we start displaying the preview.
+ mCaptureSession[id] = cameraCaptureSession;
+ initializePreviewConfiguration(id);
+ try {
+ if (isBackMode() && getMode() == DUAL_MODE) {
+ linkBayerMono(id);
+ mIsLinked = true;
+ }
+ // Finally, we start displaying the camera preview.
+ mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id]
+ .build(), mCaptureCallback, mCameraHandler);
+
+ if (isClearSightOn()) {
+ ClearSightImageProcessor.getInstance().onCaptureSessionConfigured(id == BAYER_ID, cameraCaptureSession);
+ }
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
}
- // Finally, we start displaying the camera preview.
- mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id]
- .build(), mCaptureCallback, mCameraHandler);
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- if(pref.getValue().equals(mActivity.getString(R.string.pref_camera_clearsight_value_on))) {
- ClearSightImageProcessor.getInstance().onCaptureSessionConfigured(id == BAYER_ID, cameraCaptureSession);
+ @Override
+ public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
+ Log.d(TAG, "cameracapturesession - onConfigureFailed");
}
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
- Log.d(TAG, "cameracapturesession - onConfigureFailed");
- }
-
- @Override
- public void onClosed(CameraCaptureSession session) {
- Log.d(TAG, "cameracapturesession - onClosed");
- }
- };
+ @Override
+ public void onClosed(CameraCaptureSession session) {
+ Log.d(TAG, "cameracapturesession - onClosed");
+ }
+ };
list.add(surface);
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- if(pref.getValue().equals(mActivity.getString(R.string.pref_camera_clearsight_value_on))) {
+ if(isClearSightOn()) {
ClearSightImageProcessor.getInstance().createCaptureSession(
id==BAYER_ID, mCameraDevice[id], list, captureSessionCallback);
} else {
@@ -593,8 +546,27 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ public void reinit() {
+ String pictureSize = mSettingsManager.getValue(SettingsManager
+ .KEY_PICTURE_SIZE);
+
+ Size size = parsePictureSize(pictureSize);
+ mUI.setPreviewSize(size.getHeight(), size.getWidth());
+ mSettingsManager.reinit(getMainCameraId());
+ }
+
+ public boolean getRecordLocation() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_RECORD_LOCATION);
+ if (value == null) value = RecordLocationPreference.VALUE_NONE;
+ return RecordLocationPreference.VALUE_ON.equals(value);
+ }
+
@Override
public void init(CameraActivity activity, View parent) {
+ mActivity = activity;
+ mSettingsManager = SettingsManager.getInstance();
+ mSettingsManager.registerListener(this);
+ mSettingsManager.init();
Log.d(TAG, "init");
for (int i = 0; i < MAX_NUM_CAM; i++) {
mCameraOpened[i] = false;
@@ -602,32 +574,20 @@ public class CaptureModule implements CameraModule, PhotoController,
}
mSurfaceReady = false;
- mActivity = activity;
for (int i = 0; i < MAX_NUM_CAM; i++) {
mState[i] = STATE_PREVIEW;
}
- mPreferences = new ComboPreferences(mActivity);
- CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal(), activity);
-
- mPreferences.setLocalId(mActivity, BAYER_ID);
- CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());
-
- PreferenceInflater inflater = new PreferenceInflater(mActivity);
- PreferenceGroup group =
- (PreferenceGroup) inflater.inflate(R.xml.camera_preferences);
- mPreferenceGroup = group;
-
- ListPreference pref = group.findPreference(CameraSettings.KEY_DUAL_CAMERA);
- setMode(pref.getValue());
-
mContentResolver = mActivity.getContentResolver();
mUI = new CaptureUI(activity, this, parent);
mUI.initializeControlByIntent();
+ String pictureSize = mSettingsManager.getValue(SettingsManager.KEY_PICTURE_SIZE);
+ Size size = parsePictureSize(pictureSize);
+ mUI.setPreviewSize(size.getHeight(), size.getWidth());
mFocusStateListener = new FocusStateListener(mUI);
mLocationManager = new LocationManager(mActivity, mUI);
- Storage.setSaveSDCard(
- mPreferences.getString(CameraSettings.KEY_CAMERA_SAVEPATH, "0").equals("1"));
+ Storage.setSaveSDCard(mSettingsManager.getValue(SettingsManager
+ .KEY_CAMERA_SAVEPATH).equals("1"));
}
/**
@@ -635,17 +595,21 @@ public class CaptureModule implements CameraModule, PhotoController,
*/
private void takePicture() {
Log.d(TAG, "takePicture");
- switch (MODE) {
- case DUAL_MODE:
- lockFocus(BAYER_ID);
- lockFocus(MONO_ID);
- break;
- case BAYER_MODE:
- lockFocus(BAYER_ID);
- break;
- case MONO_MODE:
- lockFocus(MONO_ID);
- break;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ lockFocus(BAYER_ID);
+ lockFocus(MONO_ID);
+ break;
+ case BAYER_MODE:
+ lockFocus(BAYER_ID);
+ break;
+ case MONO_MODE:
+ lockFocus(MONO_ID);
+ break;
+ }
+ } else {
+ lockFocus(FRONT_ID);
}
}
@@ -667,12 +631,8 @@ public class CaptureModule implements CameraModule, PhotoController,
builder.setTag(id);
builder.addTarget(getPreviewSurface(id));
- builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
- builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
- builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
- applyWhiteBalance(builder);
- applyZoom(builder, id);
- applyAFRegions(builder, id);
+ applySettingsForLockFocus(builder, id);
+
mState[id] = STATE_WAITING_LOCK;
mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler);
} catch (CameraAccessException e) {
@@ -689,14 +649,8 @@ public class CaptureModule implements CameraModule, PhotoController,
builder.addTarget(getPreviewSurface(id));
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_AUTO;
- builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
- builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
- builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest
- .CONTROL_AF_TRIGGER_START);
-
- applyWhiteBalance(builder);
- applyZoom(builder, id);
- applyAFRegions(builder, id);
+ applySettingsForAutoFocus(builder, id);
+
mState[id] = STATE_WAITING_TOUCH_FOCUS;
mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler);
setAFModeToPreview(id, mControlAFMode);
@@ -740,9 +694,7 @@ public class CaptureModule implements CameraModule, PhotoController,
return;
}
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- final boolean csEnabled = pref.getValue().equals(
- mActivity.getString(R.string.pref_camera_clearsight_value_on));
+ final boolean csEnabled = isClearSightOn();
CaptureRequest.Builder captureBuilder;
if(csEnabled) {
@@ -759,27 +711,28 @@ public class CaptureModule implements CameraModule, PhotoController,
captureBuilder.addTarget(getPreviewSurface(id));
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
- applyCaptureSettings(captureBuilder, id);
+ applySettingsForCapture(captureBuilder, id);
if(csEnabled) {
ClearSightImageProcessor.getInstance().capture(
id==BAYER_ID, mCaptureSession[id], captureBuilder, mCaptureCallbackHandler);
} else {
captureBuilder.addTarget(mImageReader[id].getSurface());
+ mCaptureSession[id].stopRepeating();
mCaptureSession[id].capture(captureBuilder.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session,
- CaptureRequest request,
- TotalCaptureResult result) {
+ CaptureRequest request,
+ TotalCaptureResult result) {
Log.d(TAG, "captureStillPicture onCaptureCompleted: " + id);
}
@Override
public void onCaptureFailed(CameraCaptureSession session,
- CaptureRequest request,
- CaptureFailure result) {
+ CaptureRequest request,
+ CaptureFailure result) {
Log.d(TAG, "captureStillPicture onCaptureFailed: " + id);
}
@@ -808,14 +761,9 @@ public class CaptureModule implements CameraModule, PhotoController,
.TEMPLATE_PREVIEW);
builder.setTag(id);
builder.addTarget(getPreviewSurface(id));
- builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
- builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
- builder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
- CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
- // Applying flash only to capture does not work. Need to apply flash here.
- applyFlash(builder);
- applyWhiteBalance(builder);
- applyZoom(builder, id);
+
+ applySettingsForPrecapture(builder, id);
+
mState[id] = STATE_WAITING_PRECAPTURE;
mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler);
} catch (CameraAccessException e) {
@@ -833,24 +781,18 @@ public class CaptureModule implements CameraModule, PhotoController,
CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
try {
String[] cameraIdList = manager.getCameraIdList();
-
for (int i = 0; i < cameraIdList.length; i++) {
String cameraId = cameraIdList[i];
- CameraCharacteristics characteristics
- = manager.getCameraCharacteristics(cameraId);
- mCharacteristics[i] = characteristics;
- mCharacteristicsIndex.add(i);
+ CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
+ mCameraIdList.add(i);
StreamConfigurationMap map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map == null) {
continue;
}
- Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
- Log.d(TAG, "flash : " + (available == null ? false : available));
mCameraId[i] = cameraId;
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- if(pref.getValue().equals(mActivity.getString(R.string.pref_camera_clearsight_value_on))) {
+ if(isClearSightOn()) {
Size largest = Collections.max(
Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)),
new CompareSizesByArea());
@@ -864,7 +806,12 @@ public class CaptureModule implements CameraModule, PhotoController,
Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)),
new CompareSizesByArea());
- mImageReader[i] = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
+ String pictureSize = mSettingsManager.getValue(SettingsManager
+ .KEY_PICTURE_SIZE);
+
+ Size size = parsePictureSize(pictureSize);
+
+ mImageReader[i] = ImageReader.newInstance(size.getWidth(), size.getHeight(),
ImageFormat.JPEG, 3);
mImageReader[i].setOnImageAvailableListener(new ImageAvailableListener(i) {
@Override
@@ -889,11 +836,9 @@ public class CaptureModule implements CameraModule, PhotoController,
}, mImageAvailableHandler);
}
}
- mAutoFocusSupported = CameraUtil.isAutoFocusSupported(mCharacteristics,
- mCharacteristicsIndex);
+ mAutoFocusSupported = mSettingsManager.isAutoFocusSupported(mCameraIdList);
} catch (CameraAccessException e) {
e.printStackTrace();
- } catch (NullPointerException e) {
}
}
@@ -909,14 +854,8 @@ public class CaptureModule implements CameraModule, PhotoController,
builder.setTag(id);
builder.addTarget(getPreviewSurface(id));
- builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest
- .CONTROL_MODE_AUTO);
- builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
- builder.set(CaptureRequest.CONTROL_AF_TRIGGER,
- CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
- //Todo: Create applyCommonSettings function for settings applied everytime
- applyWhiteBalance(builder);
- applyZoom(builder, id);
+ applySettingsForUnlockFocus(builder, id);
+
mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler);
mState[id] = STATE_PREVIEW;
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
@@ -929,6 +868,13 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private Size parsePictureSize(String value) {
+ int indexX = value.indexOf('x');
+ int width = Integer.parseInt(value.substring(0, indexX));
+ int height = Integer.parseInt(value.substring(indexX + 1));
+ return new Size(width, height);
+ }
+
/**
* Closes the current {@link CameraDevice}.
*/
@@ -977,6 +923,48 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private void applySettingsForLockFocus(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
+ applyAFRegions(builder, id);
+ applyCommonSettings(builder, id);
+ }
+
+ private void applySettingsForCapture(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+ applyFlash(builder, id);
+ applyJpegQuality(builder);
+ applyCommonSettings(builder, id);
+ }
+
+ private void applySettingsForPrecapture(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+ applyFlash(builder, id);
+ applyCommonSettings(builder, id);
+ }
+
+ private void applySettingsForUnlockFocus(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_AF_TRIGGER,
+ CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
+ applyCommonSettings(builder, id);
+ }
+
+ private void applySettingsForAutoFocus(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest
+ .CONTROL_AF_TRIGGER_START);
+ applyAFRegions(builder, id);
+ applyCommonSettings(builder, id);
+ }
+
+ private void applyCommonSettings(CaptureRequest.Builder builder, int id) {
+ builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
+ builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
+ applyWhiteBalance(builder);
+ applyColorEffect(builder);
+ applySceneMode(builder);
+ applyZoom(builder, id);
+ }
+
/**
* Starts a background thread and its {@link Handler}.
*/
@@ -1060,8 +1048,7 @@ public class CaptureModule implements CameraModule, PhotoController,
Log.d(TAG, "onPause");
mUI.showPreviewCover();
if (mLocationManager != null) mLocationManager.recordLocation(false);
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- if(pref.getValue().equals(mActivity.getString(R.string.pref_camera_clearsight_value_on))) {
+ if(isClearSightOn()) {
ClearSightImageProcessor.getInstance().close();
}
closeCamera();
@@ -1076,24 +1063,29 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void onResumeAfterSuper() {
- Log.d(TAG, "onResume " + MODE);
- mCharacteristicsIndex = new ArrayList<>();
- startBackgroundThread();
+ Log.d(TAG, "onResume " + getMode());
+ mUI.setSwitcherIndex();
+ mCameraIdList = new ArrayList<>();
setUpCameraOutputs();
- readInitialValues();
+ startBackgroundThread();
Message msg = Message.obtain();
msg.what = OPEN_CAMERA;
- switch (MODE) {
- case DUAL_MODE:
- case BAYER_MODE:
- msg.obj = BAYER_ID;
- mCameraHandler.sendMessage(msg);
- break;
- case MONO_MODE:
- msg.what = OPEN_CAMERA;
- msg.obj = MONO_ID;
- mCameraHandler.sendMessage(msg);
- break;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ case BAYER_MODE:
+ msg.obj = BAYER_ID;
+ mCameraHandler.sendMessage(msg);
+ break;
+ case MONO_MODE:
+ msg.what = OPEN_CAMERA;
+ msg.obj = MONO_ID;
+ mCameraHandler.sendMessage(msg);
+ break;
+ }
+ } else {
+ msg.obj = FRONT_ID;
+ mCameraHandler.sendMessage(msg);
}
if (!mFirstTimeInitialized) {
initializeFirstTime();
@@ -1148,17 +1140,21 @@ public class CaptureModule implements CameraModule, PhotoController,
public void onZoomChanged(float requestedZoom) {
mZoomValue = requestedZoom;
- switch (MODE) {
- case DUAL_MODE:
- applyZoomAndUpdate(BAYER_ID);
- applyZoomAndUpdate(MONO_ID);
- break;
- case BAYER_MODE:
- applyZoomAndUpdate(BAYER_ID);
- break;
- case MONO_MODE:
- applyZoomAndUpdate(MONO_ID);
- break;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ applyZoomAndUpdate(BAYER_ID);
+ applyZoomAndUpdate(MONO_ID);
+ break;
+ case BAYER_MODE:
+ applyZoomAndUpdate(BAYER_ID);
+ break;
+ case MONO_MODE:
+ applyZoomAndUpdate(MONO_ID);
+ break;
+ }
+ } else {
+ applyZoomAndUpdate(FRONT_ID);
}
}
@@ -1211,29 +1207,37 @@ public class CaptureModule implements CameraModule, PhotoController,
Log.d(TAG, "onSingleTapUp " + x + " " + y);
mUI.setFocusPosition(x, y);
mUI.onFocusStarted();
- switch (MODE) {
- case DUAL_MODE:
- triggerFocusAtPoint(x, y, BAYER_ID);
- triggerFocusAtPoint(x, y, MONO_ID);
- break;
- case BAYER_MODE:
- triggerFocusAtPoint(x, y, BAYER_ID);
- break;
- case MONO_MODE:
- triggerFocusAtPoint(x, y, MONO_ID);
- break;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ triggerFocusAtPoint(x, y, BAYER_ID);
+ triggerFocusAtPoint(x, y, MONO_ID);
+ break;
+ case BAYER_MODE:
+ triggerFocusAtPoint(x, y, BAYER_ID);
+ break;
+ case MONO_MODE:
+ triggerFocusAtPoint(x, y, MONO_ID);
+ break;
+ }
+ } else {
+ triggerFocusAtPoint(x, y, FRONT_ID);
}
}
private int getMainCameraId() {
- switch (MODE) {
- case DUAL_MODE:
- case BAYER_MODE:
- return BAYER_ID;
- case MONO_MODE:
- return MONO_ID;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ case BAYER_MODE:
+ return BAYER_ID;
+ case MONO_MODE:
+ return MONO_ID;
+ }
+ return 0;
+ } else {
+ return FRONT_ID;
}
- return 0;
}
private boolean isTouchToFocusAllowed() {
@@ -1265,16 +1269,7 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void enableRecordingLocation(boolean enable) {
- Log.d(TAG, "CaptureModule enableRecordingLocation " + enable);
- setLocationPreference(enable ? RecordLocationPreference.VALUE_ON
- : RecordLocationPreference.VALUE_OFF);
- }
- private void setLocationPreference(String value) {
- mPreferences.edit()
- .putString(CameraSettings.KEY_RECORD_LOCATION, value)
- .apply();
- prefListener.onSharedPreferenceChanged();
}
@Override
@@ -1284,17 +1279,21 @@ public class CaptureModule implements CameraModule, PhotoController,
}
Log.d(TAG, "onPreviewUIReady");
mSurfaceReady = true;
- switch (MODE) {
- case DUAL_MODE:
- createSession(BAYER_ID);
- createSession(MONO_ID);
- break;
- case BAYER_MODE:
- createSession(BAYER_ID);
- break;
- case MONO_MODE:
- createSession(MONO_ID);
- break;
+ if (isBackMode()) {
+ switch (getMode()) {
+ case DUAL_MODE:
+ createSession(BAYER_ID);
+ createSession(MONO_ID);
+ break;
+ case BAYER_MODE:
+ createSession(BAYER_ID);
+ break;
+ case MONO_MODE:
+ createSession(MONO_ID);
+ break;
+ }
+ } else {
+ createSession(FRONT_ID);
}
}
@@ -1332,6 +1331,7 @@ public class CaptureModule implements CameraModule, PhotoController,
int oldOrientation = mOrientation;
mOrientation = CameraUtil.roundOrientation(orientation, mOrientation);
if (oldOrientation != mOrientation) {
+ mUI.onOrientationChanged();
mUI.setOrientation(mOrientation, true);
}
}
@@ -1345,8 +1345,7 @@ public class CaptureModule implements CameraModule, PhotoController,
public void onMediaSaveServiceConnected(MediaSaveService s) {
if (mFirstTimeInitialized) {
s.setListener(this);
- ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CLEARSIGHT);
- if(pref.getValue().equals(mActivity.getString(R.string.pref_camera_clearsight_value_on))) {
+ if (isClearSightOn()) {
ClearSightImageProcessor.getInstance().setMediaSaveService(s);
}
}
@@ -1364,13 +1363,7 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void onSwitchSavePath() {
- if (mUI.mMenuInitialized) {
- mUI.setPreference(CameraSettings.KEY_CAMERA_SAVEPATH, "1");
- } else {
- mPreferences.edit()
- .putString(CameraSettings.KEY_CAMERA_SAVEPATH, "1")
- .apply();
- }
+ mSettingsManager.setValue(SettingsManager.KEY_CAMERA_SAVEPATH, "1");
RotateTextToast.makeText(mActivity, R.string.on_switch_save_path_to_sdcard,
Toast.LENGTH_SHORT).show();
}
@@ -1390,39 +1383,24 @@ public class CaptureModule implements CameraModule, PhotoController,
}
- private boolean isFlashOff() {
- return readSetting(CameraSettings.KEY_FLASH_MODE).equals("off");
+ private boolean isFlashOff(int id) {
+ if (!mSettingsManager.isFlashSupported(id)) return true;
+ return mSettingsManager.getValue(SettingsManager.KEY_FLASH_MODE).equals("off");
}
private void initializePreviewConfiguration(int id) {
- mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_MODE, CaptureRequest
- .CONTROL_MODE_AUTO);
- mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest
- .CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest
.CONTROL_AF_TRIGGER_IDLE);
mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest
.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder[id].set(CaptureRequest.FLASH_MODE, CaptureRequest
.FLASH_MODE_OFF);
- applyWhiteBalance(mPreviewRequestBuilder[id]);
- applyZoom(mPreviewRequestBuilder[id], id);
- }
-
- private void readInitialValues() {
- for (int i = 0; i < mPreferenceGroup.size(); i++) {
- CameraPreference pref = mPreferenceGroup.get(i);
- if (pref instanceof ListPreference) {
- ListPreference listPref = (ListPreference) pref;
- storeSetting(listPref.getKey(), listPref.getValue());
- }
- }
+ applyCommonSettings(mPreviewRequestBuilder[id], id);
}
public Rect cropRegionForZoom(int id) {
Log.d(TAG, "cropRegionForZoom " + id);
- Rect activeRegion = mCharacteristics[id].get(CameraCharacteristics
- .SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+ Rect activeRegion = mSettingsManager.getSensorActiveArraySize(id);
Rect cropRegion = new Rect();
int xCenter = activeRegion.width() / 2;
@@ -1438,36 +1416,23 @@ public class CaptureModule implements CameraModule, PhotoController,
request.set(CaptureRequest.SCALER_CROP_REGION, cropRegionForZoom(id));
}
- private void applyCaptureSettings(CaptureRequest.Builder request, int id) {
- applyFlash(request);
- applyWhiteBalance(request);
- applyJpegQuality(request);
- applyZoom(request, id);
- }
-
- private void applyPreference(int cameraId, ListPreference pref) {
+ private boolean applyPreferenceToPreview(int cameraId, String key, String value) {
boolean updatePreview = false;
- String key = pref.getKey();
- String value = pref.getValue();
- storeSetting(key, value);
switch (key) {
- //Todo: CreateUISettings file and add UI preference settings to there
- case CameraSettings.KEY_JPEG_QUALITY:
- mJpegQuality = getQualityNumber(value);
- break;
- case CameraSettings.KEY_WHITE_BALANCE:
+ case SettingsManager.KEY_WHITE_BALANCE:
updatePreview = true;
applyWhiteBalance(mPreviewRequestBuilder[cameraId]);
break;
+ case SettingsManager.KEY_COLOR_EFFECT:
+ updatePreview = true;
+ applyColorEffect(mPreviewRequestBuilder[cameraId]);
+ break;
+ case SettingsManager.KEY_SCENE_MODE:
+ updatePreview = true;
+ applySceneMode(mPreviewRequestBuilder[cameraId]);
+ break;
}
- if (updatePreview) {
- try {
- mCaptureSession[cameraId].setRepeatingRequest(mPreviewRequestBuilder[cameraId]
- .build(), mCaptureCallback, mCameraHandler);
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
+ return updatePreview;
}
private void applyZoomAndUpdate(int id) {
@@ -1480,14 +1445,6 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
- private void storeSetting(String key, String value) {
- mSettings.put(key, value);
- }
-
- private String readSetting(String key) {
- return mSettings.get(key);
- }
-
private void applyJpegQuality(CaptureRequest.Builder request) {
request.set(CaptureRequest.JPEG_QUALITY, (byte) mJpegQuality);
}
@@ -1500,64 +1457,73 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
- private void applyWhiteBalance(CaptureRequest.Builder request) {
- String value = readSetting(CameraSettings.KEY_WHITE_BALANCE);
- switch (value) {
- case "incandescent":
- request.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest
- .CONTROL_AWB_MODE_INCANDESCENT);
- break;
- case "fluorescent":
- request.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest
- .CONTROL_AWB_MODE_FLUORESCENT);
- break;
- case "auto":
- request.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest
- .CONTROL_AWB_MODE_AUTO);
- break;
- case "daylight":
- request.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest
- .CONTROL_AWB_MODE_DAYLIGHT);
- break;
- case "cloudy-daylight":
- request.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest
- .CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
- break;
+ private void applySceneMode(CaptureRequest.Builder request) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE);
+ if (value == null) return;
+ int mode = Integer.parseInt(value);
+ if (mode != CaptureRequest.CONTROL_SCENE_MODE_DISABLED) {
+ request.set(CaptureRequest.CONTROL_SCENE_MODE, mode);
+ request.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
+ } else {
+ request.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
}
}
- private Surface getPreviewSurface(int id) {
- if (MODE == DUAL_MODE && id == MONO_ID) {
- return mUI.getSurfaceHolder2().getSurface();
- } else {
- return mUI.getSurfaceHolder().getSurface();
- }
+ private void applyColorEffect(CaptureRequest.Builder request) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_COLOR_EFFECT);
+ if (value == null) return;
+ int mode = Integer.parseInt(value);
+ request.set(CaptureRequest.CONTROL_EFFECT_MODE, mode);
+ }
+
+ private void applyWhiteBalance(CaptureRequest.Builder request) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_WHITE_BALANCE);
+ if (value == null) return;
+ int mode = Integer.parseInt(value);
+ request.set(CaptureRequest.CONTROL_AWB_MODE, mode);
}
private void applyFlash(CaptureRequest.Builder request, String value) {
- switch (value) {
- case "on":
- request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest
- .CONTROL_AE_MODE_ON_ALWAYS_FLASH);
+ int mode = Integer.parseInt(value);
+ String redeye = mSettingsManager.getValue(SettingsManager.KEY_REDEYE_REDUCTION);
+ request.set(CaptureRequest.CONTROL_AE_MODE, mode);
+ switch (mode) {
+ case CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH:
request.set(CaptureRequest.FLASH_MODE, CaptureRequest
.FLASH_MODE_SINGLE);
break;
- case "auto":
- request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest
- .CONTROL_AE_MODE_ON_AUTO_FLASH);
- break;
- case "off":
- request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest
- .CONTROL_AE_MODE_ON);
+ case CaptureRequest.CONTROL_AE_MODE_ON:
request.set(CaptureRequest.FLASH_MODE, CaptureRequest
.FLASH_MODE_OFF);
break;
+ case CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH:
+ if (redeye.equals("disable")) {
+ request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest
+ .CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
+ }
+ break;
}
}
- private void applyFlash(CaptureRequest.Builder request) {
- String value = readSetting(CameraSettings.KEY_FLASH_MODE);
- applyFlash(request, value);
+ private void applyFlash(CaptureRequest.Builder request, int id) {
+ if (mSettingsManager.isFlashSupported(id)) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_FLASH_MODE);
+ applyFlash(request, value);
+ } else {
+ request.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
+ }
+ }
+
+ private Surface getPreviewSurface(int id) {
+ if (isBackMode()) {
+ if (getMode() == DUAL_MODE && id == MONO_ID) {
+ return mUI.getSurfaceHolder2().getSurface();
+ } else {
+ return mUI.getSurfaceHolder().getSurface();
+ }
+ } else {
+ return mUI.getSurfaceHolder().getSurface();
+ }
}
@Override
@@ -1622,6 +1588,75 @@ public class CaptureModule implements CameraModule, PhotoController,
mLastResultAFState = resultAFState;
}
+ @Override
+ public void onSettingsChanged(List<SettingsManager.SettingState> settings) {
+ if (mPaused) return;
+ boolean updatePreviewBayer = false;
+ boolean updatePreviewMono = false;
+ boolean updatePreviewFront = false;
+ for (SettingsManager.SettingState settingState : settings) {
+
+ String key = settingState.key;
+ SettingsManager.Values values = settingState.values;
+ String value;
+ if (values.overriddenValue != null) {
+ value = values.overriddenValue;
+ } else {
+ value = values.value;
+ }
+ if (SettingsManager.KEY_CAMERA_SAVEPATH.equals(key)) {
+ Storage.setSaveSDCard(value.equals("1"));
+ mActivity.updateStorageSpaceAndHint();
+ continue;
+ }
+ if (SettingsManager.KEY_JPEG_QUALITY.equals(key)) {
+ mJpegQuality = getQualityNumber(value);
+ continue;
+ }
+
+ if (isBackMode()) {
+ switch (getMode()) {
+ case BAYER_MODE:
+ updatePreviewBayer |= applyPreferenceToPreview(BAYER_ID, key, value);
+ break;
+ case MONO_MODE:
+ updatePreviewMono |= applyPreferenceToPreview(MONO_ID, key, value);
+ break;
+ case DUAL_MODE:
+ updatePreviewBayer |= applyPreferenceToPreview(BAYER_ID, key, value);
+ updatePreviewMono |= applyPreferenceToPreview(MONO_ID, key, value);
+ break;
+ }
+ } else {
+ updatePreviewFront |= applyPreferenceToPreview(FRONT_ID, key, value);
+ }
+ }
+ if (updatePreviewBayer) {
+ try {
+ mCaptureSession[BAYER_ID].setRepeatingRequest(mPreviewRequestBuilder[BAYER_ID]
+ .build(), mCaptureCallback, mCameraHandler);
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ if (updatePreviewMono) {
+ try {
+ mCaptureSession[MONO_ID].setRepeatingRequest(mPreviewRequestBuilder[MONO_ID]
+ .build(), mCaptureCallback, mCameraHandler);
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ if (updatePreviewFront) {
+ try {
+ mCaptureSession[FRONT_ID].setRepeatingRequest(mPreviewRequestBuilder[FRONT_ID]
+ .build(), mCaptureCallback, mCameraHandler);
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
/**
* Compares two {@code Size}s based on their areas.
*/
diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java
index a6accae7b..0060f2c8b 100644
--- a/src/com/android/camera/CaptureUI.java
+++ b/src/com/android/camera/CaptureUI.java
@@ -19,37 +19,35 @@
package com.android.camera;
-import android.content.res.Configuration;
-import android.graphics.Matrix;
+import android.animation.Animator;
+import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Point;
-import android.graphics.RectF;
import android.graphics.drawable.AnimationDrawable;
import android.hardware.Camera.Face;
-import android.hardware.camera2.CameraCharacteristics;
+import android.text.TextUtils;
import android.util.Log;
+import android.view.Display;
import android.view.Gravity;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
-import android.view.SurfaceView;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
+import android.view.WindowManager;
import android.widget.FrameLayout;
-import android.widget.FrameLayout.LayoutParams;
+import android.widget.ImageView;
import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.PopupWindow;
+import android.widget.TextView;
-import com.android.camera.CameraPreference.OnPreferenceChangedListener;
-import com.android.camera.FocusOverlayManager.FocusUI;
+import com.android.camera.ui.AutoFitSurfaceView;
import com.android.camera.ui.CameraControls;
-import com.android.camera.ui.CameraRootView;
import com.android.camera.ui.FocusIndicator;
+import com.android.camera.ui.ListMenu;
import com.android.camera.ui.ListSubMenu;
import com.android.camera.ui.ModuleSwitcher;
import com.android.camera.ui.PieRenderer;
-import com.android.camera.ui.PieRenderer.PieListener;
import com.android.camera.ui.RenderOverlay;
import com.android.camera.ui.RotateImageView;
import com.android.camera.ui.RotateLayout;
@@ -60,150 +58,173 @@ import com.android.camera.util.CameraUtil;
import org.codeaurora.snapcam.R;
import java.util.List;
+import java.util.Locale;
-public class CaptureUI implements PieListener,
+public class CaptureUI implements FocusOverlayManager.FocusUI,
PreviewGestures.SingleTapListener,
- FocusUI,
- SurfaceHolder.Callback,
LocationManager.Listener,
- CameraRootView.MyDisplayListener,
- CameraManager.CameraFaceDetectionCallback {
-
+ CameraManager.CameraFaceDetectionCallback,
+ SettingsManager.Listener,
+ ListMenu.Listener,
+ ListSubMenu.Listener {
+ private static final int HIGHLIGHT_COLOR = 0xff33b5e5;
private static final String TAG = "SnapCam_CaptureUI";
+ private static final int SETTING_MENU_NONE = 0;
+ private static final int SETTING_MENU_IN_ANIMATION = 1;
+ private static final int SETTING_MENU_ON = 2;
+ private static final int SETTING_MENU_LEVEL_ONE = 0;
+ private static final int SETTING_MENU_LEVEL_TWO = 1;
+ private static final int SCENE_AND_FILTER_MENU_NONE = 0;
+ private static final int SCENE_AND_FILTER_MENU_IN_ANIMATION = 1;
+ private static final int SCENE_AND_FILTER_MENU_ON = 2;
+ private static final int MODE_FILTER = 0;
+ private static final int MODE_SCENE = 1;
+ private static final int ANIMATION_DURATION = 300;
+ private static final int CLICK_THRESHOLD = 200;
public boolean mMenuInitialized = false;
- private boolean surface1created = false;
- private boolean surface2created = false;
+ String[] mSettingKeys = new String[]{
+ SettingsManager.KEY_FLASH_MODE,
+ SettingsManager.KEY_RECORD_LOCATION,
+ SettingsManager.KEY_PICTURE_SIZE,
+ SettingsManager.KEY_JPEG_QUALITY,
+ SettingsManager.KEY_CAMERA_SAVEPATH,
+ SettingsManager.KEY_WHITE_BALANCE,
+ SettingsManager.KEY_CAMERA2,
+ SettingsManager.KEY_DUAL_CAMERA,
+ SettingsManager.KEY_CLEARSIGHT
+ };
+ String[] mDeveloperKeys = new String[]{
+ SettingsManager.KEY_FLASH_MODE,
+ SettingsManager.KEY_RECORD_LOCATION,
+ SettingsManager.KEY_PICTURE_SIZE,
+ SettingsManager.KEY_JPEG_QUALITY,
+ SettingsManager.KEY_CAMERA_SAVEPATH,
+ SettingsManager.KEY_WHITE_BALANCE,
+ SettingsManager.KEY_CAMERA2,
+ SettingsManager.KEY_DUAL_CAMERA,
+ SettingsManager.KEY_CLEARSIGHT,
+ SettingsManager.KEY_MONO_PREVIEW
+ };
private CameraActivity mActivity;
- private PhotoController mController;
- private PreviewGestures mGestures;
-
private View mRootView;
+ private View mPreviewCover;
+ private CaptureModule mModule;
+ private AutoFitSurfaceView mSurfaceView;
+ private AutoFitSurfaceView mSurfaceView2;
private SurfaceHolder mSurfaceHolder;
private SurfaceHolder mSurfaceHolder2;
+ private boolean surface1created = false;
+ private boolean surface2created = false;
+ private int mOrientation;
+ private RotateLayout mMenuLayout;
+ private RotateLayout mSubMenuLayout;
+ private int mSettingMenuState;
+ private int mSettingMenuLevel;
+ private int mSceneAndFilterMenuStatus;
+ private int mSceneAndFilterMenuMode;
+ private ListMenu mSettingMenu;
+ private ListSubMenu mSettingSubMenu;
+ private PreviewGestures mGestures;
+ private boolean mUIhidden = false;
+ private SettingsManager mSettingsManager;
private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
// SurfaceHolder callbacks
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ Log.v(TAG, "surfaceChanged: width =" + width + ", height = " + height);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
- mSurfaceHolder2 = holder;
- if (surface1created) mController.onPreviewUIReady();
- surface2created = true;
+ Log.v(TAG, "surfaceCreated");
+ mSurfaceHolder = holder;
+ if (surface2created) mModule.onPreviewUIReady();
+ surface1created = true;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
- mSurfaceHolder2 = null;
- surface2created = false;
+ Log.v(TAG, "surfaceDestroyed");
+ mSurfaceHolder = null;
+ surface1created = false;
+ mModule.onPreviewUIDestroyed();
}
};
- private PopupWindow mPopup;
+
private ShutterButton mShutterButton;
private RenderOverlay mRenderOverlay;
private View mMenuButton;
- private CaptureMenu mMenu;
private ModuleSwitcher mSwitcher;
private CameraControls mCameraControls;
- // Small indicators which show the camera settings in the viewfinder.
- private OnScreenIndicators mOnScreenIndicators;
private PieRenderer mPieRenderer;
private ZoomRenderer mZoomRenderer;
- private int mPreviewWidth = 0;
- private int mPreviewHeight = 0;
- private int mOriginalPreviewWidth = 0;
- private int mOriginalPreviewHeight = 0;
- private float mSurfaceTextureUncroppedWidth;
- private float mSurfaceTextureUncroppedHeight;
-
- private SurfaceView mSurfaceView = null;
- private SurfaceView mSurfaceView2 = null;
- private Matrix mMatrix = null;
- private boolean mAspectRatioResize;
-
- private boolean mOrientationResize;
- private boolean mPrevOrientationResize;
- private View mPreviewCover;
- private RotateLayout mMenuLayout;
- private RotateLayout mSubMenuLayout;
- private LinearLayout mPreviewMenuLayout;
- private boolean mUIhidden = false;
- private int mPreviewOrientation = -1;
private int mScreenRatio = CameraUtil.RATIO_UNKNOWN;
private int mTopMargin = 0;
private int mBottomMargin = 0;
+ private LinearLayout mSceneAndFilterLayout;
+ private int mSceneAndFilterMenuSize;
- private int mOrientation;
- private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() {
+ private View mFilterModeSwitcher;
+ private View mSceneModeSwitcher;
+ private View mFrontBackSwitcher;
+
+ private SurfaceHolder.Callback callback2 = new SurfaceHolder.Callback() {
+
+ // SurfaceHolder callbacks
@Override
- public void onLayoutChange(View v, int left, int top, int right,
- int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
- int width = right - left;
- int height = bottom - top;
-
- int orientation = mActivity.getResources().getConfiguration().orientation;
- if ((orientation == Configuration.ORIENTATION_PORTRAIT && width > height)
- || (orientation == Configuration.ORIENTATION_LANDSCAPE && width < height)) {
- // The screen has rotated; swap SurfaceView width & height
- // to ensure correct preview
- int oldWidth = width;
- width = height;
- height = oldWidth;
- Log.d(TAG, "Swapping SurfaceView width & height dimensions");
- if (mOriginalPreviewWidth != 0 && mOriginalPreviewHeight != 0) {
- int temp = mOriginalPreviewWidth;
- mOriginalPreviewWidth = mOriginalPreviewHeight;
- mOriginalPreviewHeight = temp;
- }
- }
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ }
- if (mPreviewWidth != width || mPreviewHeight != height
- || (mOrientationResize != mPrevOrientationResize)
- || mAspectRatioResize) {
- if (mOriginalPreviewWidth == 0) mOriginalPreviewWidth = width;
- if (mOriginalPreviewHeight == 0) mOriginalPreviewHeight = height;
- mPreviewWidth = width;
- mPreviewHeight = height;
- setTransformMatrix(mPreviewWidth, mPreviewHeight);
- mController.onScreenSizeChanged((int) mSurfaceTextureUncroppedWidth,
- (int) mSurfaceTextureUncroppedHeight);
- mAspectRatioResize = false;
- }
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ mSurfaceHolder2 = holder;
+ if (surface1created) mModule.onPreviewUIReady();
+ surface2created = true;
+ }
- if (mMenu != null)
- mMenu.tryToCloseSubList();
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ mSurfaceHolder2 = null;
+ surface2created = false;
}
};
- public CaptureUI(CameraActivity activity, PhotoController controller, View parent) {
+ public CaptureUI(CameraActivity activity, CaptureModule module, View parent) {
mActivity = activity;
- mController = controller;
+ mModule = module;
mRootView = parent;
+ mSettingsManager = SettingsManager.getInstance();
+ mSettingsManager.registerListener(this);
mActivity.getLayoutInflater().inflate(R.layout.capture_module,
(ViewGroup) mRootView, true);
mPreviewCover = mRootView.findViewById(R.id.preview_cover);
// display the view
- mSurfaceView = (SurfaceView) mRootView.findViewById(R.id.mdp_preview_content);
- mSurfaceView2 = (SurfaceView) mRootView.findViewById(R.id.mdp_preview_content2);
+ mSurfaceView = (AutoFitSurfaceView) mRootView.findViewById(R.id.mdp_preview_content);
+ mSurfaceView2 = (AutoFitSurfaceView) mRootView.findViewById(R.id.mdp_preview_content2);
mSurfaceView2.setZOrderMediaOverlay(true);
mSurfaceHolder = mSurfaceView.getHolder();
- mSurfaceHolder.addCallback(this);
+ mSurfaceHolder.addCallback(callback);
mSurfaceHolder2 = mSurfaceView2.getHolder();
- mSurfaceHolder2.addCallback(callback);
- Log.v(TAG, "Using mdp_preview_content (MDP path)");
+ mSurfaceHolder2.addCallback(callback2);
mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button);
+ mFilterModeSwitcher = mRootView.findViewById(R.id.filter_mode_switcher);
+ mSceneModeSwitcher = mRootView.findViewById(R.id.scene_mode_switcher);
+ mFrontBackSwitcher = mRootView.findViewById(R.id.front_back_switcher);
+ initFilterModeButton();
+ initSceneModeButton();
+ initSwitchCamera();
+
mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher);
mSwitcher.setCurrentIndex(ModuleSwitcher.PHOTO_MODULE_INDEX);
mSwitcher.setSwitchListener(mActivity);
- mSwitcher.setOnClickListener(new OnClickListener() {
+ mSwitcher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- if (mController.getCameraState() == PhotoController.LONGSHOT) {
+ if (mModule.getCameraState() == PhotoController.LONGSHOT) {
return;
}
mSwitcher.showPopup();
@@ -217,10 +238,6 @@ public class CaptureUI implements PieListener,
mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls);
- initIndicators();
- mOrientationResize = false;
- mPrevOrientationResize = false;
-
Point size = new Point();
mActivity.getWindowManager().getDefaultDisplay().getSize(size);
mScreenRatio = CameraUtil.determineRatio(size.x, size.y);
@@ -234,64 +251,11 @@ public class CaptureUI implements PieListener,
mCameraControls.setMargins(mTopMargin, mBottomMargin);
}
- private void setTransformMatrix(int width, int height) {
- mMatrix = mSurfaceView.getMatrix();
-
- // Calculate the new preview rectangle.
- RectF previewRect = new RectF(0, 0, width, height);
- mMatrix.mapRect(previewRect);
- mController.onPreviewRectChanged(CameraUtil.rectFToRect(previewRect));
- }
-
- // SurfaceHolder callbacks
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- Log.v(TAG, "surfaceChanged: width =" + width + ", height = " + height);
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.v(TAG, "surfaceCreated");
- mSurfaceHolder = holder;
- if (surface2created) mController.onPreviewUIReady();
- surface1created = true;
- if (mPreviewWidth != 0 && mPreviewHeight != 0) {
- // Re-apply transform matrix for new surface texture
- setTransformMatrix(mPreviewWidth, mPreviewHeight);
- }
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.v(TAG, "surfaceDestroyed");
- mSurfaceHolder = null;
- surface1created = false;
- mController.onPreviewUIDestroyed();
- }
-
- public View getRootView() {
- return mRootView;
- }
-
- private void initIndicators() {
- mOnScreenIndicators = new OnScreenIndicators(mActivity,
- mRootView.findViewById(R.id.on_screen_indicators));
- }
-
- public void onCameraOpened(CameraCharacteristics[] characteristics,
- List<Integer> characteristicsIndex, PreferenceGroup prefGroup,
- OnPreferenceChangedListener listener) {
+ public void onCameraOpened(List<Integer> cameraIds) {
if (mPieRenderer == null) {
mPieRenderer = new PieRenderer(mActivity);
- mPieRenderer.setPieListener(this);
mRenderOverlay.addRenderer(mPieRenderer);
}
-
- if (mMenu == null) {
- mMenu = new CaptureMenu(mActivity, this);
- mMenu.setListener(listener);
- }
- mMenu.initialize(prefGroup);
mMenuInitialized = true;
if (mZoomRenderer == null) {
@@ -304,209 +268,659 @@ public class CaptureUI implements PieListener,
mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer);
mRenderOverlay.setGestures(mGestures);
}
- mGestures.setCaptureMenu(mMenu);
+ mGestures.setCaptureUI(this); // need to handle touch
- mGestures.setZoomEnabled(CameraUtil.isZoomSupported(characteristics, characteristicsIndex));
+ mGestures.setZoomEnabled(mSettingsManager.isZoomSupported(cameraIds));
mGestures.setRenderOverlay(mRenderOverlay);
mRenderOverlay.requestLayout();
- initializeZoom(characteristics, characteristicsIndex);
+ initializeZoom(cameraIds);
mActivity.setPreviewGestures(mGestures);
}
- public void initializeControlByIntent() {
- mMenuButton = mRootView.findViewById(R.id.menu);
- mMenuButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mMenu != null) {
- mMenu.openFirstLevel();
- }
- }
- });
- }
-
- public void hideUI() {
- mSwitcher.closePopup();
- if (mUIhidden)
- return;
- mUIhidden = true;
- mCameraControls.hideUI();
- }
-
- public void showUI() {
- if (!mUIhidden || (mMenu != null && mMenu.isMenuBeingShown()))
- return;
- mUIhidden = false;
- mCameraControls.showUI();
- }
-
- public boolean arePreviewControlsVisible() {
- return !mUIhidden;
+ public ViewGroup getSceneAndFilterLayout() {
+ return mSceneAndFilterLayout;
}
// called from onResume but only the first time
public void initializeFirstTime() {
// Initialize shutter button.
mShutterButton.setImageResource(R.drawable.shutter_button_anim);
- mShutterButton.setOnClickListener(new OnClickListener() {
+ mShutterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!CameraControls.isAnimating())
doShutterAnimation();
}
});
- mShutterButton.setOnShutterButtonListener(mController);
+ mShutterButton.setOnShutterButtonListener(mModule);
mShutterButton.setVisibility(View.VISIBLE);
}
- // called from onResume every other time
- public void initializeSecondTime() {
- if (mMenu != null) {
- mMenu.reloadPreferences();
+ public void initializeZoom(List<Integer> ids) {
+ if (!mSettingsManager.isZoomSupported(ids) || (mZoomRenderer == null))
+ return;
+
+ Float zoomMax = mSettingsManager.getMaxZoom(ids);
+ mZoomRenderer.setZoomMax(zoomMax);
+ mZoomRenderer.setZoom(1f);
+ mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
+ }
+
+ public void enableGestures(boolean enable) {
+ if (mGestures != null) {
+ mGestures.setEnabled(enable);
}
}
- public void doShutterAnimation() {
- AnimationDrawable frameAnimation = (AnimationDrawable) mShutterButton.getDrawable();
- frameAnimation.stop();
- frameAnimation.start();
+ public boolean isPreviewMenuBeingShown() {
+ return mSceneAndFilterMenuStatus == SCENE_AND_FILTER_MENU_ON;
}
- public void initializeZoom(CameraCharacteristics[] characteristics,
- List<Integer> characteristicsIndex) {
- if ((characteristics == null) || !CameraUtil.isZoomSupported(characteristics,
- characteristicsIndex) || (mZoomRenderer == null))
- return;
- if (mZoomRenderer != null) {
- float zoomMax = Float.MAX_VALUE;
- for (int i = 0; i < characteristicsIndex.size(); i++) {
- zoomMax = Math.min(characteristics[characteristicsIndex.get(i)].get
- (CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM), zoomMax);
+ public void removeSceneAndFilterMenu(boolean animate) {
+ if (animate) {
+ animateSlideOut(mSceneAndFilterLayout);
+ } else {
+ mSceneAndFilterMenuStatus = SCENE_AND_FILTER_MENU_NONE;
+ if (mSceneAndFilterLayout != null) {
+ ((ViewGroup) mRootView).removeView(mSceneAndFilterLayout);
+ mSceneAndFilterLayout = null;
}
- mZoomRenderer.setZoomMax(zoomMax);
- mZoomRenderer.setZoom(1f);
- mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
}
}
- @Override
- public void showGpsOnScreenIndicator(boolean hasSignal) {
+ public void initSwitchCamera() {
+ mFrontBackSwitcher.setVisibility(View.INVISIBLE);
+ String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID);
+ if (value == null)
+ return;
+
+ int[] largeIcons = mSettingsManager.getResource(SettingsManager.KEY_CAMERA_ID,
+ SettingsManager.RESOURCE_TYPE_LARGEICON);
+ ((ImageView) mFrontBackSwitcher).setImageResource(largeIcons[mSettingsManager
+ .getValueIndex(SettingsManager.KEY_CAMERA_ID)]);
+ mFrontBackSwitcher.setVisibility(View.VISIBLE);
+ mFrontBackSwitcher.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID);
+ if (value == null)
+ return;
+
+ int index = mSettingsManager.getValueIndex(SettingsManager.KEY_CAMERA_ID);
+ CharSequence[] entries = mSettingsManager.getEntries(SettingsManager.KEY_CAMERA_ID);
+ index = (index + 1) % entries.length;
+ mSettingsManager.setValueIndex(SettingsManager.KEY_CAMERA_ID, index);
+ int[] largeIcons = mSettingsManager.getResource(SettingsManager.KEY_CAMERA_ID,
+ SettingsManager.RESOURCE_TYPE_LARGEICON);
+ ((ImageView) v).setImageResource(largeIcons[index]);
+ }
+ });
}
- @Override
- public void hideGpsOnScreenIndicator() {
+ public void initSceneModeButton() {
+ mSceneModeSwitcher.setVisibility(View.INVISIBLE);
+ String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE);
+ if (value == null) return;
+ updateSceneModeIcon();
+ mSceneModeSwitcher.setVisibility(View.VISIBLE);
+ mSceneModeSwitcher.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ addSceneMode();
+ ViewGroup menuLayout = getSceneAndFilterLayout();
+ if (menuLayout != null) {
+ View view = menuLayout.getChildAt(0);
+ adjustOrientation();
+ animateSlideIn(view, mSceneAndFilterMenuSize, false);
+ }
+ }
+ });
}
- public void overrideSettings(final String... keyvalues) {
- if (mMenu == null)
- return;
- mMenu.overrideSettings(keyvalues);
+ public void initFilterModeButton() {
+ mFilterModeSwitcher.setVisibility(View.INVISIBLE);
+ String value = mSettingsManager.getValue(SettingsManager.KEY_COLOR_EFFECT);
+ if (value == null) return;
+ changeFilterModeControlIcon(value);
+
+ updateFilterModeIcon(!mSettingsManager.isOverriden(SettingsManager.KEY_COLOR_EFFECT));
+ mFilterModeSwitcher.setVisibility(View.VISIBLE);
+ mFilterModeSwitcher.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ addFilterMode();
+ ViewGroup menuLayout = getSceneAndFilterLayout();
+ if (menuLayout != null) {
+ View view = getSceneAndFilterLayout().getChildAt(0);
+ adjustOrientation();
+ animateSlideIn(view, mSceneAndFilterMenuSize, false);
+ }
+ }
+ });
}
- public void enableGestures(boolean enable) {
- if (mGestures != null) {
- mGestures.setEnabled(enable);
+ public void setSwitcherIndex() {
+ mSwitcher.setCurrentIndex(ModuleSwitcher.PHOTO_MODULE_INDEX);
+ }
+
+ public void addSceneMode() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE);
+ if (value == null) return;
+
+ int rotation = CameraUtil.getDisplayRotation(mActivity);
+ boolean mIsDefaultToPortrait = CameraUtil.isDefaultToPortrait(mActivity);
+ if (!mIsDefaultToPortrait) {
+ rotation = (rotation + 90) % 360;
+ }
+ WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+ Display display = wm.getDefaultDisplay();
+
+ CharSequence[] entries = mSettingsManager.getEntries(SettingsManager.KEY_SCENE_MODE);
+
+ int[] thumbnails = mSettingsManager.getResource(SettingsManager.KEY_SCENE_MODE,
+ SettingsManager.RESOURCE_TYPE_THUMBNAIL);
+ Resources r = mActivity.getResources();
+ int height = (int) (r.getDimension(R.dimen.scene_mode_height) + 2
+ * r.getDimension(R.dimen.scene_mode_padding) + 1);
+ int width = (int) (r.getDimension(R.dimen.scene_mode_width) + 2
+ * r.getDimension(R.dimen.scene_mode_padding) + 1);
+
+ int gridRes;
+ boolean portrait = (rotation == 0) || (rotation == 180);
+ int size = height;
+ if (portrait) {
+ gridRes = R.layout.vertical_grid;
+ size = width;
+ } else {
+ gridRes = R.layout.horiz_grid;
+ }
+ mSceneAndFilterMenuSize = size;
+ hideUI();
+
+ LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ FrameLayout gridOuterLayout = (FrameLayout) inflater.inflate(
+ gridRes, null, false);
+
+ removeSceneAndFilterMenu(false);
+ mSceneAndFilterMenuStatus = SCENE_AND_FILTER_MENU_ON;
+ mSceneAndFilterMenuMode = MODE_SCENE;
+ mSceneAndFilterLayout = new LinearLayout(mActivity);
+ ViewGroup.LayoutParams params = null;
+ if (portrait) {
+ params = new ViewGroup.LayoutParams(size, FrameLayout.LayoutParams.MATCH_PARENT);
+ mSceneAndFilterLayout.setLayoutParams(params);
+ ((ViewGroup) mRootView).addView(mSceneAndFilterLayout);
+ } else {
+ params = new ViewGroup.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, size);
+ mSceneAndFilterLayout.setLayoutParams(params);
+ ((ViewGroup) mRootView).addView(mSceneAndFilterLayout);
+ mSceneAndFilterLayout.setY(display.getHeight() - size);
}
+ gridOuterLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams
+ .MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
+ LinearLayout gridLayout = (LinearLayout) gridOuterLayout.findViewById(R.id.layout);
+
+ final View[] views = new View[entries.length];
+ int init = mSettingsManager.getValueIndex(SettingsManager.KEY_SCENE_MODE);
+ for (int i = 0; i < entries.length; i++) {
+ RotateLayout sceneBox = (RotateLayout) inflater.inflate(
+ R.layout.scene_mode_view, null, false);
+
+ ImageView imageView = (ImageView) sceneBox.findViewById(R.id.image);
+ TextView label = (TextView) sceneBox.findViewById(R.id.label);
+ final int j = i;
+
+ sceneBox.setOnTouchListener(new View.OnTouchListener() {
+ private long startTime;
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ startTime = System.currentTimeMillis();
+ } else if (event.getAction() == MotionEvent.ACTION_UP) {
+ if (System.currentTimeMillis() - startTime < CLICK_THRESHOLD) {
+ mSettingsManager.setValueIndex(SettingsManager.KEY_SCENE_MODE, j);
+ updateSceneModeIcon();
+ for (View v1 : views) {
+ v1.setBackgroundResource(R.drawable.scene_mode_view_border);
+ }
+ View border = v.findViewById(R.id.border);
+ border.setBackgroundResource(R.drawable
+ .scene_mode_view_border_selected);
+ removeSceneAndFilterMenu(true);
+ }
+ }
+ return true;
+ }
+ });
+
+ View border = sceneBox.findViewById(R.id.border);
+ views[j] = border;
+ if (i == init)
+ border.setBackgroundResource(R.drawable.scene_mode_view_border_selected);
+
+ imageView.setImageResource(thumbnails[i]);
+ label.setText(entries[i]);
+ gridLayout.addView(sceneBox);
+ }
+ mSceneAndFilterLayout.addView(gridOuterLayout);
}
- // forward from preview gestures to controller
- @Override
- public void onSingleTapUp(View view, int x, int y) {
- mController.onSingleTapUp(view, x, y);
+ public void updateSceneModeIcon() {
+ int[] thumbnails = mSettingsManager.getResource(SettingsManager.KEY_SCENE_MODE,
+ SettingsManager.RESOURCE_TYPE_THUMBNAIL);
+ int thumbnail = thumbnails[mSettingsManager.getValueIndex(SettingsManager
+ .KEY_SCENE_MODE)];
+ if (thumbnail == -1)
+ thumbnail = 0;
+ ((ImageView) mSceneModeSwitcher).setImageResource(thumbnail);
}
- public boolean onBackPressed() {
- if (mMenu != null && mMenu.handleBackKey()) {
- return true;
+ public void addFilterMode() {
+ if (mSettingsManager.getValue(SettingsManager.KEY_COLOR_EFFECT) == null)
+ return;
+
+ int rotation = CameraUtil.getDisplayRotation(mActivity);
+ boolean mIsDefaultToPortrait = CameraUtil.isDefaultToPortrait(mActivity);
+ if (!mIsDefaultToPortrait) {
+ rotation = (rotation + 90) % 360;
+ }
+ WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+ Display display = wm.getDefaultDisplay();
+ CharSequence[] entries = mSettingsManager.getEntries(SettingsManager.KEY_COLOR_EFFECT);
+
+ Resources r = mActivity.getResources();
+ int height = (int) (r.getDimension(R.dimen.filter_mode_height) + 2
+ * r.getDimension(R.dimen.filter_mode_padding) + 1);
+ int width = (int) (r.getDimension(R.dimen.filter_mode_width) + 2
+ * r.getDimension(R.dimen.filter_mode_padding) + 1);
+
+ int gridRes;
+ boolean portrait = (rotation == 0) || (rotation == 180);
+ int size = height;
+ if (portrait) {
+ gridRes = R.layout.vertical_grid;
+ size = width;
+ } else {
+ gridRes = R.layout.horiz_grid;
}
+ mSceneAndFilterMenuSize = size;
+ hideUI();
- if (mPieRenderer != null && mPieRenderer.showsItems()) {
- mPieRenderer.hide();
- return true;
+ int[] thumbnails = mSettingsManager.getResource(SettingsManager.KEY_COLOR_EFFECT,
+ SettingsManager.RESOURCE_TYPE_THUMBNAIL);
+ LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ FrameLayout gridOuterLayout = (FrameLayout) inflater.inflate(
+ gridRes, null, false);
+
+ removeSceneAndFilterMenu(false);
+ mSceneAndFilterMenuStatus = SCENE_AND_FILTER_MENU_ON;
+ mSceneAndFilterMenuMode = MODE_FILTER;
+ mSceneAndFilterLayout = new LinearLayout(mActivity);
+
+ ViewGroup.LayoutParams params = null;
+ if (portrait) {
+ params = new ViewGroup.LayoutParams(size, FrameLayout.LayoutParams.MATCH_PARENT);
+ mSceneAndFilterLayout.setLayoutParams(params);
+ ((ViewGroup) mRootView).addView(mSceneAndFilterLayout);
+ } else {
+ params = new ViewGroup.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, size);
+ mSceneAndFilterLayout.setLayoutParams(params);
+ ((ViewGroup) mRootView).addView(mSceneAndFilterLayout);
+ mSceneAndFilterLayout.setY(display.getHeight() - size);
}
- // In image capture mode, back button should:
- // 1) if there is any popup, dismiss them, 2) otherwise, get out of
- // image capture
- if (mController.isImageCaptureIntent()) {
- mController.onCaptureCancelled();
- return true;
- } else if (!mController.isCameraIdle()) {
- // ignore backs while we're taking a picture
- return true;
+ gridOuterLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams
+ .MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
+ LinearLayout gridLayout = (LinearLayout) gridOuterLayout.findViewById(R.id.layout);
+ final View[] views = new View[entries.length];
+
+ int init = mSettingsManager.getValueIndex(SettingsManager.KEY_COLOR_EFFECT);
+ for (int i = 0; i < entries.length; i++) {
+ RotateLayout filterBox = (RotateLayout) inflater.inflate(
+ R.layout.filter_mode_view, null, false);
+ ImageView imageView = (ImageView) filterBox.findViewById(R.id.image);
+ final int j = i;
+
+ filterBox.setOnTouchListener(new View.OnTouchListener() {
+ private long startTime;
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ startTime = System.currentTimeMillis();
+ } else if (event.getAction() == MotionEvent.ACTION_UP) {
+ if (System.currentTimeMillis() - startTime < CLICK_THRESHOLD) {
+ mSettingsManager.setValueIndex(SettingsManager
+ .KEY_COLOR_EFFECT, j);
+ for (View v1 : views) {
+ v1.setBackground(null);
+ }
+ ImageView image = (ImageView) v.findViewById(R.id.image);
+ image.setBackgroundColor(HIGHLIGHT_COLOR);
+ }
+ }
+ return true;
+ }
+ });
+
+ views[j] = imageView;
+ if (i == init)
+ imageView.setBackgroundColor(HIGHLIGHT_COLOR);
+ TextView label = (TextView) filterBox.findViewById(R.id.label);
+
+ imageView.setImageResource(thumbnails[i]);
+ label.setText(entries[i]);
+ gridLayout.addView(filterBox);
}
- if (mSwitcher != null && mSwitcher.showsPopup()) {
- mSwitcher.closePopup();
- return true;
+ mSceneAndFilterLayout.addView(gridOuterLayout);
+ }
+
+ private void changeFilterModeControlIcon(String value) {
+ int index;
+ if (value.equals("0")) {
+ index = 0;
} else {
- return false;
+ index = 1;
}
+ ImageView iv = (ImageView) mFilterModeSwitcher;
+ iv.setImageResource(mSettingsManager.getResource(SettingsManager
+ .KEY_COLOR_EFFECT, SettingsManager.RESOURCE_TYPE_LARGEICON)[index]);
}
- public void onPreviewFocusChanged(boolean previewFocused) {
- if (previewFocused) {
- showUI();
+ private void updateFilterModeIcon(boolean enable) {
+ buttonSetEnabled(mFilterModeSwitcher, enable);
+ }
+
+ private void buttonSetEnabled(View v, boolean enable) {
+ v.setEnabled(enable);
+ if (v instanceof ViewGroup) {
+ View v2 = ((ViewGroup) v).getChildAt(0);
+ if (v2 != null)
+ v2.setEnabled(enable);
+ }
+ }
+
+ private void animateFadeOut(final View v, final int level) {
+ if (v == null || mSettingMenuState == SETTING_MENU_IN_ANIMATION)
+ return;
+ mSettingMenuState = SETTING_MENU_IN_ANIMATION;
+
+ ViewPropertyAnimator vp = v.animate();
+ vp.alpha(0f).setDuration(ANIMATION_DURATION);
+ vp.setListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finishSettingMenuAnimateOut(level);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ finishSettingMenuAnimateOut(level);
+ }
+ });
+ vp.start();
+ }
+
+ private void animateSlideOut(final View v, final int level) {
+ if (v == null || mSettingMenuState == SETTING_MENU_IN_ANIMATION)
+ return;
+ mSettingMenuState = SETTING_MENU_IN_ANIMATION;
+ ViewPropertyAnimator vp = v.animate();
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ switch (getOrientation()) {
+ case 0:
+ vp.translationXBy(v.getWidth());
+ break;
+ case 90:
+ vp.translationYBy(-2 * v.getHeight());
+ break;
+ case 180:
+ vp.translationXBy(-2 * v.getWidth());
+ break;
+ case 270:
+ vp.translationYBy(v.getHeight());
+ break;
+ }
} else {
- hideUI();
+ switch (getOrientation()) {
+ case 0:
+ vp.translationXBy(-v.getWidth());
+ break;
+ case 90:
+ vp.translationYBy(2 * v.getHeight());
+ break;
+ case 180:
+ vp.translationXBy(2 * v.getWidth());
+ break;
+ case 270:
+ vp.translationYBy(-v.getHeight());
+ break;
+ }
}
- if (mGestures != null) {
- mGestures.setEnabled(previewFocused);
+ vp.setListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finishSettingMenuAnimateOut(level);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ finishSettingMenuAnimateOut(level);
+ }
+ });
+ vp.setDuration(ANIMATION_DURATION).start();
+ }
+
+ private void finishSettingMenuAnimateOut(int level) {
+ if (level == SETTING_MENU_LEVEL_ONE) {
+ mSettingMenuState = SETTING_MENU_ON;
+ removeSettingMenu(level, false);
+ cleanUpMenus();
+ } else if (level == SETTING_MENU_LEVEL_TWO) {
+ mSettingMenuState = SETTING_MENU_ON;
+ removeSettingMenu(level, false);
}
- if (mRenderOverlay != null) {
- // this can not happen in capture mode
- mRenderOverlay.setVisibility(previewFocused ? View.VISIBLE : View.GONE);
+ }
+
+ private void finishScenceAndFilterMenuAnimateOut() {
+ removeSceneAndFilterMenu(false);
+ cleanUpMenus();
+ }
+
+ public void animateFadeIn(View v) {
+ ViewPropertyAnimator vp = v.animate();
+ vp.alpha(0.85f).setDuration(ANIMATION_DURATION);
+ vp.start();
+ }
+
+ private void animateSlideOut(final View v) {
+ if (v == null || mSceneAndFilterMenuStatus == SCENE_AND_FILTER_MENU_IN_ANIMATION)
+ return;
+ mSceneAndFilterMenuStatus = SCENE_AND_FILTER_MENU_IN_ANIMATION;
+
+ ViewPropertyAnimator vp = v.animate();
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ vp.translationXBy(v.getWidth()).setDuration(ANIMATION_DURATION);
+ } else {
+ vp.translationXBy(-v.getWidth()).setDuration(ANIMATION_DURATION);
}
- if (mPieRenderer != null) {
- mPieRenderer.setBlockFocus(!previewFocused);
+ vp.setListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finishScenceAndFilterMenuAnimateOut();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ finishScenceAndFilterMenuAnimateOut();
+ }
+ });
+ vp.start();
+ }
+
+ public void animateSlideIn(View v, int delta, boolean forcePortrait) {
+ int orientation = getOrientation();
+ if (!forcePortrait)
+ orientation = 0;
+
+ ViewPropertyAnimator vp = v.animate();
+ float dest;
+ if (View.LAYOUT_DIRECTION_RTL == TextUtils
+ .getLayoutDirectionFromLocale(Locale.getDefault())) {
+ switch (orientation) {
+ case 0:
+ dest = v.getX();
+ v.setX(-(dest - delta));
+ vp.translationX(dest);
+ break;
+ case 90:
+ dest = v.getY();
+ v.setY(-(dest + delta));
+ vp.translationY(dest);
+ break;
+ case 180:
+ dest = v.getX();
+ v.setX(-(dest + delta));
+ vp.translationX(dest);
+ break;
+ case 270:
+ dest = v.getY();
+ v.setY(-(dest - delta));
+ vp.translationY(dest);
+ break;
+ }
+ } else {
+ switch (orientation) {
+ case 0:
+ dest = v.getX();
+ v.setX(dest - delta);
+ vp.translationX(dest);
+ break;
+ case 90:
+ dest = v.getY();
+ v.setY(dest + delta);
+ vp.translationY(dest);
+ break;
+ case 180:
+ dest = v.getX();
+ v.setX(dest + delta);
+ vp.translationX(dest);
+ break;
+ case 270:
+ dest = v.getY();
+ v.setY(dest - delta);
+ vp.translationY(dest);
+ break;
+ }
}
- setShowMenu(previewFocused);
+ vp.setDuration(ANIMATION_DURATION).start();
}
- public ViewGroup getMenuLayout() {
- return mMenuLayout;
+ private void initializeSettingMenu() {
+ LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ mSettingMenu = (ListMenu) inflater.inflate(
+ R.layout.list_menu, null, false);
+
+ mSettingMenu.setSettingChangedListener(this);
+ mSettingMenu.setSettingsManager(mSettingsManager);
+
+ String[] keys = mSettingKeys;
+ if (mActivity.isDeveloperMenuEnabled())
+ keys = mDeveloperKeys;
+ mSettingMenu.initializeForCamera2(keys);
+ }
+
+ public boolean isMenuBeingShown() {
+ return mSettingMenuState != SETTING_MENU_NONE;
}
- public void showPopup(ListView popup, int level, boolean animate) {
+ public boolean isMenuBeingAnimated() {
+ return mSettingMenuState == SETTING_MENU_IN_ANIMATION;
+ }
+
+
+ public void showSettingMenu() {
+ if (isMenuBeingShown() || CameraControls.isAnimating()) {
+ return;
+ }
+ if (mSettingMenu == null) {
+ initializeSettingMenu();
+ }
+ showSettingMenu(SETTING_MENU_LEVEL_ONE, true);
+ }
+
+ private void showSettingMenu(int level, boolean animate) {
FrameLayout.LayoutParams params;
hideUI();
- popup.setVisibility(View.VISIBLE);
- if (level == 1) {
+ mSettingMenu.setVisibility(View.VISIBLE);
+ mSettingMenuState = SETTING_MENU_ON;
+ if (level == SETTING_MENU_LEVEL_ONE) {
+ mSettingMenuLevel = SETTING_MENU_LEVEL_ONE;
if (mMenuLayout == null) {
mMenuLayout = new RotateLayout(mActivity, null);
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
- params = new FrameLayout.LayoutParams(
- CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT,
- Gravity.LEFT | Gravity.TOP);
+ params = new FrameLayout.LayoutParams(CameraActivity.SETTING_LIST_WIDTH_1,
+ FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP);
} else {
- params = new FrameLayout.LayoutParams(
- CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT,
- Gravity.RIGHT | Gravity.TOP);
+ params = new FrameLayout.LayoutParams(CameraActivity.SETTING_LIST_WIDTH_1,
+ FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.RIGHT | Gravity.TOP);
}
mMenuLayout.setLayoutParams(params);
((ViewGroup) mRootView).addView(mMenuLayout);
}
mMenuLayout.setOrientation(mOrientation, true);
- mMenuLayout.addView(popup);
- }
- if (level == 2) {
+ mMenuLayout.addView(mSettingMenu);
+ } else if (level == SETTING_MENU_LEVEL_TWO) {
+ mSettingMenuLevel = SETTING_MENU_LEVEL_TWO;
if (mSubMenuLayout == null) {
mSubMenuLayout = new RotateLayout(mActivity, null);
((ViewGroup) mRootView).addView(mSubMenuLayout);
}
if (mRootView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
- params = new FrameLayout.LayoutParams(
- CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT,
- Gravity.LEFT | Gravity.TOP);
+ params = new FrameLayout.LayoutParams(CameraActivity.SETTING_LIST_WIDTH_2,
+ FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP);
} else {
- params = new FrameLayout.LayoutParams(
- CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT,
- Gravity.RIGHT | Gravity.TOP);
+ params = new FrameLayout.LayoutParams(CameraActivity.SETTING_LIST_WIDTH_2,
+ FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.RIGHT | Gravity.TOP);
}
int screenHeight = (mOrientation == 0 || mOrientation == 180)
? mRootView.getHeight() : mRootView.getWidth();
- int height = ((ListSubMenu) popup).getPreCalculatedHeight();
- int yBase = ((ListSubMenu) popup).getYBase();
+ int height = mSettingSubMenu.getPreCalculatedHeight();
+ int yBase = mSettingSubMenu.getYBase();
int y = Math.max(0, yBase);
if (yBase + height > screenHeight)
y = Math.max(0, screenHeight - height);
@@ -518,112 +932,117 @@ public class CaptureUI implements PieListener,
mSubMenuLayout.setLayoutParams(params);
- mSubMenuLayout.addView(popup);
+ mSubMenuLayout.addView(mSettingSubMenu);
mSubMenuLayout.setOrientation(mOrientation, true);
}
if (animate) {
- if (level == 1)
- mMenu.animateSlideIn(mMenuLayout, CameraActivity.SETTING_LIST_WIDTH_1, true);
- if (level == 2)
- mMenu.animateFadeIn(popup);
- } else
- popup.setAlpha(0.85f);
- }
-
- public void removeLevel2() {
- if (mSubMenuLayout != null) {
- View v = mSubMenuLayout.getChildAt(0);
- mSubMenuLayout.removeView(v);
+ if (level == SETTING_MENU_LEVEL_ONE) {
+ animateSlideIn(mMenuLayout, CameraActivity.SETTING_LIST_WIDTH_1, true);
+ }
+ if (level == SETTING_MENU_LEVEL_TWO) {
+ animateFadeIn(mSettingSubMenu);
+ }
+ } else {
+ if (level == SETTING_MENU_LEVEL_ONE) {
+ mMenuLayout.setAlpha(0.85f);
+ }
+ if (level == SETTING_MENU_LEVEL_TWO) {
+ mSettingSubMenu.setAlpha(0.85f);
+ }
}
}
- public void cleanupListview() {
- showUI();
- mActivity.setSystemBarsVisibility(false);
- }
-
- public void dismissAllPopup() {
- if (mPopup != null && mPopup.isShowing()) {
- mPopup.dismiss();
- }
+ public void initializeControlByIntent() {
+ mMenuButton = mRootView.findViewById(R.id.menu);
+ mMenuButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showSettingMenu();
+ }
+ });
}
- public void dismissLevel1() {
- if (mMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mMenuLayout);
- mMenuLayout = null;
- }
+ public void doShutterAnimation() {
+ AnimationDrawable frameAnimation = (AnimationDrawable) mShutterButton.getDrawable();
+ frameAnimation.stop();
+ frameAnimation.start();
}
- public void dismissLevel2() {
- if (mSubMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mSubMenuLayout);
- mSubMenuLayout = null;
- }
+ public void showUI() {
+ if (!mUIhidden || isMenuBeingShown())
+ return;
+ mUIhidden = false;
+ mCameraControls.showUI();
}
- public boolean sendTouchToPreviewMenu(MotionEvent ev) {
- return mPreviewMenuLayout.dispatchTouchEvent(ev);
+ public void hideUI() {
+ mSwitcher.closePopup();
+ if (mUIhidden)
+ return;
+ mUIhidden = true;
+ mCameraControls.hideUI();
}
- public boolean sendTouchToMenu(MotionEvent ev) {
- if (mMenuLayout != null) {
- View v = mMenuLayout.getChildAt(0);
- return v.dispatchTouchEvent(ev);
- }
- return false;
+ public void cleanUpMenus() {
+ showUI();
+ mActivity.setSystemBarsVisibility(false);
}
- public void dismissSceneModeMenu() {
- if (mPreviewMenuLayout != null) {
- ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
- mPreviewMenuLayout = null;
- }
+ public boolean arePreviewControlsVisible() {
+ return !mUIhidden;
}
- public void onShowSwitcherPopup() {
- if (mPieRenderer != null && mPieRenderer.showsItems()) {
- mPieRenderer.hide();
- }
+ public void onOrientationChanged() {
+ removeSettingMenu(SETTING_MENU_LEVEL_TWO, false);
+ if (mSettingMenu != null)
+ mSettingMenu.resetHighlight();
}
- private void setShowMenu(boolean show) {
- if (mOnScreenIndicators != null) {
- mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
- }
+ public void removeAllSettingMenu(boolean animate) {
+ removeSettingMenu(SETTING_MENU_LEVEL_TWO, false);
+ removeSettingMenu(SETTING_MENU_LEVEL_ONE, animate);
}
- public boolean collapseCameraControls() {
- // TODO: Mode switcher should behave like a popup and should hide itself when there
- // is a touch outside of it.
- mSwitcher.closePopup();
- // Remove all the popups/dialog boxes
- boolean ret = false;
- if (mMenu != null) {
- mMenu.removeAllView();
- }
- if (mPopup != null) {
- dismissAllPopup();
- ret = true;
- }
- onShowSwitcherPopup();
- return ret;
+ public void removeAllSettingMenu() {
+ removeAllSettingMenu(false);
}
- public void setDisplayOrientation(int orientation) {
- if ((mPreviewOrientation == -1 || mPreviewOrientation != orientation)
- && mMenu != null && mMenu.isPreviewMenuBeingShown()) {
- dismissSceneModeMenu();
+ public void removeSettingMenu(int level, boolean animate) {
+ if (mSettingMenuState == SETTING_MENU_NONE)
+ return;
+ if (!animate) {
+ if (level == SETTING_MENU_LEVEL_TWO) {
+ if (mSubMenuLayout != null) {
+ mSubMenuLayout.removeView(mSubMenuLayout.getChildAt(0));
+ mSubMenuLayout = null;
+ }
+ mSettingSubMenu = null;
+ mSettingMenuState = SETTING_MENU_ON;
+ mSettingMenuLevel = SETTING_MENU_LEVEL_ONE;
+ } else if (level == SETTING_MENU_LEVEL_ONE) {
+ mSettingMenu.resetHighlight();
+ if (mMenuLayout != null) {
+ mMenuLayout.removeView(mMenuLayout.getChildAt(0));
+ mMenuLayout = null;
+ }
+ mSettingMenu = null;
+ mSettingMenuState = SETTING_MENU_NONE;
+ cleanUpMenus();
+ }
+ } else {
+ if (level == SETTING_MENU_LEVEL_TWO) {
+ mSettingMenu.resetHighlight();
+ animateFadeOut(mSettingSubMenu, level);
+ } else if (level == SETTING_MENU_LEVEL_ONE) {
+ animateSlideOut(mSettingMenu, level);
+ }
}
- mPreviewOrientation = orientation;
}
- public boolean isShutterPressed() {
- return mShutterButton.isPressed();
+ public void removeAllMenu() {
+ removeAllSettingMenu();
}
- // shutter button handling
-
/**
* Enables or disables the shutter button.
*/
@@ -633,29 +1052,36 @@ public class CaptureUI implements PieListener,
}
}
- public void pressShutterButton() {
- if (mShutterButton.isInTouchMode()) {
- mShutterButton.requestFocusFromTouch();
- } else {
- mShutterButton.requestFocus();
+ private boolean handleBackKeyOnMenu() {
+ if (mSceneAndFilterMenuStatus == SCENE_AND_FILTER_MENU_ON) {
+ removeSceneAndFilterMenu(true);
+ return true;
}
- mShutterButton.setPressed(true);
- }
-
- @Override
- public void onPieOpened(int centerX, int centerY) {
- setSwipingEnabled(false);
- // Close module selection menu when pie menu is opened.
- mSwitcher.closePopup();
+ if (mSettingMenuState == SETTING_MENU_NONE)
+ return false;
+ if (mSettingMenuState == SETTING_MENU_ON) {
+ removeSettingMenu(mSettingMenuLevel, true);
+ }
+ return true;
}
- @Override
- public void onPieClosed() {
- setSwipingEnabled(true);
- }
+ public boolean onBackPressed() {
+ if (handleBackKeyOnMenu()) return true;
+ if (mPieRenderer != null && mPieRenderer.showsItems()) {
+ mPieRenderer.hide();
+ return true;
+ }
- public void setSwipingEnabled(boolean enable) {
- mActivity.setSwipingEnabled(enable);
+ if (!mModule.isCameraIdle()) {
+ // ignore backs while we're taking a picture
+ return true;
+ }
+ if (mSwitcher != null && mSwitcher.showsPopup()) {
+ mSwitcher.closePopup();
+ return true;
+ } else {
+ return false;
+ }
}
public SurfaceHolder getSurfaceHolder() {
@@ -677,20 +1103,22 @@ public class CaptureUI implements PieListener,
}
}
- public void hideSurfaceView() {
- mSurfaceView.setVisibility(View.INVISIBLE);
- }
-
- public void showSurfaceView() {
- mSurfaceView.setVisibility(View.VISIBLE);
- }
-
public void onPause() {
// Clear UI.
collapseCameraControls();
}
- // focus UI implementation
+ public boolean collapseCameraControls() {
+ // TODO: Mode switcher should behave like a popup and should hide itself when there
+ // is a touch outside of it.
+ mSwitcher.closePopup();
+ // Remove all the popups/dialog boxes
+ boolean ret = false;
+ removeAllMenu();
+ mCameraControls.showRefocusToast(false);
+ return ret;
+ }
+
private FocusIndicator getFocusIndicator() {
return mPieRenderer;
}
@@ -703,10 +1131,6 @@ public class CaptureUI implements PieListener,
public void clearFaces() {
}
- public void setPreference(String key, String value) {
- mMenu.setPreference(key, value);
- }
-
@Override
public void clearFocus() {
FocusIndicator indicator = getFocusIndicator();
@@ -731,13 +1155,13 @@ public class CaptureUI implements PieListener,
}
@Override
- public void onFocusFailed(boolean timeout) {
- FocusIndicator indicator = getFocusIndicator();
- if (indicator != null) indicator.showFail(timeout);
+ public void onFocusFailed(boolean timeOut) {
+
}
@Override
public void pauseFaceDetection() {
+
}
@Override
@@ -754,11 +1178,20 @@ public class CaptureUI implements PieListener,
public void onFaceDetection(Face[] faces, CameraManager.CameraProxy camera) {
}
- @Override
- public void onDisplayChanged() {
- Log.d(TAG, "Device flip detected.");
- mCameraControls.checkLayoutFlip();
- mController.updateCameraOrientation();
+ public Point getSurfaceViewSize() {
+ Point point = new Point();
+ if (mSurfaceView != null) point.set(mSurfaceView.getWidth(), mSurfaceView.getHeight());
+ return point;
+ }
+
+ public Point getSurfaceView2Size() {
+ Point point = new Point();
+ if (mSurfaceView2 != null) point.set(mSurfaceView2.getWidth(), mSurfaceView2.getHeight());
+ return point;
+ }
+
+ public void adjustOrientation() {
+ setOrientation(mOrientation, true);
}
public void setOrientation(int orientation, boolean animation) {
@@ -768,8 +1201,8 @@ public class CaptureUI implements PieListener,
mMenuLayout.setOrientation(orientation, animation);
if (mSubMenuLayout != null)
mSubMenuLayout.setOrientation(orientation, animation);
- if (mPreviewMenuLayout != null) {
- ViewGroup vg = (ViewGroup) mPreviewMenuLayout.getChildAt(0);
+ if (mSceneAndFilterLayout != null) {
+ ViewGroup vg = (ViewGroup) mSceneAndFilterLayout.getChildAt(0);
if (vg != null)
vg = (ViewGroup) vg.getChildAt(0);
if (vg != null) {
@@ -779,33 +1212,145 @@ public class CaptureUI implements PieListener,
}
}
}
-
RotateTextToast.setOrientation(orientation);
if (mZoomRenderer != null) {
mZoomRenderer.setOrientation(orientation);
}
}
- public Point getSurfaceViewSize() {
- Point point = new Point();
- if (mSurfaceView != null) point.set(mSurfaceView.getWidth(), mSurfaceView.getHeight());
- return point;
+ public int getOrientation() {
+ return mOrientation;
}
- public Point getSurfaceView2Size() {
- Point point = new Point();
- if (mSurfaceView2 != null) point.set(mSurfaceView2.getWidth(), mSurfaceView2.getHeight());
- return point;
+ @Override
+ public void showGpsOnScreenIndicator(boolean hasSignal) {
+
}
- public int getOrientation() {
- return mOrientation;
+ @Override
+ public void hideGpsOnScreenIndicator() {
+
+ }
+
+ @Override
+ public void onSingleTapUp(View view, int x, int y) {
+ mModule.onSingleTapUp(view, x, y);
+ }
+
+ public void onPreviewFocusChanged(boolean previewFocused) {
+ if (previewFocused) {
+ showUI();
+ } else {
+ hideUI();
+ }
+ if (mGestures != null) {
+ mGestures.setEnabled(previewFocused);
+ }
+ if (mRenderOverlay != null) {
+ // this can not happen in capture mode
+ mRenderOverlay.setVisibility(previewFocused ? View.VISIBLE : View.GONE);
+ }
+ if (mPieRenderer != null) {
+ mPieRenderer.setBlockFocus(!previewFocused);
+ }
+ }
+
+ public ViewGroup getMenuLayout() {
+ return mMenuLayout;
+ }
+
+ public boolean isShutterPressed() {
+ return mShutterButton.isPressed();
+ }
+
+ public void pressShutterButton() {
+ if (mShutterButton.isInTouchMode()) {
+ mShutterButton.requestFocusFromTouch();
+ } else {
+ mShutterButton.requestFocus();
+ }
+ mShutterButton.setPressed(true);
+ }
+
+ @Override
+ public void onSettingsChanged(List<SettingsManager.SettingState> settings) {
+ for (SettingsManager.SettingState setting : settings) {
+ String key = setting.key;
+ SettingsManager.Values values = setting.values;
+ String value = (values.overriddenValue == null) ? values.value : values.overriddenValue;
+ switch (key) {
+ case SettingsManager.KEY_CAMERA2:
+ switchCameraMode(value);
+ return;
+ case SettingsManager.KEY_CAMERA_ID:
+ case SettingsManager.KEY_DUAL_CAMERA:
+ case SettingsManager.KEY_CLEARSIGHT:
+ case SettingsManager.KEY_PICTURE_SIZE:
+ mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
+ return;
+ case SettingsManager.KEY_COLOR_EFFECT:
+ changeFilterModeControlIcon(value);
+ updateFilterModeIcon(values.overriddenValue == null);
+ break;
+ }
+ }
+ }
+
+ public void setPreviewSize(int width, int height) {
+ mSurfaceView.setAspectRatio(width, height);
+ }
+
+ private void switchCameraMode(String value) {
+ if (value.equals("enable")) {
+ mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
+ } else {
+ mActivity.onModuleSelected(ModuleSwitcher.PHOTO_MODULE_INDEX);
+ }
+ }
+
+ @Override
+ public void onSettingChanged(ListPreference pref) {
+ removeAllSettingMenu();
+ }
+
+ @Override
+ public void onPreferenceClicked(ListPreference pref) {
+ onPreferenceClicked(pref, 0);
+ }
+
+ @Override
+ public void onPreferenceClicked(ListPreference pref, int y) {
+ LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ removeSettingMenu(SETTING_MENU_LEVEL_TWO, false);
+ mSettingSubMenu = (ListSubMenu) inflater.inflate(R.layout.list_sub_menu, null, false);
+ mSettingSubMenu.initialize(pref, y);
+ mSettingSubMenu.setSettingChangedListener(mSettingMenu);
+ mSettingSubMenu.setAlpha(0f);
+
+ if (mSettingMenuState == SETTING_MENU_ON) {
+ if (mSettingMenuLevel == SETTING_MENU_LEVEL_TWO) {
+ showSettingMenu(SETTING_MENU_LEVEL_TWO, false);
+ } else if (mSettingMenuLevel == SETTING_MENU_LEVEL_ONE) {
+ showSettingMenu(SETTING_MENU_LEVEL_TWO, true);
+ }
+ }
+ }
+
+ @Override
+ public void onListMenuTouched() {
+ removeSettingMenu(SETTING_MENU_LEVEL_TWO, false);
+ }
+
+ @Override
+ public void onListPrefChanged(ListPreference pref) {
+ removeAllSettingMenu();
}
private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
@Override
public void onZoomValueChanged(float mZoomValue) {
- mController.onZoomChanged(mZoomValue);
+ mModule.onZoomChanged(mZoomValue);
if (mZoomRenderer != null) {
mZoomRenderer.setZoom(mZoomValue);
}
diff --git a/src/com/android/camera/ComboPreferences.java b/src/com/android/camera/ComboPreferences.java
index e5cf7274c..9e039bf1f 100644
--- a/src/com/android/camera/ComboPreferences.java
+++ b/src/com/android/camera/ComboPreferences.java
@@ -155,7 +155,11 @@ public class ComboPreferences implements
|| key.equals(CameraSettings.KEY_PHOTOSPHERE_PICTURESIZE)
|| key.equals(CameraSettings.KEY_CAMERA_SAVEPATH)
|| key.equals(CameraSettings.KEY_POWER_SHUTTER)
- || key.equals(CameraSettings.KEY_MAX_BRIGHTNESS);
+ || key.equals(CameraSettings.KEY_MAX_BRIGHTNESS
+ || key.equals(SettingsManager.KEY_CAMERA2)
+ || key.equals(SettingsManager.KEY_DUAL_CAMERA)
+ || key.equals(SettingsManager.KEY_MONO_PREVIEW)
+ || key.equals(SettingsManager.KEY_CLEARSIGHT);
}
@Override
diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java
index 1abda7c48..9b8fd687d 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -42,6 +42,7 @@ public class ListPreference extends CameraPreference {
private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
+ private CharSequence[] mDependencyList;
private CharSequence[] mLabels;
private boolean mLoaded = false;
@@ -73,6 +74,8 @@ public class ListPreference extends CameraPreference {
R.styleable.ListPreference_entryValues));
setLabels(a.getTextArray(
R.styleable.ListPreference_labelList));
+ setDependencyList(a.getTextArray(
+ R.styleable.ListPreference_dependencyList));
a.recycle();
}
@@ -92,6 +95,10 @@ public class ListPreference extends CameraPreference {
return mLabels;
}
+ public CharSequence[] getDependencyList() {
+ return mDependencyList;
+ }
+
public void setEntries(CharSequence entries[]) {
mEntries = entries == null ? new CharSequence[0] : entries;
}
@@ -104,6 +111,10 @@ public class ListPreference extends CameraPreference {
mLabels = labels == null ? new CharSequence[0] : labels;
}
+ public void setDependencyList(CharSequence dependencyList[]) {
+ mDependencyList = dependencyList == null ? new CharSequence[0] : dependencyList;
+ }
+
public String getValue() {
if (!mLoaded) {
mValue = getSharedPreferences().getString(mKey,
@@ -113,6 +124,10 @@ public class ListPreference extends CameraPreference {
return mValue;
}
+ public String getOffValue() {
+ return mEntryValues[0].toString();
+ }
+
// Find the first value in mDefaultValues which is supported.
private String findSupportedDefaultValue() {
for (int i = 0; i < mDefaultValues.length; i++) {
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 0c09edefa..9984a5298 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -213,7 +213,7 @@ public class PhotoMenu extends MenuController
CameraSettings.KEY_MANUAL_EXPOSURE,
CameraSettings.KEY_MANUAL_WB,
CameraSettings.KEY_MANUAL_FOCUS,
- CameraSettings.KEY_CAMERA2
+ SettingsManager.KEY_CAMERA2
};
initSwitchItem(CameraSettings.KEY_CAMERA_ID, mFrontBackSwitcher);
@@ -1206,17 +1206,9 @@ public class PhotoMenu extends MenuController
}
super.onSettingChanged(pref);
- if (same(pref, CameraSettings.KEY_CAMERA2, "enable")) {
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(mActivity);
- prefs.edit().putBoolean(CameraSettings.KEY_CAMERA2, true).apply();
- CameraActivity.CAMERA_2_ON = true;
+ if (same(pref, SettingsManager.KEY_CAMERA2, "enable")) {
mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX);
- } else if (notSame(pref, CameraSettings.KEY_CAMERA2, "enable")) {
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(mActivity);
- prefs.edit().putBoolean(CameraSettings.KEY_CAMERA2, false).apply();
- CameraActivity.CAMERA_2_ON = false;
+ } else if (notSame(pref, SettingsManager.KEY_CAMERA2, "enable")) {
mActivity.onModuleSelected(ModuleSwitcher.PHOTO_MODULE_INDEX);
}
}
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 3e7b9e6de..b7f3d8a48 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -892,8 +892,7 @@ public class PhotoModule
}
// Initialize location service.
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
mUI.initializeFirstTime();
@@ -916,8 +915,7 @@ public class PhotoModule
// onResume.
private void initializeSecondTime() {
// Start location update if needed.
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
MediaSaveService s = mActivity.getMediaSaveService();
if (s != null) {
@@ -4528,8 +4526,7 @@ public class PhotoModule
// ignore the events after "onPause()"
if (mPaused) return;
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
if(needRestart()){
Log.v(TAG, "Restarting Preview... Camera Mode Changed");
diff --git a/src/com/android/camera/PreviewGestures.java b/src/com/android/camera/PreviewGestures.java
index f4262bade..bdf4c5657 100644
--- a/src/com/android/camera/PreviewGestures.java
+++ b/src/com/android/camera/PreviewGestures.java
@@ -55,7 +55,7 @@ public class PreviewGestures
private boolean mEnabled;
private boolean mZoomOnly;
private GestureDetector mGestureDetector;
- private CaptureMenu mCaptureMenu;
+ private CaptureUI mCaptureUI;
private PhotoMenu mPhotoMenu;
private VideoMenu mVideoMenu;
private boolean waitUntilNextDown;
@@ -95,8 +95,8 @@ public class PreviewGestures
orientation = mPhotoMenu.getOrientation();
else if (mVideoMenu != null)
orientation = mVideoMenu.getOrientation();
- else if (mCaptureMenu != null)
- orientation = mCaptureMenu.getOrientation();
+ else if (mCaptureUI != null)
+ orientation = mCaptureUI.getOrientation();
if (isSwipeForMenu(orientation, deltaX, deltaY)) {
waitUntilNextDown = true;
@@ -104,8 +104,8 @@ public class PreviewGestures
mPhotoMenu.openFirstLevel();
else if (mVideoMenu != null && !mVideoMenu.isMenuBeingShown())
mVideoMenu.openFirstLevel();
- else if (mCaptureMenu != null && !mCaptureMenu.isMenuBeingShown())
- mCaptureMenu.openFirstLevel();
+ else if (mCaptureUI != null && !mCaptureUI.isMenuBeingShown())
+ mCaptureUI.showSettingMenu();
return true;
}
return false;
@@ -169,8 +169,8 @@ public class PreviewGestures
return mEnabled;
}
- public void setCaptureMenu(CaptureMenu menu) {
- mCaptureMenu = menu;
+ public void setCaptureUI(CaptureUI ui) {
+ mCaptureUI = ui;
}
public void setPhotoMenu(PhotoMenu menu) {
@@ -181,10 +181,6 @@ public class PreviewGestures
mVideoMenu = menu;
}
- public CaptureMenu getCaptureMenu() {
- return mCaptureMenu;
- }
-
public PhotoMenu getPhotoMenu() {
return mPhotoMenu;
}
@@ -221,16 +217,17 @@ public class PreviewGestures
return sendToPie(m);
}
- if (mCaptureMenu != null) {
- if (mCaptureMenu.isMenuBeingShown()) {
- if (!mCaptureMenu.isMenuBeingAnimated()) {
+ if (mCaptureUI != null) {
+ if (mCaptureUI.isMenuBeingShown()) {
+ if (!mCaptureUI.isMenuBeingAnimated()) {
waitUntilNextDown = true;
- mCaptureMenu.closeView();
+ mCaptureUI.removeAllSettingMenu(true);
}
return true;
}
- if (mCaptureMenu.isPreviewMenuBeingShown()) {
+ if (mCaptureUI.isPreviewMenuBeingShown()) {
waitUntilNextDown = true;
+ mCaptureUI.removeSceneAndFilterMenu(true);
return true;
}
}
diff --git a/src/com/android/camera/RecordLocationPreference.java b/src/com/android/camera/RecordLocationPreference.java
index 9992afabb..b88f5e4ed 100644
--- a/src/com/android/camera/RecordLocationPreference.java
+++ b/src/com/android/camera/RecordLocationPreference.java
@@ -40,11 +40,10 @@ public class RecordLocationPreference extends IconListPreference {
@Override
public String getValue() {
- return get(getSharedPreferences(), mResolver) ? VALUE_ON : VALUE_OFF;
+ return get(getSharedPreferences()) ? VALUE_ON : VALUE_OFF;
}
- public static boolean get(
- SharedPreferences pref, ContentResolver resolver) {
+ public static boolean get(SharedPreferences pref) {
String value = pref.getString(
CameraSettings.KEY_RECORD_LOCATION, VALUE_NONE);
return VALUE_ON.equals(value);
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
new file mode 100644
index 000000000..09bee5e66
--- /dev/null
+++ b/src/com/android/camera/SettingsManager.java
@@ -0,0 +1,539 @@
+/*
+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.camera;
+
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.util.Log;
+import android.util.Size;
+
+import com.android.camera.ui.ListMenu;
+
+import org.codeaurora.snapcam.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class SettingsManager implements ListMenu.SettingsListener {
+ public static final int RESOURCE_TYPE_THUMBNAIL = 0;
+ public static final int RESOURCE_TYPE_LARGEICON = 1;
+ public static final String KEY_CAMERA_SAVEPATH = "pref_camera2_savepath_key";
+ public static final String KEY_RECORD_LOCATION = "pref_camera2_recordlocation_key";
+ public static final String KEY_JPEG_QUALITY = "pref_camera2_jpegquality_key";
+ public static final String KEY_FOCUS_MODE = "pref_camera2_focusmode_key";
+ public static final String KEY_FLASH_MODE = "pref_camera2_flashmode_key";
+ public static final String KEY_WHITE_BALANCE = "pref_camera2_whitebalance_key";
+ public static final String KEY_CAMERA2 = "pref_camera2_camera2_key";
+ public static final String KEY_DUAL_CAMERA = "pref_camera2_dual_camera_key";
+ public static final String KEY_MONO_PREVIEW = "pref_camera2_mono_preview_key";
+ public static final String KEY_CLEARSIGHT = "pref_camera2_clearsight_key";
+ public static final String KEY_FILTER_MODE = "pref_camera2_filter_mode_key";
+ public static final String KEY_COLOR_EFFECT = "pref_camera2_coloreffect_key";
+ public static final String KEY_SCENE_MODE = "pref_camera2_scenemode_key";
+ public static final String KEY_REDEYE_REDUCTION = "pref_camera2_redeyereduction_key";
+ public static final String KEY_CAMERA_ID = "pref_camera2_id_key";
+ public static final String KEY_PICTURE_SIZE = "pref_camera2_picturesize_key";
+ public static final String KEY_ISO = "pref_camera2_iso_key";
+ public static final String KEY_EXPOSURE = "pref_camera2_exposure_key";
+ public static final String KEY_TIMER = "pref_camera2_timer_key";
+ public static final String KEY_LONGSHOT = "pref_camera2_longshot_key";
+ private static final String TAG = "SnapCam_SettingsManager";
+ private static final List<CameraCharacteristics> mCharacteristics = new ArrayList<>();
+ private static final int NOT_FOUND = -1;
+
+ private static SettingsManager sInstance;
+
+ private ArrayList<Listener> mListeners;
+ private Map<String, Values> mValuesMap;
+ private Context mContext;
+ private PreferenceGroup mPreferenceGroup;
+ private ComboPreferences mPreferences;
+ private Map<String, List<String>> mDependendsOnMap;
+
+ private SettingsManager(Context context) {
+ mListeners = new ArrayList<>();
+ mValuesMap = new HashMap<>();
+ mDependendsOnMap = new HashMap<>();
+ mContext = context;
+ mPreferences = new ComboPreferences(mContext);
+ CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal(), mContext);
+
+ CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+ try {
+ String[] cameraIdList = manager.getCameraIdList();
+ for (int i = 0; i < cameraIdList.length; i++) {
+ //TODO: determine front/back/bayer/mono and their ids
+ String cameraId = cameraIdList[i];
+ CameraCharacteristics characteristics
+ = manager.getCameraCharacteristics(cameraId);
+ mCharacteristics.add(i, characteristics);
+ }
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static SettingsManager createInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new SettingsManager(context);
+ }
+ return sInstance;
+ }
+
+ public static SettingsManager getInstance() {
+ return sInstance;
+ }
+
+ public List<String> getDisabledList() {
+ List<String> list = new ArrayList<>();
+ Set<String> keySet = mValuesMap.keySet();
+ for (String key : keySet) {
+ Values value = mValuesMap.get(key);
+ if (value.overriddenValue != null) {
+ list.add(key);
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public void onSettingChanged(ListPreference pref) {
+ String key = pref.getKey();
+ List changed = checkDependencyAndUpdate(key);
+ notifyListeners(changed);
+ }
+
+ public void init() {
+ Log.d(TAG, "SettingsManager init");
+ int cameraId = CameraSettings.getInitialCameraId(mPreferences);
+ setLocalIdAndInitialize(cameraId);
+ }
+
+ public void reinit(int cameraId) {
+ Log.d(TAG, "SettingsManager reinit " + cameraId);
+ setLocalIdAndInitialize(cameraId);
+ }
+
+ private void setLocalIdAndInitialize(int cameraId) {
+ mPreferences.setLocalId(mContext, cameraId);
+ CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());
+
+ PreferenceInflater inflater = new PreferenceInflater(mContext);
+ mPreferenceGroup =
+ (PreferenceGroup) inflater.inflate(R.xml.capture_preferences);
+
+ filterPreferences(cameraId);
+ initDepedencyTable();
+ initializeValueMap();
+ }
+
+ private void initDepedencyTable() {
+ for (int i = 0; i < mPreferenceGroup.size(); i++) {
+ ListPreference pref = (ListPreference) mPreferenceGroup.get(i);
+ String baseKey = pref.getKey();
+ CharSequence[] dependencyList = pref.getDependencyList();
+ if (dependencyList != null) {
+ for (int j = 0; j < dependencyList.length; j++) {
+ String key = dependencyList[j].toString();
+ pref = mPreferenceGroup.findPreference(key);
+ if (pref == null) continue; //filtered?
+ List list = mDependendsOnMap.get(key);
+ if (list == null) {
+ list = new ArrayList<String>();
+ }
+ list.add(baseKey);
+ mDependendsOnMap.put(key, list);
+ }
+ }
+ }
+ }
+
+ private void initializeValueMap() {
+ List<String> processLater = new ArrayList<String>();
+ for (int i = 0; i < mPreferenceGroup.size(); i++) {
+ ListPreference pref = (ListPreference) mPreferenceGroup.get(i);
+ String key = pref.getKey();
+ if (mDependendsOnMap.get(key) != null) {
+ processLater.add(key);
+ continue;
+ }
+ Values values = new Values(pref.getValue(), null);
+ mValuesMap.put(pref.getKey(), values);
+ }
+
+ for (String keyToProcess : processLater) {
+ List<String> dependsOnList = mDependendsOnMap.get(keyToProcess);
+ boolean active = true;
+ for (String s : dependsOnList) {
+ if (isOptionOn(s)) active = false;
+ break;
+ }
+ ListPreference pref = mPreferenceGroup.findPreference(keyToProcess);
+ Values values = new Values(pref.getValue(), null);
+ if (!active) {
+ values.overriddenValue = pref.getOffValue();
+ }
+ mValuesMap.put(keyToProcess, values);
+ }
+ }
+
+ private List<SettingState> checkDependencyAndUpdate(String changedPrefKey) {
+ ListPreference changedPref = mPreferenceGroup.findPreference(changedPrefKey);
+ if (changedPref == null) return null;
+
+ String key = changedPref.getKey();
+ String value = changedPref.getValue();
+ boolean turnedOff = value.equals(changedPref.getOffValue());
+ List<SettingState> changed = new ArrayList();
+ Values values = new Values(value, null);
+ mValuesMap.put(key, values);
+ changed.add(new SettingState(key, values));
+ CharSequence[] dependencyList = changedPref.getDependencyList();
+
+ if (!turnedOff) { // turned on
+ if (dependencyList != null) {
+ for (int j = 0; j < dependencyList.length; j++) {
+ key = dependencyList[j].toString();
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ if (pref == null) continue;
+ values = mValuesMap.get(key);
+ if (values != null && values.overriddenValue != null) continue;
+ Values newValue = new Values(pref.getValue(), pref.getOffValue());
+ mValuesMap.put(key, newValue);
+ changed.add(new SettingState(key, newValue));
+ }
+ }
+ } else {
+ if (dependencyList != null) {
+ for (int j = 0; j < dependencyList.length; j++) {
+ key = dependencyList[j].toString();
+ List<String> dependsOnList = mDependendsOnMap.get(key);
+ if (dependsOnList == null) continue;
+ boolean active = true;
+ for (String s : dependsOnList) {
+ if (isOptionOn(s)) active = false;
+ break;
+ }
+ if (active) {
+ values = mValuesMap.get(key);
+ values.overriddenValue = null;
+ mValuesMap.put(key, values);
+ changed.add(new SettingState(key, values));
+ }
+ }
+ }
+ }
+ return changed;
+ }
+
+ public void registerListener(Listener listener) {
+ mListeners.add(listener);
+ }
+
+ private void notifyListeners(List<SettingState> changes) {
+ for (Listener listener : mListeners) {
+ listener.onSettingsChanged(changes);
+ }
+ }
+
+ public boolean isCamera2On() {
+ return mPreferences.getString(KEY_CAMERA2, "disable").equals("enable");
+ }
+
+ public String getValue(String key) {
+ Values values = mValuesMap.get(key);
+ if (values == null) return null;
+ if (values.overriddenValue == null) return values.value;
+ else return values.overriddenValue;
+ }
+
+ public int getValueIndex(String key) {
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ String value = getValue(key);
+ if (value == null) return -1;
+ return pref.findIndexOfValue(value);
+ }
+
+ public boolean isOverriden(String key) {
+ Values values = mValuesMap.get(key);
+ return values.overriddenValue != null;
+ }
+
+ public void setValue(String key, String value) {
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ pref.setValue(value);
+ updateMapAndNotify(pref);
+ }
+
+ public void setValueIndex(String key, int index) {
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ pref.setValueIndex(index);
+ updateMapAndNotify(pref);
+ }
+
+ private void updateMapAndNotify(ListPreference pref) {
+ String key = pref.getKey();
+ Values values = mValuesMap.get(key);
+ values.overriddenValue = null;
+ values.value = pref.getValue();
+ mValuesMap.put(key, values);
+ List changed = checkDependencyAndUpdate(key);
+ notifyListeners(changed);
+ }
+
+ private boolean isOptionOn(String key) {
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ Values values = mValuesMap.get(key);
+ return (values.overriddenValue == null && !pref.getValue().equals(pref.getOffValue()));
+ }
+
+ public PreferenceGroup getPreferenceGroup() {
+ return mPreferenceGroup;
+ }
+
+ public CharSequence[] getEntries(String key) {
+ ListPreference pref = mPreferenceGroup.findPreference(key);
+ return pref.getEntries();
+ }
+
+ public int[] getResource(String key, int type) {
+ IconListPreference pref = (IconListPreference) mPreferenceGroup.findPreference(key);
+ switch (type) {
+ case RESOURCE_TYPE_THUMBNAIL:
+ return pref.getThumbnailIds();
+ case RESOURCE_TYPE_LARGEICON:
+ return pref.getLargeIconIds();
+ }
+ return null;
+ }
+
+ private void filterPreferences(int cameraId) {
+ // filter unsupported preferences
+ ListPreference whiteBalance = mPreferenceGroup.findPreference(KEY_WHITE_BALANCE);
+ ListPreference flashMode = mPreferenceGroup.findPreference(KEY_FLASH_MODE);
+ ListPreference colorEffect = mPreferenceGroup.findPreference(KEY_COLOR_EFFECT);
+ ListPreference sceneMode = mPreferenceGroup.findPreference(KEY_SCENE_MODE);
+ ListPreference cameraIdPref = mPreferenceGroup.findPreference(KEY_CAMERA_ID);
+ ListPreference pictureSize = mPreferenceGroup.findPreference(KEY_PICTURE_SIZE);
+
+ if (whiteBalance != null) {
+ CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
+ whiteBalance, getSupportedWhiteBalanceModes(cameraId));
+ }
+ if (flashMode != null) {
+ CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
+ flashMode, getSupportedFlashModes(cameraId));
+ }
+
+ if (colorEffect != null) {
+ CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
+ colorEffect, getSupportedColorEffects(cameraId));
+ }
+
+ if (sceneMode != null) {
+ CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
+ sceneMode, getSupportedSceneModes(cameraId));
+ }
+
+ if (cameraIdPref != null) buildCameraId();
+
+ if (pictureSize != null) {
+ CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
+ pictureSize, getSupportedPictureSize(cameraId));
+ }
+ }
+
+ private void buildCameraId() {
+ int numOfCameras = mCharacteristics.size();
+ if (numOfCameras < 2) {
+ removePreference(mPreferenceGroup, KEY_CAMERA_ID);
+ }
+
+ CharSequence[] entryValues = new CharSequence[numOfCameras];
+ //TODO: Modify this after bayer/mono/front/back determination is done
+ entryValues[0] = "" + CaptureModule.BAYER_ID;
+ entryValues[1] = "" + CaptureModule.FRONT_ID;
+ ListPreference cameraIdPref = mPreferenceGroup.findPreference(KEY_CAMERA_ID);
+ cameraIdPref.setEntryValues(entryValues);
+ }
+
+ private boolean removePreference(PreferenceGroup group, String key) {
+ for (int i = 0, n = group.size(); i < n; i++) {
+ CameraPreference child = group.get(i);
+ if (child instanceof PreferenceGroup) {
+ if (removePreference((PreferenceGroup) child, key)) {
+ return true;
+ }
+ }
+ if (child instanceof ListPreference &&
+ ((ListPreference) child).getKey().equals(key)) {
+ group.removePreference(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public float getMaxZoom(int id) {
+ return mCharacteristics.get(id).get(CameraCharacteristics
+ .SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
+ }
+
+ public Rect getSensorActiveArraySize(int id) {
+ return mCharacteristics.get(id).get(CameraCharacteristics
+ .SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+ }
+
+ public float getMaxZoom(List<Integer> ids) {
+ float zoomMax = Float.MAX_VALUE;
+ for (int id : ids) {
+ zoomMax = Math.min(getMaxZoom(id), zoomMax);
+ }
+ return zoomMax;
+ }
+
+ public boolean isZoomSupported(int id) {
+ return mCharacteristics.get(id).get(CameraCharacteristics
+ .SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) > 1f;
+ }
+
+ public boolean isAutoFocusSupported(List<Integer> ids) {
+ for (int id : ids) {
+ if (!isAutoFocusSupported(id))
+ return false;
+ }
+ return true;
+ }
+
+
+ public boolean isZoomSupported(List<Integer> ids) {
+ for (int id : ids) {
+ if (!isZoomSupported(id))
+ return false;
+ }
+ return true;
+ }
+
+ public boolean isAutoFocusSupported(int id) {
+ Integer maxAfRegions = mCharacteristics.get(id).get(
+ CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
+ return maxAfRegions != null && maxAfRegions > 0;
+ }
+
+ public boolean isFlashSupported(int id) {
+ return mCharacteristics.get(id).get(CameraCharacteristics.FLASH_INFO_AVAILABLE) &&
+ mValuesMap.get(KEY_FLASH_MODE) != null;
+ }
+
+ private List<String> getSupportedPictureSize(int cameraId) {
+ StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
+ CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ Size[] sizes = map.getOutputSizes(ImageFormat.JPEG);
+ List<String> res = new ArrayList<>();
+ for (int i = 0; i < sizes.length; i++) {
+ res.add(sizes[i].toString());
+ }
+ return res;
+ }
+
+ private List<String> getSupportedWhiteBalanceModes(int cameraId) {
+ int[] whiteBalanceModes = mCharacteristics.get(cameraId).get(CameraCharacteristics
+ .CONTROL_AWB_AVAILABLE_MODES);
+ List<String> modes = new ArrayList<>();
+ for (int mode : whiteBalanceModes) {
+ modes.add("" + mode);
+ }
+ return modes;
+ }
+
+ private List<String> getSupportedSceneModes(int cameraId) {
+ int[] sceneModes = mCharacteristics.get(cameraId).get(CameraCharacteristics
+ .CONTROL_AVAILABLE_SCENE_MODES);
+ List<String> modes = new ArrayList<>();
+ modes.add("0"); // need special case handle for auto scene mode
+ for (int mode : sceneModes) {
+ modes.add("" + mode);
+ }
+ return modes;
+ }
+
+ private List<String> getSupportedFlashModes(int cameraId) {
+ int[] flashModes = mCharacteristics.get(cameraId).get(CameraCharacteristics
+ .CONTROL_AE_AVAILABLE_MODES);
+ List<String> modes = new ArrayList<>();
+ for (int mode : flashModes) {
+ modes.add("" + mode);
+ }
+ return modes;
+ }
+
+ public List<String> getSupportedColorEffects(int cameraId) {
+ int[] flashModes = mCharacteristics.get(cameraId).get(CameraCharacteristics
+ .CONTROL_AVAILABLE_EFFECTS);
+ List<String> modes = new ArrayList<>();
+ for (int mode : flashModes) {
+ modes.add("" + mode);
+ }
+ return modes;
+ }
+
+ public interface Listener {
+ void onSettingsChanged(List<SettingState> settings);
+ }
+
+ static class Values {
+ String value;
+ String overriddenValue;
+
+ Values(String value, String overriddenValue) {
+ this.value = value;
+ this.overriddenValue = overriddenValue;
+ }
+ }
+
+ static class SettingState {
+ String key;
+ Values values;
+
+ SettingState(String key, Values values) {
+ this.key = key;
+ this.values = values;
+ }
+ }
+
+}
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index af72a2981..4ac9bce78 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -1183,8 +1183,7 @@ public class VideoModule implements CameraModule,
mOrientationManager.resume();
// Initialize location service.
- boolean recordLocation = RecordLocationPreference.get(mPreferences,
- mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
if (mPreviewing) {
@@ -2752,8 +2751,7 @@ public class VideoModule implements CameraModule,
// startPreview().
if (mCameraDevice == null) return;
- boolean recordLocation = RecordLocationPreference.get(
- mPreferences, mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
readVideoPreferences();
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index 6068ef29b..8e28f81c9 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -1036,8 +1036,7 @@ public class WideAnglePanoramaModule
mOrientationManager.resume();
// Initialize location service.
- boolean recordLocation = RecordLocationPreference.get(mPreferences,
- mContentResolver);
+ boolean recordLocation = RecordLocationPreference.get(mPreferences);
mLocationManager.recordLocation(recordLocation);
mUI.initDisplayChangeListener();
UsageStatistics.onContentViewChanged(
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index 1f9c8d921..e6e00ad56 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -37,7 +37,6 @@ import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
-import com.android.camera.CaptureMenu;
import com.android.camera.PhotoMenu;
import com.android.camera.VideoMenu;
import com.android.camera.PreviewGestures;
@@ -1832,7 +1831,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
return true;
PhotoMenu pMenu = mPreviewGestures.getPhotoMenu();
VideoMenu vMenu = mPreviewGestures.getVideoMenu();
- CaptureMenu cMenu = mPreviewGestures.getCaptureMenu();
+
if (pMenu != null) {
if (pMenu.isMenuBeingShown()) {
if (pMenu.isMenuBeingAnimated()) {
@@ -1850,23 +1849,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
}
}
}
- if (cMenu != null) {
- if (cMenu.isMenuBeingShown()) {
- if (cMenu.isMenuBeingAnimated()) {
- if (cMenu.isOverMenu(ev)) {
- mSendToMenu = true;
- return true;
- }
- }
- }
- if (cMenu.isPreviewMenuBeingShown()) {
- if (cMenu.isOverPreviewMenu(ev)) {
- mSendToPreviewMenu = true;
- return true;
- }
- }
- }
if (vMenu != null) {
if (vMenu.isMenuBeingShown()) {
if (vMenu.isMenuBeingAnimated()) {
@@ -1903,7 +1886,6 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
}
PhotoMenu pMenu = mPreviewGestures.getPhotoMenu();
VideoMenu vMenu = mPreviewGestures.getVideoMenu();
- CaptureMenu cMenu = mPreviewGestures.getCaptureMenu();
if (pMenu != null) {
if (mSendToPreviewMenu)
return pMenu.sendTouchToPreviewMenu(ev);
@@ -1917,19 +1899,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener {
return pMenu.sendTouchToPreviewMenu(ev);
}
}
- if (cMenu != null) {
- if (mSendToPreviewMenu)
- return cMenu.sendTouchToPreviewMenu(ev);
- if (mSendToMenu)
- return cMenu.sendTouchToMenu(ev);
- if (cMenu.isMenuBeingShown()) {
- return cMenu.sendTouchToMenu(ev);
- }
- if (cMenu.isPreviewMenuBeingShown()) {
- return cMenu.sendTouchToPreviewMenu(ev);
- }
- }
if (vMenu != null) {
if (mSendToPreviewMenu)
return vMenu.sendTouchToPreviewMenu(ev);
diff --git a/src/com/android/camera/ui/ListMenu.java b/src/com/android/camera/ui/ListMenu.java
index bb21f7e0a..4cb35981e 100644
--- a/src/com/android/camera/ui/ListMenu.java
+++ b/src/com/android/camera/ui/ListMenu.java
@@ -19,8 +19,6 @@
package com.android.camera.ui;
-import java.util.ArrayList;
-
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
@@ -36,21 +34,42 @@ import android.widget.Space;
import com.android.camera.ListPreference;
import com.android.camera.PreferenceGroup;
+import com.android.camera.SettingsManager;
+
import org.codeaurora.snapcam.R;
+import java.util.ArrayList;
+import java.util.List;
+
/* A popup window that contains several camera settings. */
public class ListMenu extends ListView
- implements ListMenuItem.Listener, AdapterView.OnItemClickListener, RotateLayout.Child {
+ implements ListMenuItem.Listener,
+ RotateLayout.Child {
+ AdapterView.OnItemClickListener,
+ ListSubMenu.Listener {
@SuppressWarnings("unused")
private static final String TAG = "ListMenu";
private int mHighlighted = -1;
private Listener mListener;
+ private SettingsManager mSettingsManager;
private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>();
private View mHeader, mFooter;
// Keep track of which setting items are disabled
// e.g. White balance will be disabled when scene mode is set to non-auto
private boolean[] mEnabled;
+ private boolean mForCamera2 = false;
+
+ @Override
+ public void onListPrefChanged(ListPreference pref) {
+ // listen from ListSubMenu
+ if (mListener != null) {
+ mListener.onSettingChanged(pref);
+ }
+ if (mSettingsManager != null) {
+ mSettingsManager.onSettingChanged(pref);
+ }
+ }
static public interface Listener {
public void onSettingChanged(ListPreference pref);
@@ -62,6 +81,11 @@ public class ListMenu extends ListView
public void onListMenuTouched();
}
+ static public interface SettingsListener {
+ // notify SettingsManager
+ public void onSettingChanged(ListPreference pref);
+ }
+
private class MoreSettingAdapter extends ArrayAdapter<ListPreference> {
LayoutInflater mInflater;
String mOnString;
@@ -92,6 +116,9 @@ public class ListMenu extends ListView
view.setSettingChangedListener(ListMenu.this);
if (position >= 0 && position < mEnabled.length) {
view.setEnabled(mEnabled[position]);
+ if (mForCamera2 && !mEnabled[position]) {
+ view.overrideSettings(pref.getOffValue());
+ }
} else {
Log.w(TAG, "Invalid input: enabled list length, " + mEnabled.length
+ " position " + position);
@@ -135,6 +162,10 @@ public class ListMenu extends ListView
view.setLayoutParams(lp);
}
+ public void setSettingsManager(SettingsManager settingsManager) {
+ mSettingsManager = settingsManager;
+ }
+
public void setSettingChangedListener(Listener listener) {
mListener = listener;
}
@@ -143,6 +174,32 @@ public class ListMenu extends ListView
super(context, attrs);
}
+ public void initializeForCamera2(String[] keys) {
+ mForCamera2 = true;
+ PreferenceGroup group = mSettingsManager.getPreferenceGroup();
+ List<String> disabledList = mSettingsManager.getDisabledList();
+ // Prepare the setting items.
+ for (int i = 0; i < keys.length; ++i) {
+ ListPreference pref = group.findPreference(keys[i]);
+ if (pref != null)
+ mListItem.add(pref);
+ }
+
+ ArrayAdapter<ListPreference> mListItemAdapter = new MoreSettingAdapter();
+ setAdapter(mListItemAdapter);
+ setOnItemClickListener(this);
+ setSelector(android.R.color.transparent);
+ // Initialize mEnabled
+ mEnabled = new boolean[mListItem.size()];
+ for (int i = 0; i < mEnabled.length; i++) {
+ mEnabled[i] = true;
+ }
+
+ for (String s: disabledList) {
+ setPreferenceEnabled(s, false);
+ }
+ }
+
public void initialize(PreferenceGroup group, String[] keys) {
// Prepare the setting items.
for (int i = 0; i < keys.length; ++i) {
diff --git a/src/com/android/camera/ui/ListMenuItem.java b/src/com/android/camera/ui/ListMenuItem.java
index f3c7f017e..b051fdd27 100644
--- a/src/com/android/camera/ui/ListMenuItem.java
+++ b/src/com/android/camera/ui/ListMenuItem.java
@@ -159,4 +159,26 @@ public class ListMenuItem extends RelativeLayout {
setAlpha(0.3f);
}
}
+
+ public void setEnabled(boolean enable, String value) {
+ super.setEnabled(enable);
+ if (enable)
+ setAlpha(1f);
+ else
+ setAlpha(0.3f);
+ if (mTitle != null) {
+ mTitle.setEnabled(enable);
+ if (enable)
+ setAlpha(1f);
+ else
+ setAlpha(0.3f);
+ }
+ if (mEntry != null) {
+ mEntry.setEnabled(enable);
+ if (enable)
+ setAlpha(1f);
+ else
+ setAlpha(0.3f);
+ }
+ }
}
diff --git a/src/com/android/camera/ui/ListSubMenu.java b/src/com/android/camera/ui/ListSubMenu.java
index 3501af3bc..a425c7680 100644
--- a/src/com/android/camera/ui/ListSubMenu.java
+++ b/src/com/android/camera/ui/ListSubMenu.java
@@ -136,8 +136,9 @@ public class ListSubMenu extends ListView implements
public void onItemClick(AdapterView<?> parent, View view,
int index, long id) {
mPreference.setValueIndex(index);
- if (mListener != null)
+ if (mListener != null) {
mListener.onListPrefChanged(mPreference);
+ }
}
@Override
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index a83714f6a..9b728b642 100644
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -35,7 +35,6 @@ import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
-import android.hardware.camera2.CameraCharacteristics;
import android.location.Location;
import android.net.Uri;
import android.os.Handler;
@@ -1224,32 +1223,4 @@ public class CameraUtil {
return retRatio;
}
- public static boolean isZoomSupported(CameraCharacteristics[] characteristics, List<Integer>
- characteristicsIndex) {
- for (int i = 0; i < characteristicsIndex.size(); i++) {
- if (!isZoomSupported(characteristics[characteristicsIndex.get(i)]))
- return false;
- }
- return true;
- }
-
- public static boolean isZoomSupported(CameraCharacteristics characteristic) {
- return characteristic.get(CameraCharacteristics
- .SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) > 1f;
- }
-
- public static boolean isAutoFocusSupported(CameraCharacteristics[] characteristics, List<Integer>
- characteristicsIndex) {
- for (int i = 0; i < characteristicsIndex.size(); i++) {
- if (!isAutoFocusSupported(characteristics[characteristicsIndex.get(i)]))
- return false;
- }
- return true;
- }
-
- public static boolean isAutoFocusSupported(CameraCharacteristics characteristic) {
- Integer maxAfRegions = characteristic.get(
- CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
- return maxAfRegions != null && maxAfRegions > 0;
- }
}