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