CameraSettings.java revision 8145371c52a62fbebbc20685bf0901ce50495e21
177c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang/* 277c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Copyright (C) 2009 The Android Open Source Project 377c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * 477c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 577c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * you may not use this file except in compliance with the License. 677c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * You may obtain a copy of the License at 777c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * 877c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 977c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * 1077c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Unless required by applicable law or agreed to in writing, software 1177c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 1277c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1377c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * See the License for the specific language governing permissions and 1477c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * limitations under the License. 1577c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang */ 1677c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang 17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera; 18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 1978f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.app.Activity; 2078f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.content.Context; 21b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences; 221ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Changimport android.content.SharedPreferences.Editor; 237add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Liimport android.hardware.Camera.CameraInfo; 2487341536812081826656040ac81f8f386c6c1407Wu-cheng Liimport android.hardware.Camera.Parameters; 254305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.hardware.Camera.Size; 2633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Linimport android.media.CamcorderProfile; 274d226d16bb06861527e5ec162e39d9673e23df83akahuangimport android.util.FloatMath; 287e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chenimport android.util.Log; 29d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen 305eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Changimport com.android.gallery3d.common.ApiHelper; 315eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang 32d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList; 334305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List; 3487341536812081826656040ac81f8f386c6c1407Wu-cheng Li 35271b3095b9f763421c0547109da9de774795072dChih-Chung Chang/** 36271b3095b9f763421c0547109da9de774795072dChih-Chung Chang * Provides utilities and keys for Camera settings. 37271b3095b9f763421c0547109da9de774795072dChih-Chung Chang */ 3878f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings { 3978f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final int NOT_FOUND = -1; 4078f160ee416ba27ba55954950473e17ba9d20052Owen Lin 4178f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_VERSION = "pref_version_key"; 421ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static final String KEY_LOCAL_VERSION = "pref_local_version_key"; 4333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_RECORD_LOCATION = RecordLocationPreference.KEY; 44469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final String KEY_VIDEO_QUALITY = "pref_video_quality_key"; 45f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key"; 469dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 47e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 480f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 495945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 50da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key"; 5133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key"; 528d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key"; 5333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_EXPOSURE = "pref_camera_exposure_key"; 5471e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li public static final String KEY_VIDEO_EFFECT = "pref_video_effect_key"; 557add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public static final String KEY_CAMERA_ID = "pref_camera_id_key"; 56d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang public static final String KEY_CAMERA_FIRST_USE_HINT_SHOWN = "pref_camera_first_use_hint_shown_key"; 57d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang public static final String KEY_VIDEO_FIRST_USE_HINT_SHOWN = "pref_video_first_use_hint_shown_key"; 588791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin 59f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin public static final String EXPOSURE_DEFAULT_VALUE = "0"; 60f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin 6105999715cc38365aa4751a2a355eb1af284573abAngus Kong public static final int CURRENT_VERSION = 5; 62cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong public static final int CURRENT_LOCAL_VERSION = 2; 63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6405999715cc38365aa4751a2a355eb1af284573abAngus Kong public static final int DEFAULT_VIDEO_DURATION = 0; // no limit 65b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final String TAG = "CameraSettings"; 6778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 6878f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Context mContext; 6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Parameters mParameters; 707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private final CameraInfo[] mCameraInfo; 71c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li private final int mCameraId; 7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin 737add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public CameraSettings(Activity activity, Parameters parameters, 74c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li int cameraId, CameraInfo[] cameraInfo) { 7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin mContext = activity; 7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters = parameters; 77c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li mCameraId = cameraId; 787add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li mCameraInfo = cameraInfo; 7978f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 8078f160ee416ba27ba55954950473e17ba9d20052Owen Lin 8173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public PreferenceGroup getPreferenceGroup(int preferenceRes) { 8273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceInflater inflater = new PreferenceInflater(mContext); 8373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group = 8473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin (PreferenceGroup) inflater.inflate(preferenceRes); 8573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin initPreference(group); 8673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return group; 8778f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 8878f160ee416ba27ba55954950473e17ba9d20052Owen Lin 89926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala public static String getDefaultVideoQuality(int cameraId, 90926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala String defaultQuality) { 91cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong int quality = Integer.valueOf(defaultQuality); 92926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala if (CamcorderProfile.hasProfile(cameraId, quality)) { 9305999715cc38365aa4751a2a355eb1af284573abAngus Kong return defaultQuality; 9405999715cc38365aa4751a2a355eb1af284573abAngus Kong } 9505999715cc38365aa4751a2a355eb1af284573abAngus Kong return Integer.toString(CamcorderProfile.QUALITY_HIGH); 9605999715cc38365aa4751a2a355eb1af284573abAngus Kong } 9705999715cc38365aa4751a2a355eb1af284573abAngus Kong 9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static void initialCameraPictureSize( 9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin Context context, Parameters parameters) { 10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // When launching the camera app first time, we will set the picture 10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // size to the first one in the list defined in "arrays.xml" and is also 10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // supported by the driver. 10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin List<Size> supported = parameters.getSupportedPictureSizes(); 10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (supported == null) return; 10532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (String candidate : context.getResources().getStringArray( 10632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin R.array.pref_camera_picturesize_entryvalues)) { 10732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (setCameraPictureSize(candidate, supported, parameters)) { 1081ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = ComboPreferences 1091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang .get(context).edit(); 11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin editor.putString(KEY_PICTURE_SIZE, candidate); 1114714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return; 11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 1154ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin Log.e(TAG, "No supported picture size found"); 11632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen public static void removePreferenceFromScreen( 11973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group, String key) { 12073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, key); 1217e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen } 1227e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen 12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static boolean setCameraPictureSize( 12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin String candidate, List<Size> supported, Parameters parameters) { 12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int index = candidate.indexOf('x'); 12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (index == NOT_FOUND) return false; 12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int width = Integer.parseInt(candidate.substring(0, index)); 12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int height = Integer.parseInt(candidate.substring(index + 1)); 12905999715cc38365aa4751a2a355eb1af284573abAngus Kong for (Size size : supported) { 13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (size.width == width && size.height == height) { 13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin parameters.setPictureSize(width, height); 13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return true; 13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return false; 13632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void initPreference(PreferenceGroup group) { 139469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY); 140b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li ListPreference timeLapseInterval = group.findPreference(KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL); 14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE); 14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference whiteBalance = group.findPreference(KEY_WHITE_BALANCE); 14373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE); 14473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference flashMode = group.findPreference(KEY_FLASH_MODE); 14573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE); 14633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin ListPreference exposure = group.findPreference(KEY_EXPOSURE); 147c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li IconListPreference cameraIdPref = 14805999715cc38365aa4751a2a355eb1af284573abAngus Kong (IconListPreference) group.findPreference(KEY_CAMERA_ID); 1496988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin ListPreference videoFlashMode = 1506988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE); 15171e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li ListPreference videoEffect = group.findPreference(KEY_VIDEO_EFFECT); 15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin 15378f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Since the screen could be loaded from different resources, we need 15478f160ee416ba27ba55954950473e17ba9d20052Owen Lin // to check if the preference is available here 155469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (videoQuality != null) { 15605999715cc38365aa4751a2a355eb1af284573abAngus Kong filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality()); 1574305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li } 1584305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 15978f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pictureSize != null) { 16073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, pictureSize, sizeListToStringList( 16178f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters.getSupportedPictureSizes())); 1623f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 16378f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (whiteBalance != null) { 16473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 16578f160ee416ba27ba55954950473e17ba9d20052Owen Lin whiteBalance, mParameters.getSupportedWhiteBalance()); 1660f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 16778f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (sceneMode != null) { 16873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 16978f160ee416ba27ba55954950473e17ba9d20052Owen Lin sceneMode, mParameters.getSupportedSceneModes()); 1700f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 171b6ad206f53981faee04800b787569dbb60492844Owen Lin if (flashMode != null) { 17273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 173b6ad206f53981faee04800b787569dbb60492844Owen Lin flashMode, mParameters.getSupportedFlashModes()); 174b6ad206f53981faee04800b787569dbb60492844Owen Lin } 175df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin if (focusMode != null) { 176df90c922da29c6c4fa2de721e3cff19461c51715Ahbong Chang if (!Util.isFocusAreaSupported(mParameters)) { 177f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li filterUnsupportedOptions(group, 178f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li focusMode, mParameters.getSupportedFocusModes()); 179f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li } else { 180f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li // Remove the focus mode if we can use tap-to-focus. 181f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li removePreference(group, focusMode.getKey()); 182f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li } 1836988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin } 1846988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin if (videoFlashMode != null) { 1856988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin filterUnsupportedOptions(group, 1866988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin videoFlashMode, mParameters.getSupportedFlashModes()); 187df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin } 1887add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (exposure != null) buildExposureCompensation(group, exposure); 189c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li if (cameraIdPref != null) buildCameraId(group, cameraIdPref); 190b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li 1915eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang if (timeLapseInterval != null) { 1925eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang if (ApiHelper.HAS_TIME_LAPSE_RECORDING) { 1935eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang resetIfInvalid(timeLapseInterval); 1945eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang } else { 1955eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang removePreference(group, timeLapseInterval.getKey()); 1965eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang } 1975eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang } 1989efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (videoEffect != null) { 1998145371c52a62fbebbc20685bf0901ce50495e21Pin Ting if (ApiHelper.HAS_EFFECTS_RECORDING) { 2008145371c52a62fbebbc20685bf0901ce50495e21Pin Ting initVideoEffect(group, videoEffect); 2018145371c52a62fbebbc20685bf0901ce50495e21Pin Ting resetIfInvalid(videoEffect); 2028145371c52a62fbebbc20685bf0901ce50495e21Pin Ting } else { 2038145371c52a62fbebbc20685bf0901ce50495e21Pin Ting filterUnsupportedOptions(group, videoEffect, null); 2048145371c52a62fbebbc20685bf0901ce50495e21Pin Ting } 2059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin private void buildExposureCompensation( 20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin PreferenceGroup group, ListPreference exposure) { 21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int max = mParameters.getMaxExposureCompensation(); 21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int min = mParameters.getMinExposureCompensation(); 21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (max == 0 && min == 0) { 21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin removePreference(group, exposure.getKey()); 21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return; 21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float step = mParameters.getExposureCompensationStep(); 21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 21833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin // show only integer values for exposure compensation 2194d226d16bb06861527e5ec162e39d9673e23df83akahuang int maxValue = (int) FloatMath.floor(max * step); 2204d226d16bb06861527e5ec162e39d9673e23df83akahuang int minValue = (int) FloatMath.ceil(min * step); 22133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entries[] = new CharSequence[maxValue - minValue + 1]; 22233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1]; 22333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin for (int i = minValue; i <= maxValue; ++i) { 22433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entryValues[maxValue - i] = Integer.toString(Math.round(i / step)); 22533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin StringBuilder builder = new StringBuilder(); 22633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (i > 0) builder.append('+'); 22733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entries[maxValue - i] = builder.append(i).toString(); 22833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 22933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntries(entries); 23033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntryValues(entryValues); 231b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 232b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 2337add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private void buildCameraId( 23459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang PreferenceGroup group, IconListPreference preference) { 2357add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li int numOfCameras = mCameraInfo.length; 2367add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (numOfCameras < 2) { 23759ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang removePreference(group, preference.getKey()); 2387add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li return; 2397add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2407add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li 24170ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong CharSequence[] entryValues = new CharSequence[numOfCameras]; 24270ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong for (int i = 0; i < numOfCameras; ++i) { 24370ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong entryValues[i] = "" + i; 2447add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 24559ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang preference.setEntryValues(entryValues); 24659ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang } 24759ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang 24873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private static boolean removePreference(PreferenceGroup group, String key) { 24973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin for (int i = 0, n = group.size(); i < n; i++) { 25073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin CameraPreference child = group.get(i); 2515945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (child instanceof PreferenceGroup) { 25273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (removePreference((PreferenceGroup) child, key)) { 2535945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return true; 2545945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2555945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 25673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (child instanceof ListPreference && 25773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ((ListPreference) child).getKey().equals(key)) { 25873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin group.removePreference(i); 25973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return true; 26073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 2615945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2625945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return false; 2635945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2645945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 26573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void filterUnsupportedOptions(PreferenceGroup group, 26678f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pref, List<String> supported) { 26778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 268df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // Remove the preference if the parameter is not supported or there is 269df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // only one options for the settings. 27022a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin if (supported == null || supported.size() <= 1) { 27173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, pref.getKey()); 2729dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 2739dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 2749dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 2751e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin pref.filterUnsupported(supported); 27622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li if (pref.getEntries().length <= 1) { 27722216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li removePreference(group, pref.getKey()); 27822216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li return; 27922216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li } 28087341536812081826656040ac81f8f386c6c1407Wu-cheng Li 281b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li resetIfInvalid(pref); 282b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li } 283b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li 284b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li private void resetIfInvalid(ListPreference pref) { 2852ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 2862ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 28778f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pref.findIndexOfValue(value) == NOT_FOUND) { 2882ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 28987341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 29087341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 29187341536812081826656040ac81f8f386c6c1407Wu-cheng Li 29278f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static List<String> sizeListToStringList(List<Size> sizes) { 29378f160ee416ba27ba55954950473e17ba9d20052Owen Lin ArrayList<String> list = new ArrayList<String>(); 29478f160ee416ba27ba55954950473e17ba9d20052Owen Lin for (Size size : sizes) { 29578f160ee416ba27ba55954950473e17ba9d20052Owen Lin list.add(String.format("%dx%d", size.width, size.height)); 296c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen } 29778f160ee416ba27ba55954950473e17ba9d20052Owen Lin return list; 298b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 2996f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 3001ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeLocalPreferences(SharedPreferences pref) { 3011ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int version; 3021ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang try { 3031ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = pref.getInt(KEY_LOCAL_VERSION, 0); 3041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } catch (Exception ex) { 3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = 0; 3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang if (version == CURRENT_LOCAL_VERSION) return; 308cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong 3091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = pref.edit(); 310cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong if (version == 1) { 311cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong // We use numbers to represent the quality now. The quality definition is identical to 312cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong // that of CamcorderProfile.java. 313cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong editor.remove("pref_video_quality_key"); 314cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong } 3151ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION); 3164714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3171ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3181ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 3191ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeGlobalPreferences(SharedPreferences pref) { 32040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang upgradeOldVersion(pref); 32140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang upgradeCameraId(pref); 32240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang } 32340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang 32440ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang private static void upgradeOldVersion(SharedPreferences pref) { 3256f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang int version; 3266f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang try { 3276f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = pref.getInt(KEY_VERSION, 0); 3286f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } catch (Exception ex) { 3296f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = 0; 3306f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 331a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin if (version == CURRENT_VERSION) return; 3326f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 333a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin SharedPreferences.Editor editor = pref.edit(); 3346f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (version == 0) { 335469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // We won't use the preference which change in version 1. 336469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // So, just upgrade to version 1 directly 337faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 1; 338faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 339faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (version == 1) { 340faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang // Change jpeg quality {65,75,85} to {normal,fine,superfine} 341faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang String quality = pref.getString(KEY_JPEG_QUALITY, "85"); 342faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (quality.equals("65")) { 343faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "normal"; 344faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else if (quality.equals("75")) { 345faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "fine"; 346faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else { 347faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "superfine"; 348faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 349faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang editor.putString(KEY_JPEG_QUALITY, quality); 350faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 2; 3516f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 3523e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin if (version == 2) { 3533e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin editor.putString(KEY_RECORD_LOCATION, 3543e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin pref.getBoolean(KEY_RECORD_LOCATION, false) 3553e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin ? RecordLocationPreference.VALUE_ON 3563e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin : RecordLocationPreference.VALUE_NONE); 3573e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin version = 3; 3583e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin } 359469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (version == 3) { 360469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // Just use video quality to replace it and 361469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // ignore the current settings. 362469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_videoquality_key"); 363469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_video_duration_key"); 364469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 36505999715cc38365aa4751a2a355eb1af284573abAngus Kong 366a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin editor.putInt(KEY_VERSION, CURRENT_VERSION); 3674714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3686f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 369469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 37040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang private static void upgradeCameraId(SharedPreferences pref) { 37140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang // The id stored in the preference may be out of range if we are running 37240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang // inside the emulator and a webcam is removed. 37340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang // Note: This method accesses the global preferences directly, not the 37440ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang // combo preferences. 37540ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang int cameraId = readPreferredCameraId(pref); 37640ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang if (cameraId == 0) return; // fast path 37740ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang 37840ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang int n = CameraHolder.instance().getNumberOfCameras(); 37940ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang if (cameraId < 0 || cameraId >= n) { 38040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang writePreferredCameraId(pref, 0); 38140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang } 38240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang } 38340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang 3841ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static int readPreferredCameraId(SharedPreferences pref) { 3852b4b2a4b2ec489f93b2a98d5c90d972c50a38c7dWu-cheng Li return Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0")); 386ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 387ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 3881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void writePreferredCameraId(SharedPreferences pref, 3891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int cameraId) { 3901ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang Editor editor = pref.edit(); 3917add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId)); 3924714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 393ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 394003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 395b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang public static int readExposure(ComboPreferences preferences) { 396b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang String exposure = preferences.getString( 397b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang CameraSettings.KEY_EXPOSURE, 398b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang EXPOSURE_DEFAULT_VALUE); 399b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang try { 400b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return Integer.parseInt(exposure); 401b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } catch (Exception ex) { 402b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang Log.e(TAG, "Invalid exposure: " + exposure); 403b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 404b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return 0; 405b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 406003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 4079efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala public static int readEffectType(SharedPreferences pref) { 4089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none"); 4099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.equals("none")) { 4109efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_NONE; 4119efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("goofy_face")) { 4129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GOOFY_FACE; 4139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("backdropper")) { 4149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_BACKDROPPER; 4159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala Log.e(TAG, "Invalid effect selection: " + effectSelection); 4179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_NONE; 4189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala public static Object readEffectParameter(SharedPreferences pref) { 4219efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none"); 4229efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.equals("none")) { 4239efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return null; 4249efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4259efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala int separatorIndex = effectSelection.indexOf('/'); 4269efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectParameter = 4279efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala effectSelection.substring(separatorIndex + 1); 4289efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.startsWith("goofy_face")) { 4299efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectParameter.equals("squeeze")) { 4309efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SQUEEZE; 4319efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_eyes")) { 4329efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_EYES; 4339efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_mouth")) { 4349efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_MOUTH; 4359efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("small_mouth")) { 4369efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SMALL_MOUTH; 4379efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_nose")) { 4389efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_NOSE; 4399efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("small_eyes")) { 4409efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SMALL_EYES; 4419efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4429efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("backdropper")) { 4439efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala // Parameter is a string that either encodes the URI to use, 4449efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala // or specifies 'gallery'. 4459efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return effectParameter; 4469efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4479efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4489efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala Log.e(TAG, "Invalid effect selection: " + effectSelection); 4499efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return null; 4509efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4519efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4529efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 453003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li public static void restorePreferences(Context context, 454003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li ComboPreferences preferences, Parameters parameters) { 455003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int currentCameraId = readPreferredCameraId(preferences); 456003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 457003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // Clear the preferences of both cameras. 458003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int backCameraId = CameraHolder.instance().getBackCameraId(); 459003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li if (backCameraId != -1) { 460003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li preferences.setLocalId(context, backCameraId); 461003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li Editor editor = preferences.edit(); 462003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.clear(); 463003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.apply(); 464003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 465003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int frontCameraId = CameraHolder.instance().getFrontCameraId(); 466003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li if (frontCameraId != -1) { 467003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li preferences.setLocalId(context, frontCameraId); 468003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li Editor editor = preferences.edit(); 469003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.clear(); 470003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.apply(); 471003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 472003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 4734a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li // Switch back to the preferences of the current camera. Otherwise, 4744a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li // we may write the preference to wrong camera later. 4754a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li preferences.setLocalId(context, currentCameraId); 4764a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li 477003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li upgradeGlobalPreferences(preferences.getGlobal()); 478003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li upgradeLocalPreferences(preferences.getLocal()); 479003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 480003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // Write back the current camera id because parameters are related to 481003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // the camera. Otherwise, we may switch to the front camera but the 482003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // initial picture size is that of the back camera. 483003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li initialCameraPictureSize(context, parameters); 484003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li writePreferredCameraId(preferences, currentCameraId); 485003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 48610208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li 48705999715cc38365aa4751a2a355eb1af284573abAngus Kong private ArrayList<String> getSupportedVideoQuality() { 48805999715cc38365aa4751a2a355eb1af284573abAngus Kong ArrayList<String> supported = new ArrayList<String>(); 48905999715cc38365aa4751a2a355eb1af284573abAngus Kong // Check for supported quality 49005999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_1080P)) { 49105999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P)); 49205999715cc38365aa4751a2a355eb1af284573abAngus Kong } 49305999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_720P)) { 49405999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_720P)); 49510208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li } 49605999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_480P)) { 49705999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_480P)); 49805999715cc38365aa4751a2a355eb1af284573abAngus Kong } 49905999715cc38365aa4751a2a355eb1af284573abAngus Kong 50005999715cc38365aa4751a2a355eb1af284573abAngus Kong return supported; 50110208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li } 5029efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 5039efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala private void initVideoEffect(PreferenceGroup group, ListPreference videoEffect) { 5049efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala CharSequence[] values = videoEffect.getEntryValues(); 5059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 50605999715cc38365aa4751a2a355eb1af284573abAngus Kong boolean goofyFaceSupported = 50705999715cc38365aa4751a2a355eb1af284573abAngus Kong EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_GOOFY_FACE); 5089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala boolean backdropperSupported = 5099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_BACKDROPPER) && 510f2229614847f060be34593757ca402ae62c7cc7dAhbong Chang Util.isAutoExposureLockSupported(mParameters) && 511f2229614847f060be34593757ca402ae62c7cc7dAhbong Chang Util.isAutoWhiteBalanceLockSupported(mParameters); 5129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 5139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala ArrayList<String> supported = new ArrayList<String>(); 5149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala for (CharSequence value : values) { 5159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = value.toString(); 5169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (!goofyFaceSupported && effectSelection.startsWith("goofy_face")) continue; 5179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (!backdropperSupported && effectSelection.startsWith("backdropper")) continue; 5189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala supported.add(effectSelection); 5199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 5209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 5219efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala filterUnsupportedOptions(group, videoEffect, supported); 5229efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 523b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 524