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;
237add00693c1ec910bc8700fe046ee18cbe4e1148Wu-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";
42f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra    public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key";
439dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
44e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
450f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
465945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
47da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li    public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_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";
5171e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li    public static final String KEY_VIDEO_EFFECT = "pref_video_effect_key";
527add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public static final String KEY_CAMERA_ID = "pref_camera_id_key";
53d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang    public static final String KEY_CAMERA_FIRST_USE_HINT_SHOWN = "pref_camera_first_use_hint_shown_key";
54d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang    public static final String KEY_VIDEO_FIRST_USE_HINT_SHOWN = "pref_video_first_use_hint_shown_key";
558791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin
56f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin    public static final String EXPOSURE_DEFAULT_VALUE = "0";
57f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin
5805999715cc38365aa4751a2a355eb1af284573abAngus Kong    public static final int CURRENT_VERSION = 5;
59cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong    public static final int CURRENT_LOCAL_VERSION = 2;
60b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
6105999715cc38365aa4751a2a355eb1af284573abAngus Kong    public static final int DEFAULT_VIDEO_DURATION = 0; // no limit
62b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
6378f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final String TAG = "CameraSettings";
6478f160ee416ba27ba55954950473e17ba9d20052Owen Lin
6578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Context mContext;
6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Parameters mParameters;
677add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private final CameraInfo[] mCameraInfo;
68c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li    private final int mCameraId;
6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin
707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public CameraSettings(Activity activity, Parameters parameters,
71c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li                          int cameraId, CameraInfo[] cameraInfo) {
7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mContext = activity;
7378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mParameters = parameters;
74c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        mCameraId = cameraId;
757add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        mCameraInfo = cameraInfo;
7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
7778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
7873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    public PreferenceGroup getPreferenceGroup(int preferenceRes) {
7973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceInflater inflater = new PreferenceInflater(mContext);
8073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceGroup group =
8173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                (PreferenceGroup) inflater.inflate(preferenceRes);
8273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        initPreference(group);
8373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        return group;
8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
8578f160ee416ba27ba55954950473e17ba9d20052Owen Lin
86926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala    public static String getDefaultVideoQuality(int cameraId,
87926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala            String defaultQuality) {
88cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        int quality = Integer.valueOf(defaultQuality);
89926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala        if (CamcorderProfile.hasProfile(cameraId, quality)) {
9005999715cc38365aa4751a2a355eb1af284573abAngus Kong            return defaultQuality;
9105999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
9205999715cc38365aa4751a2a355eb1af284573abAngus Kong        return Integer.toString(CamcorderProfile.QUALITY_HIGH);
9305999715cc38365aa4751a2a355eb1af284573abAngus Kong    }
9405999715cc38365aa4751a2a355eb1af284573abAngus Kong
9532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static void initialCameraPictureSize(
9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            Context context, Parameters parameters) {
9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // When launching the camera app first time, we will set the picture
9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // size to the first one in the list defined in "arrays.xml" and is also
9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // supported by the driver.
10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        List<Size> supported = parameters.getSupportedPictureSizes();
10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (supported == null) return;
10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (String candidate : context.getResources().getStringArray(
10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                R.array.pref_camera_picturesize_entryvalues)) {
10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (setCameraPictureSize(candidate, supported, parameters)) {
1051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                SharedPreferences.Editor editor = ComboPreferences
1061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                        .get(context).edit();
10732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.putString(KEY_PICTURE_SIZE, candidate);
1084714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li                editor.apply();
10932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return;
11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
11132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
1124ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin        Log.e(TAG, "No supported picture size found");
11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
1157e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    public static void removePreferenceFromScreen(
11673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            PreferenceGroup group, String key) {
11773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        removePreference(group, key);
1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    }
1197e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen
12032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static boolean setCameraPictureSize(
12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            String candidate, List<Size> supported, Parameters parameters) {
12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int index = candidate.indexOf('x');
12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (index == NOT_FOUND) return false;
12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int width = Integer.parseInt(candidate.substring(0, index));
12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int height = Integer.parseInt(candidate.substring(index + 1));
12605999715cc38365aa4751a2a355eb1af284573abAngus Kong        for (Size size : supported) {
12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (size.width == width && size.height == height) {
12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                parameters.setPictureSize(width, height);
12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return true;
13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        return false;
13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
13573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void initPreference(PreferenceGroup group) {
136469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
137b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li        ListPreference timeLapseInterval = group.findPreference(KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL);
13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE);
13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference whiteBalance =  group.findPreference(KEY_WHITE_BALANCE);
14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE);
14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference flashMode = group.findPreference(KEY_FLASH_MODE);
14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE);
14333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        ListPreference exposure = group.findPreference(KEY_EXPOSURE);
144c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        IconListPreference cameraIdPref =
14505999715cc38365aa4751a2a355eb1af284573abAngus Kong                (IconListPreference) group.findPreference(KEY_CAMERA_ID);
1466988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        ListPreference videoFlashMode =
1476988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
14871e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li        ListPreference videoEffect = group.findPreference(KEY_VIDEO_EFFECT);
14978f160ee416ba27ba55954950473e17ba9d20052Owen Lin
15078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Since the screen could be loaded from different resources, we need
15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // to check if the preference is available here
152469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (videoQuality != null) {
15305999715cc38365aa4751a2a355eb1af284573abAngus Kong            filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality());
1544305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li        }
1554305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
15678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pictureSize != null) {
15773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group, pictureSize, sizeListToStringList(
15878f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    mParameters.getSupportedPictureSizes()));
1593f3c857e3f34650c15d764810335024654b0fcc3Owen Lin        }
16078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (whiteBalance != null) {
16173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
16278f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    whiteBalance, mParameters.getSupportedWhiteBalance());
1630f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
16478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (sceneMode != null) {
16573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
16678f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    sceneMode, mParameters.getSupportedSceneModes());
1670f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
168b6ad206f53981faee04800b787569dbb60492844Owen Lin        if (flashMode != null) {
16973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
170b6ad206f53981faee04800b787569dbb60492844Owen Lin                    flashMode, mParameters.getSupportedFlashModes());
171b6ad206f53981faee04800b787569dbb60492844Owen Lin        }
172df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (focusMode != null) {
173f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li            if (mParameters.getMaxNumFocusAreas() == 0) {
174f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                filterUnsupportedOptions(group,
175f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                        focusMode, mParameters.getSupportedFocusModes());
176f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li            } else {
177f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                // Remove the focus mode if we can use tap-to-focus.
178f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                removePreference(group, focusMode.getKey());
179f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li            }
1806988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        }
1816988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        if (videoFlashMode != null) {
1826988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin            filterUnsupportedOptions(group,
1836988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                    videoFlashMode, mParameters.getSupportedFlashModes());
184df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        }
1857add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (exposure != null) buildExposureCompensation(group, exposure);
186c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        if (cameraIdPref != null) buildCameraId(group, cameraIdPref);
187b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li
188b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li        if (timeLapseInterval != null) resetIfInvalid(timeLapseInterval);
1899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (videoEffect != null) {
1909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            initVideoEffect(group, videoEffect);
1919efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            resetIfInvalid(videoEffect);
1929efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
19333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    }
19433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
19533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    private void buildExposureCompensation(
19633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            PreferenceGroup group, ListPreference exposure) {
19733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int max = mParameters.getMaxExposureCompensation();
19833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int min = mParameters.getMinExposureCompensation();
19933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        if (max == 0 && min == 0) {
20033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            removePreference(group, exposure.getKey());
20133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            return;
20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        float step = mParameters.getExposureCompensationStep();
20433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
20533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        // show only integer values for exposure compensation
20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int maxValue = (int) Math.floor(max * step);
20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int minValue = (int) Math.ceil(min * step);
20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        for (int i = minValue; i <= maxValue; ++i) {
21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entryValues[maxValue - i] = Integer.toString(Math.round(i / step));
21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            StringBuilder builder = new StringBuilder();
21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            if (i > 0) builder.append('+');
21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entries[maxValue - i] = builder.append(i).toString();
21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntries(entries);
21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntryValues(entryValues);
218b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
219b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
2207add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private void buildCameraId(
22159ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang            PreferenceGroup group, IconListPreference preference) {
2227add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        int numOfCameras = mCameraInfo.length;
2237add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (numOfCameras < 2) {
22459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang            removePreference(group, preference.getKey());
2257add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            return;
2267add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
2277add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li
2283ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong        CharSequence[] entryValues = new CharSequence[numOfCameras];
2293ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong        for (int i = 0; i < numOfCameras; ++i) {
2303ae6814e3017ea25a57a0f885579022c4faf4e84Angus Kong            entryValues[i] = "" + i;
2317add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
23259ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang        preference.setEntryValues(entryValues);
23359ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang    }
23459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang
23573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private static boolean removePreference(PreferenceGroup group, String key) {
23673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        for (int i = 0, n = group.size(); i < n; i++) {
23773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            CameraPreference child = group.get(i);
2385945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            if (child instanceof PreferenceGroup) {
23973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                if (removePreference((PreferenceGroup) child, key)) {
2405945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                    return true;
2415945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                }
2425945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            }
24373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            if (child instanceof ListPreference &&
24473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                    ((ListPreference) child).getKey().equals(key)) {
24573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                group.removePreference(i);
24673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                return true;
24773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            }
2485945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        }
2495945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        return false;
2505945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    }
2515945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
25273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void filterUnsupportedOptions(PreferenceGroup group,
25378f160ee416ba27ba55954950473e17ba9d20052Owen Lin            ListPreference pref, List<String> supported) {
25478f160ee416ba27ba55954950473e17ba9d20052Owen Lin
255df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // Remove the preference if the parameter is not supported or there is
256df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // only one options for the settings.
25722a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin        if (supported == null || supported.size() <= 1) {
25873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            removePreference(group, pref.getKey());
2599dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li            return;
2609dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li        }
2619dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li
2621e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin        pref.filterUnsupported(supported);
26322216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        if (pref.getEntries().length <= 1) {
26422216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            removePreference(group, pref.getKey());
26522216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            return;
26622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        }
26787341536812081826656040ac81f8f386c6c1407Wu-cheng Li
268b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li        resetIfInvalid(pref);
269b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li    }
270b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li
271b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li    private void resetIfInvalid(ListPreference pref) {
2722ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set the value to the first entry if it is invalid.
2732ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        String value = pref.getValue();
27478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pref.findIndexOfValue(value) == NOT_FOUND) {
2752ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            pref.setValueIndex(0);
27687341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
27787341536812081826656040ac81f8f386c6c1407Wu-cheng Li    }
27887341536812081826656040ac81f8f386c6c1407Wu-cheng Li
27978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static List<String> sizeListToStringList(List<Size> sizes) {
28078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ArrayList<String> list = new ArrayList<String>();
28178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        for (Size size : sizes) {
28278f160ee416ba27ba55954950473e17ba9d20052Owen Lin            list.add(String.format("%dx%d", size.width, size.height));
283c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen        }
28478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return list;
285b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
2866f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
2871ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeLocalPreferences(SharedPreferences pref) {
2881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        int version;
2891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        try {
2901ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = pref.getInt(KEY_LOCAL_VERSION, 0);
2911ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        } catch (Exception ex) {
2921ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = 0;
2931ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        }
2941ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        if (version == CURRENT_LOCAL_VERSION) return;
295cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong
2961ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        SharedPreferences.Editor editor = pref.edit();
297cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        if (version == 1) {
298cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            // We use numbers to represent the quality now. The quality definition is identical to
299cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            // that of CamcorderProfile.java.
300cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            editor.remove("pref_video_quality_key");
301cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        }
3021ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION);
3034714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeGlobalPreferences(SharedPreferences pref) {
3076f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        int version;
3086f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        try {
3096f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = pref.getInt(KEY_VERSION, 0);
3106f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        } catch (Exception ex) {
3116f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = 0;
3126f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
313a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        if (version == CURRENT_VERSION) return;
3146f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
315a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        SharedPreferences.Editor editor = pref.edit();
3166f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        if (version == 0) {
317469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // We won't use the preference which change in version 1.
318469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // So, just upgrade to version 1 directly
319faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 1;
320faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        }
321faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        if (version == 1) {
322faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            // Change jpeg quality {65,75,85} to {normal,fine,superfine}
323faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            String quality = pref.getString(KEY_JPEG_QUALITY, "85");
324faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            if (quality.equals("65")) {
325faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "normal";
326faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else if (quality.equals("75")) {
327faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "fine";
328faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else {
329faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "superfine";
330faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            }
331faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            editor.putString(KEY_JPEG_QUALITY, quality);
332faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 2;
3336f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
3343e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        if (version == 2) {
3353e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            editor.putString(KEY_RECORD_LOCATION,
3363e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    pref.getBoolean(KEY_RECORD_LOCATION, false)
3373e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    ? RecordLocationPreference.VALUE_ON
3383e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    : RecordLocationPreference.VALUE_NONE);
3393e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            version = 3;
3403e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        }
341469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (version == 3) {
342469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // Just use video quality to replace it and
343469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // ignore the current settings.
344469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_videoquality_key");
345469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_video_duration_key");
346469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
34705999715cc38365aa4751a2a355eb1af284573abAngus Kong
348a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.putInt(KEY_VERSION, CURRENT_VERSION);
3494714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3506f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    }
351469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
3521ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static int readPreferredCameraId(SharedPreferences pref) {
3532b4b2a4b2ec489f93b2a98d5c90d972c50a38c7dWu-cheng Li        return Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0"));
354ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
355ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
3561ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void writePreferredCameraId(SharedPreferences pref,
3571ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            int cameraId) {
3581ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        Editor editor = pref.edit();
3597add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
3604714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
361ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
362003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
363b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang    public static int readExposure(ComboPreferences preferences) {
364b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        String exposure = preferences.getString(
365b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang                CameraSettings.KEY_EXPOSURE,
366b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang                EXPOSURE_DEFAULT_VALUE);
367b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        try {
368b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang            return Integer.parseInt(exposure);
369b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        } catch (Exception ex) {
370b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang            Log.e(TAG, "Invalid exposure: " + exposure);
371b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        }
372b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        return 0;
373b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang    }
374003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
3759efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    public static int readEffectType(SharedPreferences pref) {
3769efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none");
3779efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.equals("none")) {
3789efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_NONE;
3799efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("goofy_face")) {
3809efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_GOOFY_FACE;
3819efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("backdropper")) {
3829efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_BACKDROPPER;
3839efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
3849efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        Log.e(TAG, "Invalid effect selection: " + effectSelection);
3859efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        return EffectsRecorder.EFFECT_NONE;
3869efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
3879efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
3889efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    public static Object readEffectParameter(SharedPreferences pref) {
3899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none");
3909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.equals("none")) {
3919efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return null;
3929efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
3939efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        int separatorIndex = effectSelection.indexOf('/');
3949efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectParameter =
3959efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                effectSelection.substring(separatorIndex + 1);
3969efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.startsWith("goofy_face")) {
3979efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (effectParameter.equals("squeeze")) {
3989efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SQUEEZE;
3999efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_eyes")) {
4009efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_EYES;
4019efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_mouth")) {
4029efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_MOUTH;
4039efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("small_mouth")) {
4049efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SMALL_MOUTH;
4059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_nose")) {
4069efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_NOSE;
4079efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("small_eyes")) {
4089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SMALL_EYES;
4099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            }
4109efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("backdropper")) {
4119efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            // Parameter is a string that either encodes the URI to use,
4129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            // or specifies 'gallery'.
4139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return effectParameter;
4149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
4159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        Log.e(TAG, "Invalid effect selection: " + effectSelection);
4179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        return null;
4189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
4199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
421003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    public static void restorePreferences(Context context,
422003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            ComboPreferences preferences, Parameters parameters) {
423003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int currentCameraId = readPreferredCameraId(preferences);
424003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
425003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // Clear the preferences of both cameras.
426003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int backCameraId = CameraHolder.instance().getBackCameraId();
427003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        if (backCameraId != -1) {
428003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            preferences.setLocalId(context, backCameraId);
429003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            Editor editor = preferences.edit();
430003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.clear();
431003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.apply();
432003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        }
433003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int frontCameraId = CameraHolder.instance().getFrontCameraId();
434003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        if (frontCameraId != -1) {
435003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            preferences.setLocalId(context, frontCameraId);
436003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            Editor editor = preferences.edit();
437003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.clear();
438003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.apply();
439003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        }
440003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
4414a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        // Switch back to the preferences of the current camera. Otherwise,
4424a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        // we may write the preference to wrong camera later.
4434a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        preferences.setLocalId(context, currentCameraId);
4444a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li
445003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        upgradeGlobalPreferences(preferences.getGlobal());
446003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        upgradeLocalPreferences(preferences.getLocal());
447003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
448003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // Write back the current camera id because parameters are related to
449003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // the camera. Otherwise, we may switch to the front camera but the
450003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // initial picture size is that of the back camera.
451003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        initialCameraPictureSize(context, parameters);
452003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        writePreferredCameraId(preferences, currentCameraId);
453003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    }
45410208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li
45505999715cc38365aa4751a2a355eb1af284573abAngus Kong    private ArrayList<String> getSupportedVideoQuality() {
45605999715cc38365aa4751a2a355eb1af284573abAngus Kong        ArrayList<String> supported = new ArrayList<String>();
45705999715cc38365aa4751a2a355eb1af284573abAngus Kong        // Check for supported quality
45805999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_1080P)) {
45905999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P));
46005999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
46105999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_720P)) {
46205999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_720P));
46310208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li        }
46405999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_480P)) {
46505999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_480P));
46605999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
46705999715cc38365aa4751a2a355eb1af284573abAngus Kong
46805999715cc38365aa4751a2a355eb1af284573abAngus Kong        return supported;
46910208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li    }
4709efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4719efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    private void initVideoEffect(PreferenceGroup group, ListPreference videoEffect) {
4729efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        CharSequence[] values = videoEffect.getEntryValues();
4739efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
47405999715cc38365aa4751a2a355eb1af284573abAngus Kong        boolean goofyFaceSupported =
47505999715cc38365aa4751a2a355eb1af284573abAngus Kong                EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_GOOFY_FACE);
4769efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        boolean backdropperSupported =
4779efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_BACKDROPPER) &&
4789efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                mParameters.isAutoExposureLockSupported() &&
4799efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                mParameters.isAutoWhiteBalanceLockSupported();
4809efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4819efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        ArrayList<String> supported = new ArrayList<String>();
4829efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        for (CharSequence value : values) {
4839efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            String effectSelection = value.toString();
4849efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (!goofyFaceSupported && effectSelection.startsWith("goofy_face")) continue;
4859efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (!backdropperSupported && effectSelection.startsWith("backdropper")) continue;
4869efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            supported.add(effectSelection);
4879efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
4889efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4899efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        filterUnsupportedOptions(group, videoEffect, supported);
4909efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
491b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
492