CameraSettings.java revision 0a475e11e2ceadbaa70308b52e06f4e6d9e56f12
1b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/* 2b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 4b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * you may not use this file except in compliance with the License. 6b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * You may obtain a copy of the License at 7b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 8b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 10b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * See the License for the specific language governing permissions and 14b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * limitations under the License. 15b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */ 16b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera; 18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 19b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences; 20b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences.OnSharedPreferenceChangeListener; 2187341536812081826656040ac81f8f386c6c1407Wu-cheng Liimport android.hardware.Camera.Parameters; 22b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Bundle; 23b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.preference.ListPreference; 24b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.preference.PreferenceActivity; 25d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen 26d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList; 27d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.StringTokenizer; 2887341536812081826656040ac81f8f386c6c1407Wu-cheng Li 29b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/** 30b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * CameraSettings 31b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */ 32272c3fdc60d4b4f773dfdff46ad3dd643ce22d5cChih-Chung Changpublic class CameraSettings extends PreferenceActivity implements 33272c3fdc60d4b4f773dfdff46ad3dd643ce22d5cChih-Chung Chang OnSharedPreferenceChangeListener { 340a475e11e2ceadbaa70308b52e06f4e6d9e56f12Chih-Chung Chang public static final String KEY_VIDEO_QUALITY = 352ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li "pref_camera_videoquality_key"; 360a475e11e2ceadbaa70308b52e06f4e6d9e56f12Chih-Chung Chang public static final String KEY_WHITE_BALANCE = 372ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li "pref_camera_whitebalance_key"; 382ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li public static final String KEY_EFFECT = "pref_camera_effect_key"; 399dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 40e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 410f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 42b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true; 43b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 44b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project private ListPreference mVideoQuality; 4587341536812081826656040ac81f8f386c6c1407Wu-cheng Li private ListPreference mWhiteBalance; 462ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li private ListPreference mEffect; 479dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li private ListPreference mPictureSize; 48e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li private ListPreference mJpegQuality; 490f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li private ListPreference mFocusMode; 5087341536812081826656040ac81f8f386c6c1407Wu-cheng Li private Parameters mParameters; 51b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 52b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project @Override 532ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li public void onCreate(Bundle icicle) { 54b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project super.onCreate(icicle); 55b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project addPreferencesFromResource(R.xml.camera_preferences); 56b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 57b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project initUI(); 58b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 59b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 60b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project @Override 61b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project protected void onResume() { 62b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project super.onResume(); 6387341536812081826656040ac81f8f386c6c1407Wu-cheng Li 642ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateVideoQualitySummary(); 652ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateWhiteBalanceSummary(); 662ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateEffectSummary(); 679dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li updatePictureSizeSummary(); 68e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li updateJpegQualitySummary(); 690f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li updateFocusModeSummary(); 70b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 71b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 72b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project private void initUI() { 73b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project mVideoQuality = (ListPreference) findPreference(KEY_VIDEO_QUALITY); 7487341536812081826656040ac81f8f386c6c1407Wu-cheng Li mWhiteBalance = (ListPreference) findPreference(KEY_WHITE_BALANCE); 752ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li mEffect = (ListPreference) findPreference(KEY_EFFECT); 769dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li mPictureSize = (ListPreference) findPreference(KEY_PICTURE_SIZE); 77e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li mJpegQuality = (ListPreference) findPreference(KEY_JPEG_QUALITY); 780f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li mFocusMode = (ListPreference) findPreference(KEY_FOCUS_MODE); 792ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li getPreferenceScreen().getSharedPreferences(). 802ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li registerOnSharedPreferenceChangeListener(this); 812ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li 822ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Get parameters. 832ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li android.hardware.Camera device = android.hardware.Camera.open(); 842ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li mParameters = device.getParameters(); 852ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li device.release(); 862ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li 872ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Create white balance settings. 882ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li createSettings(mWhiteBalance, Camera.SUPPORTED_WHITE_BALANCE, 892ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li R.array.pref_camera_whitebalance_entries, 902ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li R.array.pref_camera_whitebalance_entryvalues); 91b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 922ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Create effect settings. 932ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li createSettings(mEffect, Camera.SUPPORTED_EFFECT, 942ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li R.array.pref_camera_effect_entries, 952ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li R.array.pref_camera_effect_entryvalues); 969dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 979dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li // Create picture size settings. 989dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li createSettings(mPictureSize, Camera.SUPPORTED_PICTURE_SIZE, 999dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li R.array.pref_camera_picturesize_entries, 1009dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li R.array.pref_camera_picturesize_entryvalues); 1010f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li 1020f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li // Set default JPEG quality value if it is empty. 1030f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li if (mJpegQuality.getValue() == null) { 1040f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li mJpegQuality.setValue(getString( 1050f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li R.string.pref_camera_jpegquality_default)); 1060f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 1070f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li 1080f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li // Set default focus mode value if it is empty. 1090f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li if (mFocusMode.getValue() == null) { 1100f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li mFocusMode.setValue(getString( 1110f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li R.string.pref_camera_focusmode_default)); 1120f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 113b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 114b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 1152ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li private void createSettings( 1162ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ListPreference pref, String paramName, int prefEntriesResId, 1172ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li int prefEntryValuesResId) { 1189dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li // Disable the preference if the parameter is not supported. 1192ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String supportedParamStr = mParameters.get(paramName); 1200a475e11e2ceadbaa70308b52e06f4e6d9e56f12Chih-Chung Chang if (supportedParamStr == null) { 1219dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li pref.setEnabled(false); 1229dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li return; 1239dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 1249dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 1259dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li // Get the supported parameter settings. 1262ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li StringTokenizer tokenizer = new StringTokenizer(supportedParamStr, ","); 1272ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ArrayList<CharSequence> supportedParam = new ArrayList<CharSequence>(); 12887341536812081826656040ac81f8f386c6c1407Wu-cheng Li while (tokenizer.hasMoreElements()) { 1292ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li supportedParam.add(tokenizer.nextToken()); 13087341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 13187341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1322ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Prepare setting entries and entry values. 1332ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String[] allEntries = getResources().getStringArray(prefEntriesResId); 1342ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String[] allEntryValues = getResources().getStringArray( 1352ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li prefEntryValuesResId); 1362ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ArrayList<CharSequence> entries = new ArrayList<CharSequence>(); 1372ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>(); 1382ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li for (int i = 0, len = allEntryValues.length; i < len; i++) { 1392ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li int found = supportedParam.indexOf(allEntryValues[i]); 14087341536812081826656040ac81f8f386c6c1407Wu-cheng Li if (found != -1) { 1412ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li entries.add(allEntries[i]); 1422ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li entryValues.add(allEntryValues[i]); 14387341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 14487341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 14587341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1462ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set entries and entry values to list preference. 1472ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setEntries(entries.toArray(new CharSequence[entries.size()])); 1482ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setEntryValues(entryValues.toArray( 1492ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li new CharSequence[entryValues.size()])); 15087341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1512ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li // Set the value to the first entry if it is invalid. 1522ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li String value = pref.getValue(); 1532ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li int index = pref.findIndexOfValue(value); 15487341536812081826656040ac81f8f386c6c1407Wu-cheng Li if (index == -1) { 1552ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li pref.setValueIndex(0); 15687341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 15787341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 15887341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1592ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li private void updateVideoQualitySummary() { 1602ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li mVideoQuality.setSummary(mVideoQuality.getEntry()); 16187341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 16287341536812081826656040ac81f8f386c6c1407Wu-cheng Li 1632ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li private void updateWhiteBalanceSummary() { 1642ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li mWhiteBalance.setSummary(mWhiteBalance.getEntry()); 165b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 166b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 1672ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li private void updateEffectSummary() { 1682ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li mEffect.setSummary(mEffect.getEntry()); 169b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 170b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 1719dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li private void updatePictureSizeSummary() { 1729dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li mPictureSize.setSummary(mPictureSize.getEntry()); 1739dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } 1749dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li 175e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li private void updateJpegQualitySummary() { 176e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li mJpegQuality.setSummary(mJpegQuality.getEntry()); 177e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li } 178e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li 1790f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li private void updateFocusModeSummary() { 1800f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li mFocusMode.setSummary(mFocusMode.getEntry()); 1810f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } 1820f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li 183b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 184b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project String key) { 18587341536812081826656040ac81f8f386c6c1407Wu-cheng Li if (key.equals(KEY_VIDEO_QUALITY)) { 1862ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateVideoQualitySummary(); 18787341536812081826656040ac81f8f386c6c1407Wu-cheng Li } else if (key.equals(KEY_WHITE_BALANCE)) { 1882ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateWhiteBalanceSummary(); 1892ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li } else if (key.equals(KEY_EFFECT)) { 1902ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li updateEffectSummary(); 1919dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li } else if (key.equals(KEY_PICTURE_SIZE)) { 1929dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li updatePictureSizeSummary(); 193e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li } else if (key.equals(KEY_JPEG_QUALITY)) { 194e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li updateJpegQualitySummary(); 1950f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li } else if (key.equals(KEY_FOCUS_MODE)) { 1960f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li updateFocusModeSummary(); 19787341536812081826656040ac81f8f386c6c1407Wu-cheng Li } 198b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 199b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project} 200