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; 277e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chenimport android.util.Log; 28d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen 29d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList; 304305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List; 3187341536812081826656040ac81f8f386c6c1407Wu-cheng Li 32271b3095b9f763421c0547109da9de774795072dChih-Chung Chang/** 33271b3095b9f763421c0547109da9de774795072dChih-Chung Chang * Provides utilities and keys for Camera settings. 34271b3095b9f763421c0547109da9de774795072dChih-Chung Chang */ 3578f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings { 3678f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final int NOT_FOUND = -1; 3778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 3878f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_VERSION = "pref_version_key"; 391ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static final String KEY_LOCAL_VERSION = "pref_local_version_key"; 4033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_RECORD_LOCATION = RecordLocationPreference.KEY; 41469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final String KEY_VIDEO_QUALITY = "pref_video_quality_key"; 42f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key"; 439dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 44e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 450f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 465945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 47da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key"; 4833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key"; 498d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key"; 5033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_EXPOSURE = "pref_camera_exposure_key"; 5171e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li public static final String KEY_VIDEO_EFFECT = "pref_video_effect_key"; 527add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public static final String KEY_CAMERA_ID = "pref_camera_id_key"; 53d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang public static final String KEY_CAMERA_FIRST_USE_HINT_SHOWN = "pref_camera_first_use_hint_shown_key"; 54d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang public static final String KEY_VIDEO_FIRST_USE_HINT_SHOWN = "pref_video_first_use_hint_shown_key"; 558791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin 56f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin public static final String EXPOSURE_DEFAULT_VALUE = "0"; 57f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin 5805999715cc38365aa4751a2a355eb1af284573abAngus Kong public static final int CURRENT_VERSION = 5; 59cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong public static final int CURRENT_LOCAL_VERSION = 2; 60b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6105999715cc38365aa4751a2a355eb1af284573abAngus Kong public static final int DEFAULT_VIDEO_DURATION = 0; // no limit 62b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6378f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final String TAG = "CameraSettings"; 6478f160ee416ba27ba55954950473e17ba9d20052Owen Lin 6578f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Context mContext; 6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Parameters mParameters; 677add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private final CameraInfo[] mCameraInfo; 68c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li private final int mCameraId; 6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin 707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public CameraSettings(Activity activity, Parameters parameters, 71c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li int cameraId, CameraInfo[] cameraInfo) { 7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin mContext = activity; 7378f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters = parameters; 74c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li mCameraId = cameraId; 757add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li mCameraInfo = cameraInfo; 7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 7778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 7873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public PreferenceGroup getPreferenceGroup(int preferenceRes) { 7973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceInflater inflater = new PreferenceInflater(mContext); 8073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group = 8173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin (PreferenceGroup) inflater.inflate(preferenceRes); 8273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin initPreference(group); 8373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return group; 8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 8578f160ee416ba27ba55954950473e17ba9d20052Owen Lin 86926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala public static String getDefaultVideoQuality(int cameraId, 87926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala String defaultQuality) { 88cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong int quality = Integer.valueOf(defaultQuality); 89926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala if (CamcorderProfile.hasProfile(cameraId, quality)) { 9005999715cc38365aa4751a2a355eb1af284573abAngus Kong return defaultQuality; 9105999715cc38365aa4751a2a355eb1af284573abAngus Kong } 9205999715cc38365aa4751a2a355eb1af284573abAngus Kong return Integer.toString(CamcorderProfile.QUALITY_HIGH); 9305999715cc38365aa4751a2a355eb1af284573abAngus Kong } 9405999715cc38365aa4751a2a355eb1af284573abAngus Kong 9532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static void initialCameraPictureSize( 9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin Context context, Parameters parameters) { 9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // When launching the camera app first time, we will set the picture 9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // size to the first one in the list defined in "arrays.xml" and is also 9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // supported by the driver. 10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin List<Size> supported = parameters.getSupportedPictureSizes(); 10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (supported == null) return; 10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (String candidate : context.getResources().getStringArray( 10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin R.array.pref_camera_picturesize_entryvalues)) { 10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (setCameraPictureSize(candidate, supported, parameters)) { 1051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = ComboPreferences 1061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang .get(context).edit(); 10732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin editor.putString(KEY_PICTURE_SIZE, candidate); 1084714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 10932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return; 11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 1124ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin Log.e(TAG, "No supported picture size found"); 11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 1157e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen public static void removePreferenceFromScreen( 11673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group, String key) { 11773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, key); 1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen } 1197e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen 12032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static boolean setCameraPictureSize( 12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin String candidate, List<Size> supported, Parameters parameters) { 12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int index = candidate.indexOf('x'); 12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (index == NOT_FOUND) return false; 12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int width = Integer.parseInt(candidate.substring(0, index)); 12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int height = Integer.parseInt(candidate.substring(index + 1)); 12605999715cc38365aa4751a2a355eb1af284573abAngus Kong for (Size size : supported) { 12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (size.width == width && size.height == height) { 12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin parameters.setPictureSize(width, height); 12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return true; 13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return false; 13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 13573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void initPreference(PreferenceGroup group) { 136469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY); 137b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li ListPreference timeLapseInterval = group.findPreference(KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL); 13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE); 13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference whiteBalance = group.findPreference(KEY_WHITE_BALANCE); 14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE); 14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference flashMode = group.findPreference(KEY_FLASH_MODE); 14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE); 14333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin ListPreference exposure = group.findPreference(KEY_EXPOSURE); 144c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li IconListPreference cameraIdPref = 14505999715cc38365aa4751a2a355eb1af284573abAngus Kong (IconListPreference) group.findPreference(KEY_CAMERA_ID); 1466988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin ListPreference videoFlashMode = 1476988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE); 14871e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li ListPreference videoEffect = group.findPreference(KEY_VIDEO_EFFECT); 14978f160ee416ba27ba55954950473e17ba9d20052Owen Lin 15078f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Since the screen could be loaded from different resources, we need 15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin // to check if the preference is available here 152469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (videoQuality != null) { 15305999715cc38365aa4751a2a355eb1af284573abAngus Kong filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality()); 1544305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li } 1554305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 15678f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pictureSize != null) { 15773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, pictureSize, sizeListToStringList( 15878f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters.getSupportedPictureSizes())); 1593f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 16078f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (whiteBalance != null) { 16173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 16278f160ee416ba27ba55954950473e17ba9d20052Owen Lin whiteBalance, mParameters.getSupportedWhiteBalance()); 1630f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 16478f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (sceneMode != null) { 16573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 16678f160ee416ba27ba55954950473e17ba9d20052Owen Lin sceneMode, mParameters.getSupportedSceneModes()); 1670f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 168b6ad206f53981faee04800b787569dbb60492844Owen Lin if (flashMode != null) { 16973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 170b6ad206f53981faee04800b787569dbb60492844Owen Lin flashMode, mParameters.getSupportedFlashModes()); 171b6ad206f53981faee04800b787569dbb60492844Owen Lin } 172df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin if (focusMode != null) { 173f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li if (mParameters.getMaxNumFocusAreas() == 0) { 174f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li filterUnsupportedOptions(group, 175f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li focusMode, mParameters.getSupportedFocusModes()); 176f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li } else { 177f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li // Remove the focus mode if we can use tap-to-focus. 178f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li removePreference(group, focusMode.getKey()); 179f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li } 1806988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin } 1816988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin if (videoFlashMode != null) { 1826988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin filterUnsupportedOptions(group, 1836988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin videoFlashMode, mParameters.getSupportedFlashModes()); 184df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin } 1857add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (exposure != null) buildExposureCompensation(group, exposure); 186c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li if (cameraIdPref != null) buildCameraId(group, cameraIdPref); 187b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li 188b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li if (timeLapseInterval != null) resetIfInvalid(timeLapseInterval); 1899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (videoEffect != null) { 1909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala initVideoEffect(group, videoEffect); 1919efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala resetIfInvalid(videoEffect); 1929efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 19333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 19433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 19533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin private void buildExposureCompensation( 19633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin PreferenceGroup group, ListPreference exposure) { 19733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int max = mParameters.getMaxExposureCompensation(); 19833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int min = mParameters.getMinExposureCompensation(); 19933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (max == 0 && min == 0) { 20033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin removePreference(group, exposure.getKey()); 20133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return; 20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float step = mParameters.getExposureCompensationStep(); 20433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 20533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin // show only integer values for exposure compensation 20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int maxValue = (int) Math.floor(max * step); 20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int minValue = (int) Math.ceil(min * step); 20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entries[] = new CharSequence[maxValue - minValue + 1]; 20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1]; 21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin for (int i = minValue; i <= maxValue; ++i) { 21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entryValues[maxValue - i] = Integer.toString(Math.round(i / step)); 21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin StringBuilder builder = new StringBuilder(); 21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (i > 0) builder.append('+'); 21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entries[maxValue - i] = builder.append(i).toString(); 21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntries(entries); 21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntryValues(entryValues); 218b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 219b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 2207add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private void buildCameraId( 22159ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang PreferenceGroup group, IconListPreference preference) { 2227add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li int numOfCameras = mCameraInfo.length; 2237add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (numOfCameras < 2) { 22459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang removePreference(group, preference.getKey()); 2257add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li return; 2267add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2277add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li 2283ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong CharSequence[] entryValues = new CharSequence[numOfCameras]; 2293ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong for (int i = 0; i < numOfCameras; ++i) { 2303ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong entryValues[i] = "" + i; 2317add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 23259ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang preference.setEntryValues(entryValues); 23359ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang } 23459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang 23573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private static boolean removePreference(PreferenceGroup group, String key) { 23673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin for (int i = 0, n = group.size(); i < n; i++) { 23773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin CameraPreference child = group.get(i); 2385945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (child instanceof PreferenceGroup) { 23973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (removePreference((PreferenceGroup) child, key)) { 2405945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return true; 2415945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2425945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 24373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (child instanceof ListPreference && 24473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ((ListPreference) child).getKey().equals(key)) { 24573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin group.removePreference(i); 24673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return true; 24773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 2485945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2495945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return false; 2505945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2515945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 25273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void filterUnsupportedOptions(PreferenceGroup group, 25378f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pref, List<String> supported) { 25478f160ee416ba27ba55954950473e17ba9d20052Owen Lin 255df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // Remove the preference if the parameter is not supported or there is 256df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // only one options for the settings. 25722a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin if (supported == null || supported.size() <= 1) { 25873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, pref.getKey()); 2599dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 2609dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 2619dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 2621e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin pref.filterUnsupported(supported); 26322216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li if (pref.getEntries().length <= 1) { 26422216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li removePreference(group, pref.getKey()); 26522216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li return; 26622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li } 26787341536812081826656040ac81f8f386c6c1407Wu-cheng Li 268b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li resetIfInvalid(pref); 269b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li } 270b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li 271b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li private void resetIfInvalid(ListPreference pref) { 2722ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 2732ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 27478f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pref.findIndexOfValue(value) == NOT_FOUND) { 2752ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 27687341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 27787341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 27887341536812081826656040ac81f8f386c6c1407Wu-cheng Li 27978f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static List<String> sizeListToStringList(List<Size> sizes) { 28078f160ee416ba27ba55954950473e17ba9d20052Owen Lin ArrayList<String> list = new ArrayList<String>(); 28178f160ee416ba27ba55954950473e17ba9d20052Owen Lin for (Size size : sizes) { 28278f160ee416ba27ba55954950473e17ba9d20052Owen Lin list.add(String.format("%dx%d", size.width, size.height)); 283c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen } 28478f160ee416ba27ba55954950473e17ba9d20052Owen Lin return list; 285b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 2866f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 2871ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeLocalPreferences(SharedPreferences pref) { 2881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int version; 2891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang try { 2901ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = pref.getInt(KEY_LOCAL_VERSION, 0); 2911ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } catch (Exception ex) { 2921ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = 0; 2931ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 2941ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang if (version == CURRENT_LOCAL_VERSION) return; 295cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong 2961ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = pref.edit(); 297cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong if (version == 1) { 298cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong // We use numbers to represent the quality now. The quality definition is identical to 299cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong // that of CamcorderProfile.java. 300cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong editor.remove("pref_video_quality_key"); 301cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong } 3021ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION); 3034714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeGlobalPreferences(SharedPreferences pref) { 3076f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang int version; 3086f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang try { 3096f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = pref.getInt(KEY_VERSION, 0); 3106f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } catch (Exception ex) { 3116f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = 0; 3126f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 313a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin if (version == CURRENT_VERSION) return; 3146f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 315a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin SharedPreferences.Editor editor = pref.edit(); 3166f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (version == 0) { 317469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // We won't use the preference which change in version 1. 318469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // So, just upgrade to version 1 directly 319faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 1; 320faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 321faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (version == 1) { 322faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang // Change jpeg quality {65,75,85} to {normal,fine,superfine} 323faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang String quality = pref.getString(KEY_JPEG_QUALITY, "85"); 324faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (quality.equals("65")) { 325faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "normal"; 326faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else if (quality.equals("75")) { 327faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "fine"; 328faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else { 329faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "superfine"; 330faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 331faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang editor.putString(KEY_JPEG_QUALITY, quality); 332faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 2; 3336f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 3343e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin if (version == 2) { 3353e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin editor.putString(KEY_RECORD_LOCATION, 3363e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin pref.getBoolean(KEY_RECORD_LOCATION, false) 3373e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin ? RecordLocationPreference.VALUE_ON 3383e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin : RecordLocationPreference.VALUE_NONE); 3393e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin version = 3; 3403e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin } 341469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (version == 3) { 342469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // Just use video quality to replace it and 343469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // ignore the current settings. 344469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_videoquality_key"); 345469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_video_duration_key"); 346469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 34705999715cc38365aa4751a2a355eb1af284573abAngus Kong 348a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin editor.putInt(KEY_VERSION, CURRENT_VERSION); 3494714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3506f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 351469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 3521ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static int readPreferredCameraId(SharedPreferences pref) { 3532b4b2a4b2ec489f93b2a98d5c90d972c50a38c7dWu-cheng Li return Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0")); 354ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 355ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 3561ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void writePreferredCameraId(SharedPreferences pref, 3571ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int cameraId) { 3581ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang Editor editor = pref.edit(); 3597add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId)); 3604714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 361ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 362003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 363b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang public static int readExposure(ComboPreferences preferences) { 364b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang String exposure = preferences.getString( 365b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang CameraSettings.KEY_EXPOSURE, 366b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang EXPOSURE_DEFAULT_VALUE); 367b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang try { 368b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return Integer.parseInt(exposure); 369b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } catch (Exception ex) { 370b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang Log.e(TAG, "Invalid exposure: " + exposure); 371b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 372b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return 0; 373b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 374003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 3759efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala public static int readEffectType(SharedPreferences pref) { 3769efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none"); 3779efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.equals("none")) { 3789efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_NONE; 3799efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("goofy_face")) { 3809efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GOOFY_FACE; 3819efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("backdropper")) { 3829efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_BACKDROPPER; 3839efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 3849efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala Log.e(TAG, "Invalid effect selection: " + effectSelection); 3859efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_NONE; 3869efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 3879efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 3889efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala public static Object readEffectParameter(SharedPreferences pref) { 3899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none"); 3909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.equals("none")) { 3919efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return null; 3929efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 3939efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala int separatorIndex = effectSelection.indexOf('/'); 3949efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectParameter = 3959efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala effectSelection.substring(separatorIndex + 1); 3969efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectSelection.startsWith("goofy_face")) { 3979efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (effectParameter.equals("squeeze")) { 3989efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SQUEEZE; 3999efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_eyes")) { 4009efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_EYES; 4019efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_mouth")) { 4029efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_MOUTH; 4039efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("small_mouth")) { 4049efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SMALL_MOUTH; 4059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("big_nose")) { 4069efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_BIG_NOSE; 4079efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectParameter.equals("small_eyes")) { 4089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return EffectsRecorder.EFFECT_GF_SMALL_EYES; 4099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4109efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } else if (effectSelection.startsWith("backdropper")) { 4119efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala // Parameter is a string that either encodes the URI to use, 4129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala // or specifies 'gallery'. 4139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return effectParameter; 4149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala Log.e(TAG, "Invalid effect selection: " + effectSelection); 4179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala return null; 4189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 421003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li public static void restorePreferences(Context context, 422003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li ComboPreferences preferences, Parameters parameters) { 423003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int currentCameraId = readPreferredCameraId(preferences); 424003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 425003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // Clear the preferences of both cameras. 426003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int backCameraId = CameraHolder.instance().getBackCameraId(); 427003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li if (backCameraId != -1) { 428003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li preferences.setLocalId(context, backCameraId); 429003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li Editor editor = preferences.edit(); 430003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.clear(); 431003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.apply(); 432003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 433003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li int frontCameraId = CameraHolder.instance().getFrontCameraId(); 434003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li if (frontCameraId != -1) { 435003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li preferences.setLocalId(context, frontCameraId); 436003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li Editor editor = preferences.edit(); 437003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.clear(); 438003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li editor.apply(); 439003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 440003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 4414a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li // Switch back to the preferences of the current camera. Otherwise, 4424a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li // we may write the preference to wrong camera later. 4434a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li preferences.setLocalId(context, currentCameraId); 4444a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li 445003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li upgradeGlobalPreferences(preferences.getGlobal()); 446003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li upgradeLocalPreferences(preferences.getLocal()); 447003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li 448003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // Write back the current camera id because parameters are related to 449003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // the camera. Otherwise, we may switch to the front camera but the 450003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li // initial picture size is that of the back camera. 451003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li initialCameraPictureSize(context, parameters); 452003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li writePreferredCameraId(preferences, currentCameraId); 453003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li } 45410208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li 45505999715cc38365aa4751a2a355eb1af284573abAngus Kong private ArrayList<String> getSupportedVideoQuality() { 45605999715cc38365aa4751a2a355eb1af284573abAngus Kong ArrayList<String> supported = new ArrayList<String>(); 45705999715cc38365aa4751a2a355eb1af284573abAngus Kong // Check for supported quality 45805999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_1080P)) { 45905999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P)); 46005999715cc38365aa4751a2a355eb1af284573abAngus Kong } 46105999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_720P)) { 46205999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_720P)); 46310208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li } 46405999715cc38365aa4751a2a355eb1af284573abAngus Kong if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_480P)) { 46505999715cc38365aa4751a2a355eb1af284573abAngus Kong supported.add(Integer.toString(CamcorderProfile.QUALITY_480P)); 46605999715cc38365aa4751a2a355eb1af284573abAngus Kong } 46705999715cc38365aa4751a2a355eb1af284573abAngus Kong 46805999715cc38365aa4751a2a355eb1af284573abAngus Kong return supported; 46910208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li } 4709efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4719efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala private void initVideoEffect(PreferenceGroup group, ListPreference videoEffect) { 4729efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala CharSequence[] values = videoEffect.getEntryValues(); 4739efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 47405999715cc38365aa4751a2a355eb1af284573abAngus Kong boolean goofyFaceSupported = 47505999715cc38365aa4751a2a355eb1af284573abAngus Kong EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_GOOFY_FACE); 4769efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala boolean backdropperSupported = 4779efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_BACKDROPPER) && 4789efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala mParameters.isAutoExposureLockSupported() && 4799efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala mParameters.isAutoWhiteBalanceLockSupported(); 4809efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4819efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala ArrayList<String> supported = new ArrayList<String>(); 4829efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala for (CharSequence value : values) { 4839efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala String effectSelection = value.toString(); 4849efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (!goofyFaceSupported && effectSelection.startsWith("goofy_face")) continue; 4859efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala if (!backdropperSupported && effectSelection.startsWith("backdropper")) continue; 4869efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala supported.add(effectSelection); 4879efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 4889efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala 4899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala filterUnsupportedOptions(group, videoEffect, supported); 4909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala } 491b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 492