CameraSettings.java revision df3731bacfe26910a5dd0813c6aa80a6e55b85ad
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;
62f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Linimport android.graphics.drawable.Drawable;
787341536812081826656040ac81f8f386c6c1407Wu-cheng Liimport android.hardware.Camera.Parameters;
84305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.hardware.Camera.Size;
96f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Changimport android.os.SystemProperties;
10b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.preference.ListPreference;
115945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Liimport android.preference.Preference;
125945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Liimport android.preference.PreferenceGroup;
1378f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.preference.PreferenceManager;
1478f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.preference.PreferenceScreen;
157e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chenimport android.util.Log;
16d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen
17d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList;
184305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List;
1987341536812081826656040ac81f8f386c6c1407Wu-cheng Li
2078f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings {
2178f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final int FIRST_REQUEST_CODE = 100;
2278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final int NOT_FOUND = -1;
2378f160ee416ba27ba55954950473e17ba9d20052Owen Lin
2478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_VERSION = "pref_version_key";
2578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_RECORD_LOCATION =
2678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            "pref_camera_recordlocation_key";
270a475e11e2ceadbaa70308b52e06f4e6d9e56f12Chih-Chung Chang    public static final String KEY_VIDEO_QUALITY =
282ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            "pref_camera_videoquality_key";
2982ded2070a47fff16e1de1c78b516eb25888b91eChih-Chung Chang    public static final String KEY_VIDEO_DURATION =
3082ded2070a47fff16e1de1c78b516eb25888b91eChih-Chung Chang            "pref_camera_video_duration_key";
319dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
32e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
330f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
345945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
3578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
365f6484a74fe019337e436e6e0dcb07375a74af25President Li    public static final String KEY_WHITE_BALANCE =
375f6484a74fe019337e436e6e0dcb07375a74af25President Li            "pref_camera_whitebalance_key";
388d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin    public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
396d12b828743cbd81767227229d6351ce412d5698Owen Lin
4078f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final int CURRENT_VERSION = 1;
416f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
426f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    // max mms video duration in seconds.
436f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    public static final int MMS_VIDEO_DURATION =
446f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
45b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
4678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true;
47b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
4878f160ee416ba27ba55954950473e17ba9d20052Owen Lin    // MMS video length
4978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final int DEFAULT_VIDEO_DURATION_VALUE = -1;
504305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
5171d56e21859a797ec4633f209b3605276345d44eOwen Lin    @SuppressWarnings("unused")
5278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final String TAG = "CameraSettings";
5378f160ee416ba27ba55954950473e17ba9d20052Owen Lin
5478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Context mContext;
5578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Parameters mParameters;
5678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final PreferenceManager mManager;
5778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
5878f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public CameraSettings(Activity activity, Parameters parameters) {
5978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mContext = activity;
6078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mParameters = parameters;
6178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mManager = new PreferenceManager(activity, FIRST_REQUEST_CODE);
6278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
6378f160ee416ba27ba55954950473e17ba9d20052Owen Lin
6478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public PreferenceScreen getPreferenceScreen(int preferenceRes) {
6578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        PreferenceScreen screen = mManager.createPreferenceScreen(mContext);
6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mManager.inflateFromResource(mContext, preferenceRes, screen);
6778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        initPreference(screen);
6878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return screen;
6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
7078f160ee416ba27ba55954950473e17ba9d20052Owen Lin
7132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static void initialCameraPictureSize(
7232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            Context context, Parameters parameters) {
7332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // When launching the camera app first time, we will set the picture
7432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // size to the first one in the list defined in "arrays.xml" and is also
7532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // supported by the driver.
7632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        List<Size> supported = parameters.getSupportedPictureSizes();
7732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (supported == null) return;
7832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (String candidate : context.getResources().getStringArray(
7932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                R.array.pref_camera_picturesize_entryvalues)) {
8032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (setCameraPictureSize(candidate, supported, parameters)) {
8132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                SharedPreferences.Editor editor = PreferenceManager
8232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                        .getDefaultSharedPreferences(context).edit();
8332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.putString(KEY_PICTURE_SIZE, candidate);
8432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.commit();
8532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return;
8632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
8732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
8832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
8932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
907e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    public static void removePreferenceFromScreen(
917e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen            PreferenceScreen screen, String key) {
927e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen        Preference pref = screen.findPreference(key);
937e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen        if (pref == null) {
947e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen            Log.i(TAG, "No preference found based the key : " + key);
957e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen            throw new IllegalArgumentException();
967e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen        } else {
977e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen            removePreference(screen, pref);
987e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen        }
997e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    }
1007e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen
10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static boolean setCameraPictureSize(
10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            String candidate, List<Size> supported, Parameters parameters) {
10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int index = candidate.indexOf('x');
10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (index == NOT_FOUND) return false;
10532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int width = Integer.parseInt(candidate.substring(0, index));
10632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int height = Integer.parseInt(candidate.substring(index + 1));
10732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (Size size: supported) {
10832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (size.width == width && size.height == height) {
10932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                parameters.setPictureSize(width, height);
11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return true;
11132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        return false;
11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
11532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
11678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private void initPreference(PreferenceScreen screen) {
11778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ListPreference videoDuration =
11878f160ee416ba27ba55954950473e17ba9d20052Owen Lin                (ListPreference) screen.findPreference(KEY_VIDEO_DURATION);
11978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ListPreference pictureSize =
12078f160ee416ba27ba55954950473e17ba9d20052Owen Lin                (ListPreference) screen.findPreference(KEY_PICTURE_SIZE);
12178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ListPreference whiteBalance =
12278f160ee416ba27ba55954950473e17ba9d20052Owen Lin                (ListPreference) screen.findPreference(KEY_WHITE_BALANCE);
12378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ListPreference colorEffect =
12478f160ee416ba27ba55954950473e17ba9d20052Owen Lin                (ListPreference) screen.findPreference(KEY_COLOR_EFFECT);
12578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ListPreference sceneMode =
12678f160ee416ba27ba55954950473e17ba9d20052Owen Lin                (ListPreference) screen.findPreference(KEY_SCENE_MODE);
127b6ad206f53981faee04800b787569dbb60492844Owen Lin        ListPreference flashMode =
128b6ad206f53981faee04800b787569dbb60492844Owen Lin                (ListPreference) screen.findPreference(KEY_FLASH_MODE);
129df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        ListPreference focusMode =
130df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin                (ListPreference) screen.findPreference(KEY_FOCUS_MODE);
13178f160ee416ba27ba55954950473e17ba9d20052Owen Lin
13278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Since the screen could be loaded from different resources, we need
13378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // to check if the preference is available here
13478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (videoDuration != null) {
13578f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // Modify video duration settings.
13678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // The first entry is for MMS video duration, and we need to fill
13778f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // in the device-dependent value (in seconds).
13878f160ee416ba27ba55954950473e17ba9d20052Owen Lin            CharSequence[] entries = videoDuration.getEntries();
13978f160ee416ba27ba55954950473e17ba9d20052Owen Lin            entries[0] = String.format(
14078f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    entries[0].toString(), MMS_VIDEO_DURATION);
1414305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li        }
1424305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
14378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Filter out unsupported settings / options
14478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pictureSize != null) {
14578f160ee416ba27ba55954950473e17ba9d20052Owen Lin            filterUnsupportedOptions(screen, pictureSize, sizeListToStringList(
14678f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    mParameters.getSupportedPictureSizes()));
1473f3c857e3f34650c15d764810335024654b0fcc3Owen Lin        }
14878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (whiteBalance != null) {
14978f160ee416ba27ba55954950473e17ba9d20052Owen Lin            filterUnsupportedOptions(screen,
15078f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    whiteBalance, mParameters.getSupportedWhiteBalance());
1510f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (colorEffect != null) {
15378f160ee416ba27ba55954950473e17ba9d20052Owen Lin            filterUnsupportedOptions(screen,
15478f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    colorEffect, mParameters.getSupportedColorEffects());
15578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        }
15678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (sceneMode != null) {
15778f160ee416ba27ba55954950473e17ba9d20052Owen Lin            filterUnsupportedOptions(screen,
15878f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    sceneMode, mParameters.getSupportedSceneModes());
1590f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
160b6ad206f53981faee04800b787569dbb60492844Owen Lin        if (flashMode != null) {
161b6ad206f53981faee04800b787569dbb60492844Owen Lin            filterUnsupportedOptions(screen,
162b6ad206f53981faee04800b787569dbb60492844Owen Lin                    flashMode, mParameters.getSupportedFlashModes());
163b6ad206f53981faee04800b787569dbb60492844Owen Lin        }
164df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (focusMode != null) {
165df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin            filterUnsupportedOptions(screen,
166df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin                    focusMode, mParameters.getSupportedFocusModes());
167df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        }
168b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
169b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
1707e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    private static boolean removePreference(PreferenceGroup group,
1717e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen            Preference remove) {
1725945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        if (group.removePreference(remove)) return true;
1735945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
1745945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        for (int i = 0; i < group.getPreferenceCount(); i++) {
1755945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            final Preference child = group.getPreference(i);
1765945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            if (child instanceof PreferenceGroup) {
177522e836abc90bcb2d4e7a4ac37e269154d06c715Chih-Chung Chang                if (removePreference((PreferenceGroup) child, remove)) {
1785945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                    return true;
1795945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                }
1805945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            }
1815945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        }
1825945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        return false;
1835945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    }
1845945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
18578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private void filterUnsupportedOptions(PreferenceScreen screen,
18678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            ListPreference pref, List<String> supported) {
18778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
188df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        CharSequence[] allEntries = pref.getEntries();
189df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin
190df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // Remove the preference if the parameter is not supported or there is
191df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // only one options for the settings.
192df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (supported == null || allEntries.length <= 1) {
19378f160ee416ba27ba55954950473e17ba9d20052Owen Lin            removePreference(screen, pref);
1949dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li            return;
1959dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li        }
1969dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li
1975945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        CharSequence[] allEntryValues = pref.getEntryValues();
1982f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        Drawable[] allIcons = (pref instanceof IconListPreference)
1992f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin                ? ((IconListPreference) pref).getIcons()
2002f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin                : null;
2012ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
2022ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>();
2032f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        ArrayList<Drawable> icons =
2042f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin                allIcons == null ? null : new ArrayList<Drawable>();
2052ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        for (int i = 0, len = allEntryValues.length; i < len; i++) {
20678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) {
2072ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li                entries.add(allEntries[i]);
2082ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li                entryValues.add(allEntryValues[i]);
2092f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin                if (allIcons != null) icons.add(allIcons[i]);
21087341536812081826656040ac81f8f386c6c1407Wu-cheng Li            }
21187341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
21287341536812081826656040ac81f8f386c6c1407Wu-cheng Li
2132ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set entries and entry values to list preference.
2142f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        int size = entries.size();
2152f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        pref.setEntries(entries.toArray(new CharSequence[size]));
2162f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        pref.setEntryValues(entryValues.toArray(new CharSequence[size]));
2172f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        if (allIcons != null) {
2182f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin            ((IconListPreference) pref)
2192f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin                    .setIcons(icons.toArray(new Drawable[size]));
2202f3774c974a5a044a3b32ca68182a3f2180d0124Cheng-Ru Lin        }
22187341536812081826656040ac81f8f386c6c1407Wu-cheng Li
2222ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set the value to the first entry if it is invalid.
2232ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        String value = pref.getValue();
22478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pref.findIndexOfValue(value) == NOT_FOUND) {
2252ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            pref.setValueIndex(0);
22687341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
22787341536812081826656040ac81f8f386c6c1407Wu-cheng Li    }
22887341536812081826656040ac81f8f386c6c1407Wu-cheng Li
22978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static List<String> sizeListToStringList(List<Size> sizes) {
23078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ArrayList<String> list = new ArrayList<String>();
23178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        for (Size size : sizes) {
23278f160ee416ba27ba55954950473e17ba9d20052Owen Lin            list.add(String.format("%dx%d", size.width, size.height));
233c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen        }
23478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return list;
235b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
2366f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
2376f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    public static void upgradePreferences(SharedPreferences pref) {
2386f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        int version;
2396f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        try {
2406f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = pref.getInt(KEY_VERSION, 0);
2416f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        } catch (Exception ex) {
2426f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = 0;
2436f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
244a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        if (version == CURRENT_VERSION) return;
2456f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
246a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        SharedPreferences.Editor editor = pref.edit();
2476f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        if (version == 0) {
2486f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            // For old version, change 1 to -1 for video duration preference.
2496f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            if (pref.getString(KEY_VIDEO_DURATION, "1").equals("1")) {
2506f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang                editor.putString(KEY_VIDEO_DURATION, "-1");
2516f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            }
2526f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
253a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.putInt(KEY_VERSION, CURRENT_VERSION);
254a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.commit();
2556f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    }
256b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
257