CameraSettings.java revision f6a9ed7f6b08d0694795adc6ea6fce999e8cab87
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"; 426227fa641518492a6b660c78463da18d9ec8fcd8Nipun Kwatra public static final String KEY_VIDEO_TIME_LAPSE_QUALITY = "pref_video_time_lapse_quality_key"; 43f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key"; 449dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 45e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 460f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 475945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 48da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key"; 4978f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key"; 5033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key"; 518d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key"; 5233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin public static final String KEY_EXPOSURE = "pref_camera_exposure_key"; 537add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public static final String KEY_CAMERA_ID = "pref_camera_id_key"; 548791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin 55469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_HIGH = "high"; 56469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_MMS = "mms"; 57469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_YOUTUBE = "youtube"; 586f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 59f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin public static final String EXPOSURE_DEFAULT_VALUE = "0"; 60f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin 61469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final int CURRENT_VERSION = 4; 621ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static final int CURRENT_LOCAL_VERSION = 1; 63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 64469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // max video duration in seconds for mms and youtube. 653a4ef93f95bed9f812fe75ef94296450833b3997James Dong private static final int MMS_VIDEO_DURATION = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW).duration; 66469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final int YOUTUBE_VIDEO_DURATION = 10 * 60; // 10 mins 67469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final int DEFAULT_VIDEO_DURATION = 30 * 60; // 10 mins 68469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 69469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final String DEFAULT_VIDEO_QUALITY_VALUE = "high"; 70b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 7178f160ee416ba27ba55954950473e17ba9d20052Owen Lin // MMS video length 7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final int DEFAULT_VIDEO_DURATION_VALUE = -1; 734305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 7471d56e21859a797ec4633f209b3605276345d44eOwen Lin @SuppressWarnings("unused") 7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final String TAG = "CameraSettings"; 7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin 7778f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Context mContext; 7878f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Parameters mParameters; 797add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private final CameraInfo[] mCameraInfo; 8078f160ee416ba27ba55954950473e17ba9d20052Owen Lin 817add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li public CameraSettings(Activity activity, Parameters parameters, 827add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li CameraInfo[] cameraInfo) { 8378f160ee416ba27ba55954950473e17ba9d20052Owen Lin mContext = activity; 8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters = parameters; 857add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li mCameraInfo = cameraInfo; 8678f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 8778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 8873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public PreferenceGroup getPreferenceGroup(int preferenceRes) { 8973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceInflater inflater = new PreferenceInflater(mContext); 9073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group = 9173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin (PreferenceGroup) inflater.inflate(preferenceRes); 9273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin initPreference(group); 9373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return group; 9478f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 9578f160ee416ba27ba55954950473e17ba9d20052Owen Lin 9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static void initialCameraPictureSize( 9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin Context context, Parameters parameters) { 9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // When launching the camera app first time, we will set the picture 9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // size to the first one in the list defined in "arrays.xml" and is also 10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // supported by the driver. 10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin List<Size> supported = parameters.getSupportedPictureSizes(); 10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (supported == null) return; 10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (String candidate : context.getResources().getStringArray( 10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin R.array.pref_camera_picturesize_entryvalues)) { 10532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (setCameraPictureSize(candidate, supported, parameters)) { 1061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = ComboPreferences 1071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang .get(context).edit(); 10832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin editor.putString(KEY_PICTURE_SIZE, candidate); 1094714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return; 11132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 1134ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin Log.e(TAG, "No supported picture size found"); 11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 1167e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen public static void removePreferenceFromScreen( 11773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group, String key) { 11873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, key); 1197e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen } 1207e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen 12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static boolean setCameraPictureSize( 12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin String candidate, List<Size> supported, Parameters parameters) { 12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int index = candidate.indexOf('x'); 12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (index == NOT_FOUND) return false; 12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int width = Integer.parseInt(candidate.substring(0, index)); 12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int height = Integer.parseInt(candidate.substring(index + 1)); 12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (Size size: supported) { 12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (size.width == width && size.height == height) { 12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin parameters.setPictureSize(width, height); 13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return true; 13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return false; 13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 13673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void initPreference(PreferenceGroup group) { 137469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY); 138035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra ListPreference videoTimeLapseQuality = group.findPreference(KEY_VIDEO_TIME_LAPSE_QUALITY); 13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE); 14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference whiteBalance = group.findPreference(KEY_WHITE_BALANCE); 14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT); 14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE); 14373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference flashMode = group.findPreference(KEY_FLASH_MODE); 14473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE); 14533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin ListPreference exposure = group.findPreference(KEY_EXPOSURE); 1467add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li IconListPreference cameraId = 1477add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li (IconListPreference)group.findPreference(KEY_CAMERA_ID); 1486988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin ListPreference videoFlashMode = 1496988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE); 15078f160ee416ba27ba55954950473e17ba9d20052Owen Lin 15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Since the screen could be loaded from different resources, we need 15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin // to check if the preference is available here 153469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (videoQuality != null) { 15478f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Modify video duration settings. 15578f160ee416ba27ba55954950473e17ba9d20052Owen Lin // The first entry is for MMS video duration, and we need to fill 15678f160ee416ba27ba55954950473e17ba9d20052Owen Lin // in the device-dependent value (in seconds). 157469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin CharSequence[] entries = videoQuality.getEntries(); 158469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin CharSequence[] values = videoQuality.getEntryValues(); 159469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin for (int i = 0; i < entries.length; ++i) { 160469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (VIDEO_QUALITY_MMS.equals(values[i])) { 161469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin entries[i] = entries[i].toString().replace( 162469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin "30", Integer.toString(MMS_VIDEO_DURATION)); 163469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin break; 164469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 165469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 1664305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li } 1674305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 16878f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Filter out unsupported settings / options 169035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra if (videoTimeLapseQuality != null) { 170035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra filterUnsupportedOptions(group, videoTimeLapseQuality, getSupportedTimeLapseProfiles()); 171035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra } 17278f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pictureSize != null) { 17373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, pictureSize, sizeListToStringList( 17478f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters.getSupportedPictureSizes())); 1753f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 17678f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (whiteBalance != null) { 17773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 17878f160ee416ba27ba55954950473e17ba9d20052Owen Lin whiteBalance, mParameters.getSupportedWhiteBalance()); 1790f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 18078f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (colorEffect != null) { 18173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 18278f160ee416ba27ba55954950473e17ba9d20052Owen Lin colorEffect, mParameters.getSupportedColorEffects()); 18378f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 18478f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (sceneMode != null) { 18573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 18678f160ee416ba27ba55954950473e17ba9d20052Owen Lin sceneMode, mParameters.getSupportedSceneModes()); 1870f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 188b6ad206f53981faee04800b787569dbb60492844Owen Lin if (flashMode != null) { 18973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 190b6ad206f53981faee04800b787569dbb60492844Owen Lin flashMode, mParameters.getSupportedFlashModes()); 191b6ad206f53981faee04800b787569dbb60492844Owen Lin } 192df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin if (focusMode != null) { 19373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 194df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin focusMode, mParameters.getSupportedFocusModes()); 1956988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin } 1966988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin if (videoFlashMode != null) { 1976988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin filterUnsupportedOptions(group, 1986988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin videoFlashMode, mParameters.getSupportedFlashModes()); 199df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin } 2007add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (exposure != null) buildExposureCompensation(group, exposure); 2017add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (cameraId != null) buildCameraId(group, cameraId); 20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 204035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra private static List<String> getSupportedTimeLapseProfiles() { 205035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra ArrayList<String> supportedProfiles = new ArrayList<String>(); 206035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P)) { 207035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_480P)); 208035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra } 209035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_720P)) { 210035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_720P)); 211035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra } 212035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_1080P)) { 213035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_1080P)); 214035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra } 215035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra 216035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra return supportedProfiles; 217035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra } 218035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra 21933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin private void buildExposureCompensation( 22033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin PreferenceGroup group, ListPreference exposure) { 22133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int max = mParameters.getMaxExposureCompensation(); 22233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int min = mParameters.getMinExposureCompensation(); 22333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (max == 0 && min == 0) { 22433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin removePreference(group, exposure.getKey()); 22533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return; 22633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 22733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float step = mParameters.getExposureCompensationStep(); 22833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 22933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin // show only integer values for exposure compensation 23033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int maxValue = (int) Math.floor(max * step); 23133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int minValue = (int) Math.ceil(min * step); 23233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entries[] = new CharSequence[maxValue - minValue + 1]; 23333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1]; 23433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin for (int i = minValue; i <= maxValue; ++i) { 23533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entryValues[maxValue - i] = Integer.toString(Math.round(i / step)); 23633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin StringBuilder builder = new StringBuilder(); 23733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (i > 0) builder.append('+'); 23833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entries[maxValue - i] = builder.append(i).toString(); 23933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 24033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntries(entries); 24133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntryValues(entryValues); 242b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 243b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 2447add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li private void buildCameraId( 2457add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li PreferenceGroup group, IconListPreference cameraId) { 2467add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li int numOfCameras = mCameraInfo.length; 2477add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (numOfCameras < 2) { 2487add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li removePreference(group, cameraId.getKey()); 2497add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li return; 2507add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2517add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li 2527add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li CharSequence entries[] = new CharSequence[numOfCameras]; 2537add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li CharSequence entryValues[] = new CharSequence[numOfCameras]; 2547add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li int[] iconIds = new int[numOfCameras]; 2557add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li int[] largeIconIds = new int[numOfCameras]; 2567add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li for (int i = 0; i < numOfCameras; i++) { 2577add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li entryValues[i] = Integer.toString(i); 2587add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li if (mCameraInfo[i].mFacing == CameraInfo.CAMERA_FACING_FRONT) { 2597add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li entries[i] = mContext.getString( 2607add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li R.string.pref_camera_id_entry_front); 2617add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li iconIds[i] = R.drawable.ic_menuselect_camera_facing_front; 2627add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_front; 2637add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } else { 2647add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li entries[i] = mContext.getString( 2657add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li R.string.pref_camera_id_entry_back); 2667add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li iconIds[i] = R.drawable.ic_menuselect_camera_facing_back; 2677add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_back; 2687add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2697add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li cameraId.setEntries(entries); 2717add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li cameraId.setEntryValues(entryValues); 2727add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li cameraId.setIconIds(iconIds); 2737add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li cameraId.setLargeIconIds(largeIconIds); 2747add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li } 2757add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li 27673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private static boolean removePreference(PreferenceGroup group, String key) { 27773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin for (int i = 0, n = group.size(); i < n; i++) { 27873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin CameraPreference child = group.get(i); 2795945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (child instanceof PreferenceGroup) { 28073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (removePreference((PreferenceGroup) child, key)) { 2815945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return true; 2825945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2835945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 28473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (child instanceof ListPreference && 28573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ((ListPreference) child).getKey().equals(key)) { 28673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin group.removePreference(i); 28773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return true; 28873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 2895945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2905945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return false; 2915945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2925945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 29373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void filterUnsupportedOptions(PreferenceGroup group, 29478f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pref, List<String> supported) { 29578f160ee416ba27ba55954950473e17ba9d20052Owen Lin 296df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin CharSequence[] allEntries = pref.getEntries(); 297df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin 298df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // Remove the preference if the parameter is not supported or there is 299df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // only one options for the settings. 30022a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin if (supported == null || supported.size() <= 1) { 30173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, pref.getKey()); 3029dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 3039dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 3049dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 3051e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin pref.filterUnsupported(supported); 30687341536812081826656040ac81f8f386c6c1407Wu-cheng Li 3072ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 3082ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 30978f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pref.findIndexOfValue(value) == NOT_FOUND) { 3102ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 31187341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 31287341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 31387341536812081826656040ac81f8f386c6c1407Wu-cheng Li 31478f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static List<String> sizeListToStringList(List<Size> sizes) { 31578f160ee416ba27ba55954950473e17ba9d20052Owen Lin ArrayList<String> list = new ArrayList<String>(); 31678f160ee416ba27ba55954950473e17ba9d20052Owen Lin for (Size size : sizes) { 31778f160ee416ba27ba55954950473e17ba9d20052Owen Lin list.add(String.format("%dx%d", size.width, size.height)); 318c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen } 31978f160ee416ba27ba55954950473e17ba9d20052Owen Lin return list; 320b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 3216f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 3221ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeLocalPreferences(SharedPreferences pref) { 3231ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int version; 3241ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang try { 3251ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = pref.getInt(KEY_LOCAL_VERSION, 0); 3261ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } catch (Exception ex) { 3271ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = 0; 3281ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3291ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang if (version == CURRENT_LOCAL_VERSION) return; 3301ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = pref.edit(); 3311ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION); 3324714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3331ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3341ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 3351ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeGlobalPreferences(SharedPreferences pref) { 3366f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang int version; 3376f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang try { 3386f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = pref.getInt(KEY_VERSION, 0); 3396f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } catch (Exception ex) { 3406f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = 0; 3416f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 342a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin if (version == CURRENT_VERSION) return; 3436f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 344a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin SharedPreferences.Editor editor = pref.edit(); 3456f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (version == 0) { 346469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // We won't use the preference which change in version 1. 347469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // So, just upgrade to version 1 directly 348faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 1; 349faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 350faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (version == 1) { 351faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang // Change jpeg quality {65,75,85} to {normal,fine,superfine} 352faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang String quality = pref.getString(KEY_JPEG_QUALITY, "85"); 353faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (quality.equals("65")) { 354faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "normal"; 355faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else if (quality.equals("75")) { 356faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "fine"; 357faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else { 358faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "superfine"; 359faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 360faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang editor.putString(KEY_JPEG_QUALITY, quality); 361faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 2; 3626f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 3633e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin if (version == 2) { 3643e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin editor.putString(KEY_RECORD_LOCATION, 3653e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin pref.getBoolean(KEY_RECORD_LOCATION, false) 3663e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin ? RecordLocationPreference.VALUE_ON 3673e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin : RecordLocationPreference.VALUE_NONE); 3683e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin version = 3; 3693e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin } 370469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (version == 3) { 371469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // Just use video quality to replace it and 372469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // ignore the current settings. 373469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_videoquality_key"); 374469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_video_duration_key"); 375469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 376a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin editor.putInt(KEY_VERSION, CURRENT_VERSION); 3774714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3786f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 379469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 3801ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeAllPreferences(ComboPreferences pref) { 3811ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang upgradeGlobalPreferences(pref.getGlobal()); 3821ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang upgradeLocalPreferences(pref.getLocal()); 3831ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3841ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 385469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static boolean getVideoQuality(String quality) { 386469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return VIDEO_QUALITY_YOUTUBE.equals( 387469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin quality) || VIDEO_QUALITY_HIGH.equals(quality); 388469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 389469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 390469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static int getVidoeDurationInMillis(String quality) { 391469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (VIDEO_QUALITY_MMS.equals(quality)) { 392469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return MMS_VIDEO_DURATION * 1000; 393469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } else if (VIDEO_QUALITY_YOUTUBE.equals(quality)) { 394469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return YOUTUBE_VIDEO_DURATION * 1000; 395469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 396469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return DEFAULT_VIDEO_DURATION * 1000; 397469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 398ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 3991ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static int readPreferredCameraId(SharedPreferences pref) { 4007add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li String id = Integer.toString(android.hardware.Camera.CAMERA_ID_DEFAULT); 4017add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li return Integer.parseInt(pref.getString(KEY_CAMERA_ID, id)); 402ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 403ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 4041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void writePreferredCameraId(SharedPreferences pref, 4051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int cameraId) { 4061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang Editor editor = pref.edit(); 4077add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId)); 4084714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 409ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 410b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 411