CameraSettings.java revision 22216b6cc942fc3a97b99d6bce4b1a86f19c08d4
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; 238eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-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"; 429dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 43e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 440f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 455945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 46da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key"; 4778f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_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"; 518eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li public static final String KEY_CAMERA_ID = "pref_camera_id_key"; 528791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin 53469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_HIGH = "high"; 54469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_MMS = "mms"; 55469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final String VIDEO_QUALITY_YOUTUBE = "youtube"; 566f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 57f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin public static final String EXPOSURE_DEFAULT_VALUE = "0"; 58f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin 59469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final int CURRENT_VERSION = 4; 601ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static final int CURRENT_LOCAL_VERSION = 1; 61b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 62469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // max video duration in seconds for mms and youtube. 633a4ef93f95bed9f812fe75ef94296450833b3997James Dong private static final int MMS_VIDEO_DURATION = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW).duration; 64469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final int YOUTUBE_VIDEO_DURATION = 10 * 60; // 10 mins 65469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin private static final int DEFAULT_VIDEO_DURATION = 30 * 60; // 10 mins 66469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 67469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static final String DEFAULT_VIDEO_QUALITY_VALUE = "high"; 68b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin // MMS video length 7078f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final int DEFAULT_VIDEO_DURATION_VALUE = -1; 714305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 7271d56e21859a797ec4633f209b3605276345d44eOwen Lin @SuppressWarnings("unused") 7378f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final String TAG = "CameraSettings"; 7478f160ee416ba27ba55954950473e17ba9d20052Owen Lin 7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Context mContext; 7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Parameters mParameters; 778eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li private final CameraInfo[] mCameraInfo; 7878f160ee416ba27ba55954950473e17ba9d20052Owen Lin 798eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li public CameraSettings(Activity activity, Parameters parameters, 808eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li CameraInfo[] cameraInfo) { 8178f160ee416ba27ba55954950473e17ba9d20052Owen Lin mContext = activity; 8278f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters = parameters; 838eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li mCameraInfo = cameraInfo; 8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 8578f160ee416ba27ba55954950473e17ba9d20052Owen Lin 8673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin public PreferenceGroup getPreferenceGroup(int preferenceRes) { 8773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceInflater inflater = new PreferenceInflater(mContext); 8873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group = 8973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin (PreferenceGroup) inflater.inflate(preferenceRes); 9073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin initPreference(group); 9173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return group; 9278f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 9378f160ee416ba27ba55954950473e17ba9d20052Owen Lin 9432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static void initialCameraPictureSize( 9532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin Context context, Parameters parameters) { 9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // When launching the camera app first time, we will set the picture 9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // size to the first one in the list defined in "arrays.xml" and is also 9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin // supported by the driver. 9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin List<Size> supported = parameters.getSupportedPictureSizes(); 10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (supported == null) return; 10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (String candidate : context.getResources().getStringArray( 10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin R.array.pref_camera_picturesize_entryvalues)) { 10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (setCameraPictureSize(candidate, supported, parameters)) { 1041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = ComboPreferences 1051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang .get(context).edit(); 10632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin editor.putString(KEY_PICTURE_SIZE, candidate); 1074714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 10832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return; 10932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 1114ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin Log.e(TAG, "No supported picture size found"); 11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 1147e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen public static void removePreferenceFromScreen( 11573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin PreferenceGroup group, String key) { 11673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, key); 1177e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen } 1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen 11932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin public static boolean setCameraPictureSize( 12032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin String candidate, List<Size> supported, Parameters parameters) { 12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int index = candidate.indexOf('x'); 12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (index == NOT_FOUND) return false; 12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int width = Integer.parseInt(candidate.substring(0, index)); 12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin int height = Integer.parseInt(candidate.substring(index + 1)); 12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin for (Size size: supported) { 12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin if (size.width == width && size.height == height) { 12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin parameters.setPictureSize(width, height); 12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return true; 12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin return false; 13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin } 13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin 13473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void initPreference(PreferenceGroup group) { 135469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY); 13673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE); 13773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference whiteBalance = group.findPreference(KEY_WHITE_BALANCE); 13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT); 13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE); 14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference flashMode = group.findPreference(KEY_FLASH_MODE); 14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE); 14233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin ListPreference exposure = group.findPreference(KEY_EXPOSURE); 1438eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li IconListPreference cameraId = 1448eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li (IconListPreference)group.findPreference(KEY_CAMERA_ID); 1456988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin ListPreference videoFlashMode = 1466988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE); 14778f160ee416ba27ba55954950473e17ba9d20052Owen Lin 14878f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Since the screen could be loaded from different resources, we need 14978f160ee416ba27ba55954950473e17ba9d20052Owen Lin // to check if the preference is available here 150469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (videoQuality != null) { 15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Modify video duration settings. 15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin // The first entry is for MMS video duration, and we need to fill 15378f160ee416ba27ba55954950473e17ba9d20052Owen Lin // in the device-dependent value (in seconds). 154469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin CharSequence[] entries = videoQuality.getEntries(); 155469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin CharSequence[] values = videoQuality.getEntryValues(); 156469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin for (int i = 0; i < entries.length; ++i) { 157469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (VIDEO_QUALITY_MMS.equals(values[i])) { 158469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin entries[i] = entries[i].toString().replace( 159469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin "30", Integer.toString(MMS_VIDEO_DURATION)); 160469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin break; 161469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 162469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 1634305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li } 1644305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 16578f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Filter out unsupported settings / options 16678f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pictureSize != null) { 16773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, pictureSize, sizeListToStringList( 16878f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters.getSupportedPictureSizes())); 1693f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 17078f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (whiteBalance != null) { 17173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 17278f160ee416ba27ba55954950473e17ba9d20052Owen Lin whiteBalance, mParameters.getSupportedWhiteBalance()); 1730f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 17478f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (colorEffect != null) { 17573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 17678f160ee416ba27ba55954950473e17ba9d20052Owen Lin colorEffect, mParameters.getSupportedColorEffects()); 17778f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 17878f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (sceneMode != null) { 17973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 18078f160ee416ba27ba55954950473e17ba9d20052Owen Lin sceneMode, mParameters.getSupportedSceneModes()); 1810f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 182b6ad206f53981faee04800b787569dbb60492844Owen Lin if (flashMode != null) { 18373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 184b6ad206f53981faee04800b787569dbb60492844Owen Lin flashMode, mParameters.getSupportedFlashModes()); 185b6ad206f53981faee04800b787569dbb60492844Owen Lin } 186df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin if (focusMode != null) { 18773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin filterUnsupportedOptions(group, 188df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin focusMode, mParameters.getSupportedFocusModes()); 1896988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin } 1906988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin if (videoFlashMode != null) { 1916988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin filterUnsupportedOptions(group, 1926988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin videoFlashMode, mParameters.getSupportedFlashModes()); 193df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin } 1948eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li if (exposure != null) buildExposureCompensation(group, exposure); 1958eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li if (cameraId != null) buildCameraId(group, cameraId); 19633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 19733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 19833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin private void buildExposureCompensation( 19933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin PreferenceGroup group, ListPreference exposure) { 20033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int max = mParameters.getMaxExposureCompensation(); 20133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int min = mParameters.getMinExposureCompensation(); 20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (max == 0 && min == 0) { 20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin removePreference(group, exposure.getKey()); 20433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin return; 20533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin float step = mParameters.getExposureCompensationStep(); 20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin 20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin // show only integer values for exposure compensation 20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int maxValue = (int) Math.floor(max * step); 21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin int minValue = (int) Math.ceil(min * step); 21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entries[] = new CharSequence[maxValue - minValue + 1]; 21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1]; 21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin for (int i = minValue; i <= maxValue; ++i) { 21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entryValues[maxValue - i] = Integer.toString(Math.round(i / step)); 21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin StringBuilder builder = new StringBuilder(); 21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (i > 0) builder.append('+'); 21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin entries[maxValue - i] = builder.append(i).toString(); 21833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 21933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntries(entries); 22033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin exposure.setEntryValues(entryValues); 221b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 222b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 2238eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li private void buildCameraId( 2248eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li PreferenceGroup group, IconListPreference cameraId) { 2258eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li int numOfCameras = mCameraInfo.length; 2268eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li if (numOfCameras < 2) { 2278eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li removePreference(group, cameraId.getKey()); 2288eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li return; 2298eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li } 2308eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li 2318eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li CharSequence entries[] = new CharSequence[numOfCameras]; 2328eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li CharSequence entryValues[] = new CharSequence[numOfCameras]; 2338eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li int[] iconIds = new int[numOfCameras]; 2348eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li int[] largeIconIds = new int[numOfCameras]; 2358eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li for (int i = 0; i < numOfCameras; i++) { 2368eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li entryValues[i] = Integer.toString(i); 237c97d23826a28dd725951eccb62651244f9fb8228Wu-cheng Li if (mCameraInfo[i].facing == CameraInfo.CAMERA_FACING_FRONT) { 2388eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li entries[i] = mContext.getString( 2398eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li R.string.pref_camera_id_entry_front); 2408eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li iconIds[i] = R.drawable.ic_menuselect_camera_facing_front; 2418eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_front; 2428eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li } else { 2438eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li entries[i] = mContext.getString( 2448eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li R.string.pref_camera_id_entry_back); 2458eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li iconIds[i] = R.drawable.ic_menuselect_camera_facing_back; 2468eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_back; 2478eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li } 2488eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li } 2498eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li cameraId.setEntries(entries); 2508eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li cameraId.setEntryValues(entryValues); 2518eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li cameraId.setIconIds(iconIds); 2528eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li cameraId.setLargeIconIds(largeIconIds); 2538eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li } 2548eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li 25573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private static boolean removePreference(PreferenceGroup group, String key) { 25673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin for (int i = 0, n = group.size(); i < n; i++) { 25773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin CameraPreference child = group.get(i); 2585945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (child instanceof PreferenceGroup) { 25973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (removePreference((PreferenceGroup) child, key)) { 2605945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return true; 2615945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2625945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 26373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin if (child instanceof ListPreference && 26473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin ((ListPreference) child).getKey().equals(key)) { 26573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin group.removePreference(i); 26673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin return true; 26773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin } 2685945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2695945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return false; 2705945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 2715945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 27273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin private void filterUnsupportedOptions(PreferenceGroup group, 27378f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pref, List<String> supported) { 27478f160ee416ba27ba55954950473e17ba9d20052Owen Lin 275df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin CharSequence[] allEntries = pref.getEntries(); 276df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin 277df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // Remove the preference if the parameter is not supported or there is 278df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin // only one options for the settings. 27922a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin if (supported == null || supported.size() <= 1) { 28073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin removePreference(group, pref.getKey()); 2819dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 2829dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 2839dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 2841e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin pref.filterUnsupported(supported); 28522216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li if (pref.getEntries().length <= 1) { 28622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li removePreference(group, pref.getKey()); 28722216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li return; 28822216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li } 28987341536812081826656040ac81f8f386c6c1407Wu-cheng Li 2902ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 2912ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 29278f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pref.findIndexOfValue(value) == NOT_FOUND) { 2932ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 29487341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 29587341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 29687341536812081826656040ac81f8f386c6c1407Wu-cheng Li 29778f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static List<String> sizeListToStringList(List<Size> sizes) { 29878f160ee416ba27ba55954950473e17ba9d20052Owen Lin ArrayList<String> list = new ArrayList<String>(); 29978f160ee416ba27ba55954950473e17ba9d20052Owen Lin for (Size size : sizes) { 30078f160ee416ba27ba55954950473e17ba9d20052Owen Lin list.add(String.format("%dx%d", size.width, size.height)); 301c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen } 30278f160ee416ba27ba55954950473e17ba9d20052Owen Lin return list; 303b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 3046f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeLocalPreferences(SharedPreferences pref) { 3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int version; 3071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang try { 3081ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = pref.getInt(KEY_LOCAL_VERSION, 0); 3091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } catch (Exception ex) { 3101ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang version = 0; 3111ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3121ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang if (version == CURRENT_LOCAL_VERSION) return; 3131ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang SharedPreferences.Editor editor = pref.edit(); 3141ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION); 3154714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3161ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3171ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 3181ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeGlobalPreferences(SharedPreferences pref) { 3196f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang int version; 3206f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang try { 3216f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = pref.getInt(KEY_VERSION, 0); 3226f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } catch (Exception ex) { 3236f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = 0; 3246f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 325a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin if (version == CURRENT_VERSION) return; 3266f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 327a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin SharedPreferences.Editor editor = pref.edit(); 3286f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (version == 0) { 329469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // We won't use the preference which change in version 1. 330469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // So, just upgrade to version 1 directly 331faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 1; 332faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 333faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (version == 1) { 334faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang // Change jpeg quality {65,75,85} to {normal,fine,superfine} 335faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang String quality = pref.getString(KEY_JPEG_QUALITY, "85"); 336faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang if (quality.equals("65")) { 337faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "normal"; 338faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else if (quality.equals("75")) { 339faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "fine"; 340faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } else { 341faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang quality = "superfine"; 342faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang } 343faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang editor.putString(KEY_JPEG_QUALITY, quality); 344faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang version = 2; 3456f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 3463e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin if (version == 2) { 3473e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin editor.putString(KEY_RECORD_LOCATION, 3483e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin pref.getBoolean(KEY_RECORD_LOCATION, false) 3493e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin ? RecordLocationPreference.VALUE_ON 3503e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin : RecordLocationPreference.VALUE_NONE); 3513e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin version = 3; 3523e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin } 353469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (version == 3) { 354469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // Just use video quality to replace it and 355469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin // ignore the current settings. 356469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_videoquality_key"); 357469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin editor.remove("pref_camera_video_duration_key"); 358469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 359a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin editor.putInt(KEY_VERSION, CURRENT_VERSION); 3604714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 3616f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 362469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 3631ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void upgradeAllPreferences(ComboPreferences pref) { 3641ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang upgradeGlobalPreferences(pref.getGlobal()); 3651ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang upgradeLocalPreferences(pref.getLocal()); 3661ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang } 3671ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang 368469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static boolean getVideoQuality(String quality) { 369469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return VIDEO_QUALITY_YOUTUBE.equals( 370469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin quality) || VIDEO_QUALITY_HIGH.equals(quality); 371469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 372469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin 373469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin public static int getVidoeDurationInMillis(String quality) { 374469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin if (VIDEO_QUALITY_MMS.equals(quality)) { 375469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return MMS_VIDEO_DURATION * 1000; 376469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } else if (VIDEO_QUALITY_YOUTUBE.equals(quality)) { 377469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return YOUTUBE_VIDEO_DURATION * 1000; 378469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 379469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin return DEFAULT_VIDEO_DURATION * 1000; 380469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin } 381ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 3821ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static int readPreferredCameraId(SharedPreferences pref) { 3838eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li String id = Integer.toString(android.hardware.Camera.CAMERA_ID_DEFAULT); 3848eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li return Integer.parseInt(pref.getString(KEY_CAMERA_ID, id)); 385ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 386ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang 3871ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang public static void writePreferredCameraId(SharedPreferences pref, 3881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang int cameraId) { 3891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang Editor editor = pref.edit(); 3908eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId)); 3914714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li editor.apply(); 392ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 393b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 394