CameraSettings.java revision 71d56e21859a797ec4633f209b3605276345d44e
1b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera; 2b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 378f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.app.Activity; 478f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.content.Context; 5b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences; 687341536812081826656040ac81f8f386c6c1407Wu-cheng Liimport android.hardware.Camera.Parameters; 74305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.hardware.Camera.Size; 86f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Changimport android.os.SystemProperties; 9b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.preference.ListPreference; 105945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Liimport android.preference.Preference; 115945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Liimport android.preference.PreferenceGroup; 1278f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.preference.PreferenceManager; 1378f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.preference.PreferenceScreen; 14d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen 15d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList; 164305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List; 1787341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1878f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings { 1978f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final int FIRST_REQUEST_CODE = 100; 2078f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final int NOT_FOUND = -1; 2178f160ee416ba27ba55954950473e17ba9d20052Owen Lin 2278f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_VERSION = "pref_version_key"; 2378f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_RECORD_LOCATION = 2478f160ee416ba27ba55954950473e17ba9d20052Owen Lin "pref_camera_recordlocation_key"; 250a475e11e2ceadbaa70308b52e06f4e6d9e56f12Chih-Chung Chang public static final String KEY_VIDEO_QUALITY = 262ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li "pref_camera_videoquality_key"; 2782ded2070a47fff16e1de1c78b516eb25888b91eChih-Chung Chang public static final String KEY_VIDEO_DURATION = 2882ded2070a47fff16e1de1c78b516eb25888b91eChih-Chung Chang "pref_camera_video_duration_key"; 299dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 30e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 310f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 325945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 3378f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key"; 345f6484a74fe019337e436e6e0dcb07375a74af25President Li public static final String KEY_WHITE_BALANCE = 355f6484a74fe019337e436e6e0dcb07375a74af25President Li "pref_camera_whitebalance_key"; 368d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key"; 376d12b828743cbd81767227229d6351ce412d5698Owen Lin 3878f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final int CURRENT_VERSION = 1; 396f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 406f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang // max mms video duration in seconds. 416f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang public static final int MMS_VIDEO_DURATION = 426f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang SystemProperties.getInt("ro.media.enc.lprof.duration", 60); 43b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 4478f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true; 45b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 4678f160ee416ba27ba55954950473e17ba9d20052Owen Lin // MMS video length 4778f160ee416ba27ba55954950473e17ba9d20052Owen Lin public static final int DEFAULT_VIDEO_DURATION_VALUE = -1; 484305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 4971d56e21859a797ec4633f209b3605276345d44eOwen Lin @SuppressWarnings("unused") 5078f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static final String TAG = "CameraSettings"; 5178f160ee416ba27ba55954950473e17ba9d20052Owen Lin 5278f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Context mContext; 5378f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final Parameters mParameters; 5478f160ee416ba27ba55954950473e17ba9d20052Owen Lin private final PreferenceManager mManager; 5578f160ee416ba27ba55954950473e17ba9d20052Owen Lin 5678f160ee416ba27ba55954950473e17ba9d20052Owen Lin public CameraSettings(Activity activity, Parameters parameters) { 5778f160ee416ba27ba55954950473e17ba9d20052Owen Lin mContext = activity; 5878f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters = parameters; 5978f160ee416ba27ba55954950473e17ba9d20052Owen Lin mManager = new PreferenceManager(activity, FIRST_REQUEST_CODE); 6078f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 6178f160ee416ba27ba55954950473e17ba9d20052Owen Lin 6278f160ee416ba27ba55954950473e17ba9d20052Owen Lin public PreferenceScreen getPreferenceScreen(int preferenceRes) { 6378f160ee416ba27ba55954950473e17ba9d20052Owen Lin PreferenceScreen screen = mManager.createPreferenceScreen(mContext); 6478f160ee416ba27ba55954950473e17ba9d20052Owen Lin mManager.inflateFromResource(mContext, preferenceRes, screen); 6578f160ee416ba27ba55954950473e17ba9d20052Owen Lin initPreference(screen); 6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin return screen; 6778f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 6878f160ee416ba27ba55954950473e17ba9d20052Owen Lin 6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin private void initPreference(PreferenceScreen screen) { 7078f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference videoDuration = 7178f160ee416ba27ba55954950473e17ba9d20052Owen Lin (ListPreference) screen.findPreference(KEY_VIDEO_DURATION); 7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pictureSize = 7378f160ee416ba27ba55954950473e17ba9d20052Owen Lin (ListPreference) screen.findPreference(KEY_PICTURE_SIZE); 7478f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference whiteBalance = 7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin (ListPreference) screen.findPreference(KEY_WHITE_BALANCE); 7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference colorEffect = 7778f160ee416ba27ba55954950473e17ba9d20052Owen Lin (ListPreference) screen.findPreference(KEY_COLOR_EFFECT); 7878f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference sceneMode = 7978f160ee416ba27ba55954950473e17ba9d20052Owen Lin (ListPreference) screen.findPreference(KEY_SCENE_MODE); 80b6ad206f53981faee04800b787569dbb60492844Owen Lin ListPreference flashMode = 81b6ad206f53981faee04800b787569dbb60492844Owen Lin (ListPreference) screen.findPreference(KEY_FLASH_MODE); 8278f160ee416ba27ba55954950473e17ba9d20052Owen Lin 8378f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Since the screen could be loaded from different resources, we need 8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin // to check if the preference is available here 8578f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (videoDuration != null) { 8678f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Modify video duration settings. 8778f160ee416ba27ba55954950473e17ba9d20052Owen Lin // The first entry is for MMS video duration, and we need to fill 8878f160ee416ba27ba55954950473e17ba9d20052Owen Lin // in the device-dependent value (in seconds). 8978f160ee416ba27ba55954950473e17ba9d20052Owen Lin CharSequence[] entries = videoDuration.getEntries(); 9078f160ee416ba27ba55954950473e17ba9d20052Owen Lin entries[0] = String.format( 9178f160ee416ba27ba55954950473e17ba9d20052Owen Lin entries[0].toString(), MMS_VIDEO_DURATION); 924305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li } 934305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li 9478f160ee416ba27ba55954950473e17ba9d20052Owen Lin // Filter out unsupported settings / options 9578f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pictureSize != null) { 9678f160ee416ba27ba55954950473e17ba9d20052Owen Lin filterUnsupportedOptions(screen, pictureSize, sizeListToStringList( 9778f160ee416ba27ba55954950473e17ba9d20052Owen Lin mParameters.getSupportedPictureSizes())); 983f3c857e3f34650c15d764810335024654b0fcc3Owen Lin } 9978f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (whiteBalance != null) { 10078f160ee416ba27ba55954950473e17ba9d20052Owen Lin filterUnsupportedOptions(screen, 10178f160ee416ba27ba55954950473e17ba9d20052Owen Lin whiteBalance, mParameters.getSupportedWhiteBalance()); 1020f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 10378f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (colorEffect != null) { 10478f160ee416ba27ba55954950473e17ba9d20052Owen Lin filterUnsupportedOptions(screen, 10578f160ee416ba27ba55954950473e17ba9d20052Owen Lin colorEffect, mParameters.getSupportedColorEffects()); 10678f160ee416ba27ba55954950473e17ba9d20052Owen Lin } 10778f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (sceneMode != null) { 10878f160ee416ba27ba55954950473e17ba9d20052Owen Lin filterUnsupportedOptions(screen, 10978f160ee416ba27ba55954950473e17ba9d20052Owen Lin sceneMode, mParameters.getSupportedSceneModes()); 1100f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 111b6ad206f53981faee04800b787569dbb60492844Owen Lin if (flashMode != null) { 112b6ad206f53981faee04800b787569dbb60492844Owen Lin filterUnsupportedOptions(screen, 113b6ad206f53981faee04800b787569dbb60492844Owen Lin flashMode, mParameters.getSupportedFlashModes()); 114b6ad206f53981faee04800b787569dbb60492844Owen Lin } 115b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 116b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 1175945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li private boolean removePreference(PreferenceGroup group, Preference remove) { 1185945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (group.removePreference(remove)) return true; 1195945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 1205945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li for (int i = 0; i < group.getPreferenceCount(); i++) { 1215945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li final Preference child = group.getPreference(i); 1225945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li if (child instanceof PreferenceGroup) { 123522e836abc90bcb2d4e7a4ac37e269154d06c715Chih-Chung Chang if (removePreference((PreferenceGroup) child, remove)) { 1245945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return true; 1255945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 1265945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 1275945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 1285945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li return false; 1295945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li } 1305945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li 13178f160ee416ba27ba55954950473e17ba9d20052Owen Lin private void filterUnsupportedOptions(PreferenceScreen screen, 13278f160ee416ba27ba55954950473e17ba9d20052Owen Lin ListPreference pref, List<String> supported) { 13378f160ee416ba27ba55954950473e17ba9d20052Owen Lin 1345945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li // Remove the preference if the parameter is not supported. 13578f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (supported == null) { 13678f160ee416ba27ba55954950473e17ba9d20052Owen Lin removePreference(screen, pref); 1379dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 1389dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 1399dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 1402ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Prepare setting entries and entry values. 1415945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li CharSequence[] allEntries = pref.getEntries(); 1425945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li CharSequence[] allEntryValues = pref.getEntryValues(); 1432ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ArrayList<CharSequence> entries = new ArrayList<CharSequence>(); 1442ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>(); 1452ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li for (int i = 0, len = allEntryValues.length; i < len; i++) { 14678f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) { 1472ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li entries.add(allEntries[i]); 1482ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li entryValues.add(allEntryValues[i]); 14987341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 15087341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 15187341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1522ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set entries and entry values to list preference. 1532ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setEntries(entries.toArray(new CharSequence[entries.size()])); 1542ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setEntryValues(entryValues.toArray( 1552ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li new CharSequence[entryValues.size()])); 15687341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1572ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 1582ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 15978f160ee416ba27ba55954950473e17ba9d20052Owen Lin if (pref.findIndexOfValue(value) == NOT_FOUND) { 1602ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 16187341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 16287341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 16387341536812081826656040ac81f8f386c6c1407Wu-cheng Li 16478f160ee416ba27ba55954950473e17ba9d20052Owen Lin private static List<String> sizeListToStringList(List<Size> sizes) { 16578f160ee416ba27ba55954950473e17ba9d20052Owen Lin ArrayList<String> list = new ArrayList<String>(); 16678f160ee416ba27ba55954950473e17ba9d20052Owen Lin for (Size size : sizes) { 16778f160ee416ba27ba55954950473e17ba9d20052Owen Lin list.add(String.format("%dx%d", size.width, size.height)); 168c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen } 16978f160ee416ba27ba55954950473e17ba9d20052Owen Lin return list; 170b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 1716f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 1726f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang public static void upgradePreferences(SharedPreferences pref) { 1736f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang int version; 1746f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang try { 1756f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = pref.getInt(KEY_VERSION, 0); 1766f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } catch (Exception ex) { 1776f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang version = 0; 1786f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 1796f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang 1806f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (version == 0) { 1816f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang SharedPreferences.Editor editor = pref.edit(); 1826f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang // For old version, change 1 to -1 for video duration preference. 1836f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang if (pref.getString(KEY_VIDEO_DURATION, "1").equals("1")) { 1846f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang editor.putString(KEY_VIDEO_DURATION, "-1"); 1856f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 1866f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang editor.putInt(KEY_VERSION, CURRENT_VERSION); 1876f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang editor.commit(); 1886f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 1896f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang } 190b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 191