CameraSettings.java revision 22216b6cc942fc3a97b99d6bce4b1a86f19c08d4
177c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang/*
277c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Copyright (C) 2009 The Android Open Source Project
377c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang *
477c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
577c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * you may not use this file except in compliance with the License.
677c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * You may obtain a copy of the License at
777c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang *
877c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
977c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang *
1077c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * Unless required by applicable law or agreed to in writing, software
1177c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
1277c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * See the License for the specific language governing permissions and
1477c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang * limitations under the License.
1577c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang */
1677c1cdc8f2cda250b1db842204efb49f87e094aeChih-Chung Chang
17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera;
18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
1978f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.app.Activity;
2078f160ee416ba27ba55954950473e17ba9d20052Owen Linimport android.content.Context;
21b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.SharedPreferences;
221ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Changimport android.content.SharedPreferences.Editor;
238eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Liimport android.hardware.Camera.CameraInfo;
2487341536812081826656040ac81f8f386c6c1407Wu-cheng Liimport android.hardware.Camera.Parameters;
254305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.hardware.Camera.Size;
2633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Linimport android.media.CamcorderProfile;
277e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chenimport android.util.Log;
28d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen
29d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList;
304305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List;
3187341536812081826656040ac81f8f386c6c1407Wu-cheng Li
32271b3095b9f763421c0547109da9de774795072dChih-Chung Chang/**
33271b3095b9f763421c0547109da9de774795072dChih-Chung Chang *  Provides utilities and keys for Camera settings.
34271b3095b9f763421c0547109da9de774795072dChih-Chung Chang */
3578f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings {
3678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final int NOT_FOUND = -1;
3778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
3878f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_VERSION = "pref_version_key";
391ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static final String KEY_LOCAL_VERSION = "pref_local_version_key";
4033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_RECORD_LOCATION = RecordLocationPreference.KEY;
41469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final String KEY_VIDEO_QUALITY = "pref_video_quality_key";
429dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
43e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
440f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
455945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
46da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li    public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key";
4778f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
4833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key";
498d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin    public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
5033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_EXPOSURE = "pref_camera_exposure_key";
518eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li    public static final String KEY_CAMERA_ID = "pref_camera_id_key";
528791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin
53469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_HIGH = "high";
54469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_MMS = "mms";
55469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_YOUTUBE = "youtube";
566f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
57f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin    public static final String EXPOSURE_DEFAULT_VALUE = "0";
58f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin
59469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final int CURRENT_VERSION = 4;
601ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static final int CURRENT_LOCAL_VERSION = 1;
61b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
62469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    // max video duration in seconds for mms and youtube.
633a4ef93f95bed9f812fe75ef94296450833b3997James Dong    private static final int MMS_VIDEO_DURATION = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW).duration;
64469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final int YOUTUBE_VIDEO_DURATION = 10 * 60; // 10 mins
65469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final int DEFAULT_VIDEO_DURATION = 30 * 60; // 10 mins
66469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
67469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final String DEFAULT_VIDEO_QUALITY_VALUE = "high";
68b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    // MMS video length
7078f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final int DEFAULT_VIDEO_DURATION_VALUE = -1;
714305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
7271d56e21859a797ec4633f209b3605276345d44eOwen Lin    @SuppressWarnings("unused")
7378f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final String TAG = "CameraSettings";
7478f160ee416ba27ba55954950473e17ba9d20052Owen Lin
7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Context mContext;
7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Parameters mParameters;
778eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li    private final CameraInfo[] mCameraInfo;
7878f160ee416ba27ba55954950473e17ba9d20052Owen Lin
798eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li    public CameraSettings(Activity activity, Parameters parameters,
808eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                          CameraInfo[] cameraInfo) {
8178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mContext = activity;
8278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mParameters = parameters;
838eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        mCameraInfo = cameraInfo;
8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
8578f160ee416ba27ba55954950473e17ba9d20052Owen Lin
8673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    public PreferenceGroup getPreferenceGroup(int preferenceRes) {
8773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceInflater inflater = new PreferenceInflater(mContext);
8873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceGroup group =
8973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                (PreferenceGroup) inflater.inflate(preferenceRes);
9073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        initPreference(group);
9173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        return group;
9278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
9378f160ee416ba27ba55954950473e17ba9d20052Owen Lin
9432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static void initialCameraPictureSize(
9532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            Context context, Parameters parameters) {
9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // When launching the camera app first time, we will set the picture
9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // size to the first one in the list defined in "arrays.xml" and is also
9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // supported by the driver.
9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        List<Size> supported = parameters.getSupportedPictureSizes();
10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (supported == null) return;
10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (String candidate : context.getResources().getStringArray(
10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                R.array.pref_camera_picturesize_entryvalues)) {
10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (setCameraPictureSize(candidate, supported, parameters)) {
1041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                SharedPreferences.Editor editor = ComboPreferences
1051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                        .get(context).edit();
10632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.putString(KEY_PICTURE_SIZE, candidate);
1074714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li                editor.apply();
10832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return;
10932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
1114ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin        Log.e(TAG, "No supported picture size found");
11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
1147e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    public static void removePreferenceFromScreen(
11573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            PreferenceGroup group, String key) {
11673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        removePreference(group, key);
1177e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    }
1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen
11932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static boolean setCameraPictureSize(
12032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            String candidate, List<Size> supported, Parameters parameters) {
12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int index = candidate.indexOf('x');
12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (index == NOT_FOUND) return false;
12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int width = Integer.parseInt(candidate.substring(0, index));
12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int height = Integer.parseInt(candidate.substring(index + 1));
12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (Size size: supported) {
12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (size.width == width && size.height == height) {
12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                parameters.setPictureSize(width, height);
12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return true;
12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        return false;
13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
13473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void initPreference(PreferenceGroup group) {
135469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
13673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE);
13773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference whiteBalance =  group.findPreference(KEY_WHITE_BALANCE);
13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT);
13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE);
14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference flashMode = group.findPreference(KEY_FLASH_MODE);
14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE);
14233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        ListPreference exposure = group.findPreference(KEY_EXPOSURE);
1438eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        IconListPreference cameraId =
1448eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                (IconListPreference)group.findPreference(KEY_CAMERA_ID);
1456988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        ListPreference videoFlashMode =
1466988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
14778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
14878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Since the screen could be loaded from different resources, we need
14978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // to check if the preference is available here
150469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (videoQuality != null) {
15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // Modify video duration settings.
15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // The first entry is for MMS video duration, and we need to fill
15378f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // in the device-dependent value (in seconds).
154469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            CharSequence[] entries = videoQuality.getEntries();
155469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            CharSequence[] values = videoQuality.getEntryValues();
156469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            for (int i = 0; i < entries.length; ++i) {
157469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                if (VIDEO_QUALITY_MMS.equals(values[i])) {
158469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                    entries[i] = entries[i].toString().replace(
159469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                            "30", Integer.toString(MMS_VIDEO_DURATION));
160469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                    break;
161469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                }
162469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            }
1634305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li        }
1644305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
16578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Filter out unsupported settings / options
16678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pictureSize != null) {
16773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group, pictureSize, sizeListToStringList(
16878f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    mParameters.getSupportedPictureSizes()));
1693f3c857e3f34650c15d764810335024654b0fcc3Owen Lin        }
17078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (whiteBalance != null) {
17173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
17278f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    whiteBalance, mParameters.getSupportedWhiteBalance());
1730f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
17478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (colorEffect != null) {
17573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
17678f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    colorEffect, mParameters.getSupportedColorEffects());
17778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        }
17878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (sceneMode != null) {
17973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
18078f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    sceneMode, mParameters.getSupportedSceneModes());
1810f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
182b6ad206f53981faee04800b787569dbb60492844Owen Lin        if (flashMode != null) {
18373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
184b6ad206f53981faee04800b787569dbb60492844Owen Lin                    flashMode, mParameters.getSupportedFlashModes());
185b6ad206f53981faee04800b787569dbb60492844Owen Lin        }
186df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (focusMode != null) {
18773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
188df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin                    focusMode, mParameters.getSupportedFocusModes());
1896988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        }
1906988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        if (videoFlashMode != null) {
1916988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin            filterUnsupportedOptions(group,
1926988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                    videoFlashMode, mParameters.getSupportedFlashModes());
193df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        }
1948eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        if (exposure != null) buildExposureCompensation(group, exposure);
1958eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        if (cameraId != null) buildCameraId(group, cameraId);
19633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    }
19733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
19833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    private void buildExposureCompensation(
19933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            PreferenceGroup group, ListPreference exposure) {
20033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int max = mParameters.getMaxExposureCompensation();
20133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int min = mParameters.getMinExposureCompensation();
20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        if (max == 0 && min == 0) {
20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            removePreference(group, exposure.getKey());
20433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            return;
20533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        float step = mParameters.getExposureCompensationStep();
20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        // show only integer values for exposure compensation
20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int maxValue = (int) Math.floor(max * step);
21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int minValue = (int) Math.ceil(min * step);
21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        for (int i = minValue; i <= maxValue; ++i) {
21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entryValues[maxValue - i] = Integer.toString(Math.round(i / step));
21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            StringBuilder builder = new StringBuilder();
21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            if (i > 0) builder.append('+');
21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entries[maxValue - i] = builder.append(i).toString();
21833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
21933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntries(entries);
22033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntryValues(entryValues);
221b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
222b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
2238eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li    private void buildCameraId(
2248eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            PreferenceGroup group, IconListPreference cameraId) {
2258eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        int numOfCameras = mCameraInfo.length;
2268eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        if (numOfCameras < 2) {
2278eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            removePreference(group, cameraId.getKey());
2288eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            return;
2298eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        }
2308eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li
2318eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        CharSequence entries[] = new CharSequence[numOfCameras];
2328eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        CharSequence entryValues[] = new CharSequence[numOfCameras];
2338eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        int[] iconIds = new int[numOfCameras];
2348eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        int[] largeIconIds = new int[numOfCameras];
2358eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        for (int i = 0; i < numOfCameras; i++) {
2368eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            entryValues[i] = Integer.toString(i);
237c97d23826a28dd725951eccb62651244f9fb8228Wu-cheng Li            if (mCameraInfo[i].facing == CameraInfo.CAMERA_FACING_FRONT) {
2388eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                entries[i] = mContext.getString(
2398eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                        R.string.pref_camera_id_entry_front);
2408eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                iconIds[i] = R.drawable.ic_menuselect_camera_facing_front;
2418eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_front;
2428eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            } else {
2438eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                entries[i] = mContext.getString(
2448eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                        R.string.pref_camera_id_entry_back);
2458eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                iconIds[i] = R.drawable.ic_menuselect_camera_facing_back;
2468eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_back;
2478eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li            }
2488eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        }
2498eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        cameraId.setEntries(entries);
2508eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        cameraId.setEntryValues(entryValues);
2518eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        cameraId.setIconIds(iconIds);
2528eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        cameraId.setLargeIconIds(largeIconIds);
2538eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li    }
2548eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li
25573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private static boolean removePreference(PreferenceGroup group, String key) {
25673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        for (int i = 0, n = group.size(); i < n; i++) {
25773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            CameraPreference child = group.get(i);
2585945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            if (child instanceof PreferenceGroup) {
25973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                if (removePreference((PreferenceGroup) child, key)) {
2605945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                    return true;
2615945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                }
2625945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            }
26373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            if (child instanceof ListPreference &&
26473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                    ((ListPreference) child).getKey().equals(key)) {
26573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                group.removePreference(i);
26673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                return true;
26773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            }
2685945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        }
2695945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        return false;
2705945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    }
2715945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
27273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void filterUnsupportedOptions(PreferenceGroup group,
27378f160ee416ba27ba55954950473e17ba9d20052Owen Lin            ListPreference pref, List<String> supported) {
27478f160ee416ba27ba55954950473e17ba9d20052Owen Lin
275df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        CharSequence[] allEntries = pref.getEntries();
276df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin
277df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // Remove the preference if the parameter is not supported or there is
278df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // only one options for the settings.
27922a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin        if (supported == null || supported.size() <= 1) {
28073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            removePreference(group, pref.getKey());
2819dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li            return;
2829dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li        }
2839dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li
2841e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin        pref.filterUnsupported(supported);
28522216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        if (pref.getEntries().length <= 1) {
28622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            removePreference(group, pref.getKey());
28722216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            return;
28822216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        }
28987341536812081826656040ac81f8f386c6c1407Wu-cheng Li
2902ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set the value to the first entry if it is invalid.
2912ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        String value = pref.getValue();
29278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pref.findIndexOfValue(value) == NOT_FOUND) {
2932ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            pref.setValueIndex(0);
29487341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
29587341536812081826656040ac81f8f386c6c1407Wu-cheng Li    }
29687341536812081826656040ac81f8f386c6c1407Wu-cheng Li
29778f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static List<String> sizeListToStringList(List<Size> sizes) {
29878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ArrayList<String> list = new ArrayList<String>();
29978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        for (Size size : sizes) {
30078f160ee416ba27ba55954950473e17ba9d20052Owen Lin            list.add(String.format("%dx%d", size.width, size.height));
301c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen        }
30278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return list;
303b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
3046f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeLocalPreferences(SharedPreferences pref) {
3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        int version;
3071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        try {
3081ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = pref.getInt(KEY_LOCAL_VERSION, 0);
3091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        } catch (Exception ex) {
3101ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = 0;
3111ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        }
3121ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        if (version == CURRENT_LOCAL_VERSION) return;
3131ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        SharedPreferences.Editor editor = pref.edit();
3141ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION);
3154714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3161ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3171ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
3181ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeGlobalPreferences(SharedPreferences pref) {
3196f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        int version;
3206f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        try {
3216f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = pref.getInt(KEY_VERSION, 0);
3226f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        } catch (Exception ex) {
3236f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = 0;
3246f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
325a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        if (version == CURRENT_VERSION) return;
3266f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
327a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        SharedPreferences.Editor editor = pref.edit();
3286f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        if (version == 0) {
329469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // We won't use the preference which change in version 1.
330469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // So, just upgrade to version 1 directly
331faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 1;
332faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        }
333faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        if (version == 1) {
334faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            // Change jpeg quality {65,75,85} to {normal,fine,superfine}
335faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            String quality = pref.getString(KEY_JPEG_QUALITY, "85");
336faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            if (quality.equals("65")) {
337faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "normal";
338faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else if (quality.equals("75")) {
339faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "fine";
340faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else {
341faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "superfine";
342faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            }
343faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            editor.putString(KEY_JPEG_QUALITY, quality);
344faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 2;
3456f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
3463e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        if (version == 2) {
3473e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            editor.putString(KEY_RECORD_LOCATION,
3483e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    pref.getBoolean(KEY_RECORD_LOCATION, false)
3493e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    ? RecordLocationPreference.VALUE_ON
3503e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    : RecordLocationPreference.VALUE_NONE);
3513e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            version = 3;
3523e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        }
353469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (version == 3) {
354469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // Just use video quality to replace it and
355469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // ignore the current settings.
356469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_videoquality_key");
357469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_video_duration_key");
358469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
359a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.putInt(KEY_VERSION, CURRENT_VERSION);
3604714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3616f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    }
362469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
3631ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeAllPreferences(ComboPreferences pref) {
3641ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        upgradeGlobalPreferences(pref.getGlobal());
3651ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        upgradeLocalPreferences(pref.getLocal());
3661ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3671ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
368469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static boolean getVideoQuality(String quality) {
369469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        return VIDEO_QUALITY_YOUTUBE.equals(
370469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                quality) || VIDEO_QUALITY_HIGH.equals(quality);
371469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    }
372469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
373469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static int getVidoeDurationInMillis(String quality) {
374469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (VIDEO_QUALITY_MMS.equals(quality)) {
375469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            return MMS_VIDEO_DURATION * 1000;
376469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        } else if (VIDEO_QUALITY_YOUTUBE.equals(quality)) {
377469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            return YOUTUBE_VIDEO_DURATION * 1000;
378469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
379469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        return DEFAULT_VIDEO_DURATION * 1000;
380469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    }
381ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
3821ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static int readPreferredCameraId(SharedPreferences pref) {
3838eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        String id = Integer.toString(android.hardware.Camera.CAMERA_ID_DEFAULT);
3848eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        return Integer.parseInt(pref.getString(KEY_CAMERA_ID, id));
385ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
386ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
3871ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void writePreferredCameraId(SharedPreferences pref,
3881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            int cameraId) {
3891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        Editor editor = pref.edit();
3908eaa6919f0d5c10c95c99f2f937d57ea5c4a5bbaWu-cheng Li        editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
3914714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
392ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
393b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
394