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