CameraSettings.java revision 8145371c52a62fbebbc20685bf0901ce50495e21
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;
274d226d16bb06861527e5ec162e39d9673e23df83akahuangimport android.util.FloatMath;
287e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chenimport android.util.Log;
29d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chen
305eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Changimport com.android.gallery3d.common.ApiHelper;
315eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang
32d4247bc43702d5ccda5dde40e948fffd6c4445eeRay Chenimport java.util.ArrayList;
334305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport java.util.List;
3487341536812081826656040ac81f8f386c6c1407Wu-cheng Li
35271b3095b9f763421c0547109da9de774795072dChih-Chung Chang/**
36271b3095b9f763421c0547109da9de774795072dChih-Chung Chang *  Provides utilities and keys for Camera settings.
37271b3095b9f763421c0547109da9de774795072dChih-Chung Chang */
3878f160ee416ba27ba55954950473e17ba9d20052Owen Linpublic class CameraSettings {
3978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final int NOT_FOUND = -1;
4078f160ee416ba27ba55954950473e17ba9d20052Owen Lin
4178f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_VERSION = "pref_version_key";
421ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static final String KEY_LOCAL_VERSION = "pref_local_version_key";
4333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_RECORD_LOCATION = RecordLocationPreference.KEY;
44469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final String KEY_VIDEO_QUALITY = "pref_video_quality_key";
45f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra    public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key";
469dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
47e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
480f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
495945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
50da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li    public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key";
5133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key";
528d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin    public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
5333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_EXPOSURE = "pref_camera_exposure_key";
5471e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li    public static final String KEY_VIDEO_EFFECT = "pref_video_effect_key";
557add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public static final String KEY_CAMERA_ID = "pref_camera_id_key";
56d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang    public static final String KEY_CAMERA_FIRST_USE_HINT_SHOWN = "pref_camera_first_use_hint_shown_key";
57d6e5029b2df45210834334f7c2e99dfc85e962f0Chih-yu Huang    public static final String KEY_VIDEO_FIRST_USE_HINT_SHOWN = "pref_video_first_use_hint_shown_key";
588791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin
59f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin    public static final String EXPOSURE_DEFAULT_VALUE = "0";
60f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin
6105999715cc38365aa4751a2a355eb1af284573abAngus Kong    public static final int CURRENT_VERSION = 5;
62cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong    public static final int CURRENT_LOCAL_VERSION = 2;
63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
6405999715cc38365aa4751a2a355eb1af284573abAngus Kong    public static final int DEFAULT_VIDEO_DURATION = 0; // no limit
65b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
6678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final String TAG = "CameraSettings";
6778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
6878f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Context mContext;
6978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Parameters mParameters;
707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private final CameraInfo[] mCameraInfo;
71c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li    private final int mCameraId;
7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin
737add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public CameraSettings(Activity activity, Parameters parameters,
74c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li                          int cameraId, CameraInfo[] cameraInfo) {
7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mContext = activity;
7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mParameters = parameters;
77c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        mCameraId = cameraId;
787add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        mCameraInfo = cameraInfo;
7978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
8078f160ee416ba27ba55954950473e17ba9d20052Owen Lin
8173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    public PreferenceGroup getPreferenceGroup(int preferenceRes) {
8273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceInflater inflater = new PreferenceInflater(mContext);
8373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceGroup group =
8473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                (PreferenceGroup) inflater.inflate(preferenceRes);
8573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        initPreference(group);
8673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        return group;
8778f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
8878f160ee416ba27ba55954950473e17ba9d20052Owen Lin
89926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala    public static String getDefaultVideoQuality(int cameraId,
90926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala            String defaultQuality) {
91cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        int quality = Integer.valueOf(defaultQuality);
92926405a84a882ab78f2f5aa1e88c4961640724f7Eino-Ville Talvala        if (CamcorderProfile.hasProfile(cameraId, quality)) {
9305999715cc38365aa4751a2a355eb1af284573abAngus Kong            return defaultQuality;
9405999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
9505999715cc38365aa4751a2a355eb1af284573abAngus Kong        return Integer.toString(CamcorderProfile.QUALITY_HIGH);
9605999715cc38365aa4751a2a355eb1af284573abAngus Kong    }
9705999715cc38365aa4751a2a355eb1af284573abAngus Kong
9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static void initialCameraPictureSize(
9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            Context context, Parameters parameters) {
10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // When launching the camera app first time, we will set the picture
10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // size to the first one in the list defined in "arrays.xml" and is also
10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // supported by the driver.
10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        List<Size> supported = parameters.getSupportedPictureSizes();
10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (supported == null) return;
10532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (String candidate : context.getResources().getStringArray(
10632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                R.array.pref_camera_picturesize_entryvalues)) {
10732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (setCameraPictureSize(candidate, supported, parameters)) {
1081ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                SharedPreferences.Editor editor = ComboPreferences
1091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                        .get(context).edit();
11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.putString(KEY_PICTURE_SIZE, candidate);
1114714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li                editor.apply();
11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return;
11332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
1154ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin        Log.e(TAG, "No supported picture size found");
11632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
11732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
1187e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    public static void removePreferenceFromScreen(
11973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            PreferenceGroup group, String key) {
12073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        removePreference(group, key);
1217e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    }
1227e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen
12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static boolean setCameraPictureSize(
12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            String candidate, List<Size> supported, Parameters parameters) {
12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int index = candidate.indexOf('x');
12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (index == NOT_FOUND) return false;
12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int width = Integer.parseInt(candidate.substring(0, index));
12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int height = Integer.parseInt(candidate.substring(index + 1));
12905999715cc38365aa4751a2a355eb1af284573abAngus Kong        for (Size size : supported) {
13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (size.width == width && size.height == height) {
13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                parameters.setPictureSize(width, height);
13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return true;
13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
13532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        return false;
13632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
13732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
13873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void initPreference(PreferenceGroup group) {
139469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
140b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li        ListPreference timeLapseInterval = group.findPreference(KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL);
14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE);
14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference whiteBalance =  group.findPreference(KEY_WHITE_BALANCE);
14373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE);
14473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference flashMode = group.findPreference(KEY_FLASH_MODE);
14573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE);
14633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        ListPreference exposure = group.findPreference(KEY_EXPOSURE);
147c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        IconListPreference cameraIdPref =
14805999715cc38365aa4751a2a355eb1af284573abAngus Kong                (IconListPreference) group.findPreference(KEY_CAMERA_ID);
1496988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        ListPreference videoFlashMode =
1506988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
15171e76dcebdbb3e5768fc948bed9c529a5787294eWu-cheng Li        ListPreference videoEffect = group.findPreference(KEY_VIDEO_EFFECT);
15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin
15378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Since the screen could be loaded from different resources, we need
15478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // to check if the preference is available here
155469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (videoQuality != null) {
15605999715cc38365aa4751a2a355eb1af284573abAngus Kong            filterUnsupportedOptions(group, videoQuality, getSupportedVideoQuality());
1574305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li        }
1584305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
15978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pictureSize != null) {
16073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group, pictureSize, sizeListToStringList(
16178f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    mParameters.getSupportedPictureSizes()));
1623f3c857e3f34650c15d764810335024654b0fcc3Owen Lin        }
16378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (whiteBalance != null) {
16473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
16578f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    whiteBalance, mParameters.getSupportedWhiteBalance());
1660f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
16778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (sceneMode != null) {
16873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
16978f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    sceneMode, mParameters.getSupportedSceneModes());
1700f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
171b6ad206f53981faee04800b787569dbb60492844Owen Lin        if (flashMode != null) {
17273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
173b6ad206f53981faee04800b787569dbb60492844Owen Lin                    flashMode, mParameters.getSupportedFlashModes());
174b6ad206f53981faee04800b787569dbb60492844Owen Lin        }
175df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (focusMode != null) {
176df90c922da29c6c4fa2de721e3cff19461c51715Ahbong Chang            if (!Util.isFocusAreaSupported(mParameters)) {
177f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                filterUnsupportedOptions(group,
178f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                        focusMode, mParameters.getSupportedFocusModes());
179f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li            } else {
180f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                // Remove the focus mode if we can use tap-to-focus.
181f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li                removePreference(group, focusMode.getKey());
182f5d28a1e17e011daf601d464ce4aa0b8d0ce2f22Wu-cheng Li            }
1836988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        }
1846988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        if (videoFlashMode != null) {
1856988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin            filterUnsupportedOptions(group,
1866988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                    videoFlashMode, mParameters.getSupportedFlashModes());
187df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        }
1887add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (exposure != null) buildExposureCompensation(group, exposure);
189c300a0266d634bb7a1e2df816e97bad2836991acWu-cheng Li        if (cameraIdPref != null) buildCameraId(group, cameraIdPref);
190b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li
1915eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang        if (timeLapseInterval != null) {
1925eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang            if (ApiHelper.HAS_TIME_LAPSE_RECORDING) {
1935eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang                resetIfInvalid(timeLapseInterval);
1945eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang            } else {
1955eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang                removePreference(group, timeLapseInterval.getKey());
1965eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang            }
1975eddabb2790173fd451dbfb49824c05e4fba0501Chih-Chung Chang        }
1989efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (videoEffect != null) {
1998145371c52a62fbebbc20685bf0901ce50495e21Pin Ting            if (ApiHelper.HAS_EFFECTS_RECORDING) {
2008145371c52a62fbebbc20685bf0901ce50495e21Pin Ting                initVideoEffect(group, videoEffect);
2018145371c52a62fbebbc20685bf0901ce50495e21Pin Ting                resetIfInvalid(videoEffect);
2028145371c52a62fbebbc20685bf0901ce50495e21Pin Ting            } else {
2038145371c52a62fbebbc20685bf0901ce50495e21Pin Ting                filterUnsupportedOptions(group, videoEffect, null);
2048145371c52a62fbebbc20685bf0901ce50495e21Pin Ting            }
2059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
20633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    }
20733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
20833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    private void buildExposureCompensation(
20933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            PreferenceGroup group, ListPreference exposure) {
21033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int max = mParameters.getMaxExposureCompensation();
21133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int min = mParameters.getMinExposureCompensation();
21233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        if (max == 0 && min == 0) {
21333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            removePreference(group, exposure.getKey());
21433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            return;
21533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
21633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        float step = mParameters.getExposureCompensationStep();
21733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
21833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        // show only integer values for exposure compensation
2194d226d16bb06861527e5ec162e39d9673e23df83akahuang        int maxValue = (int) FloatMath.floor(max * step);
2204d226d16bb06861527e5ec162e39d9673e23df83akahuang        int minValue = (int) FloatMath.ceil(min * step);
22133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
22233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
22333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        for (int i = minValue; i <= maxValue; ++i) {
22433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entryValues[maxValue - i] = Integer.toString(Math.round(i / step));
22533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            StringBuilder builder = new StringBuilder();
22633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            if (i > 0) builder.append('+');
22733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entries[maxValue - i] = builder.append(i).toString();
22833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
22933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntries(entries);
23033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntryValues(entryValues);
231b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
232b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
2337add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private void buildCameraId(
23459ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang            PreferenceGroup group, IconListPreference preference) {
2357add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        int numOfCameras = mCameraInfo.length;
2367add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (numOfCameras < 2) {
23759ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang            removePreference(group, preference.getKey());
2387add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            return;
2397add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
2407add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li
24170ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong        CharSequence[] entryValues = new CharSequence[numOfCameras];
24270ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong        for (int i = 0; i < numOfCameras; ++i) {
24370ad8651d018b6d3ddea2e0bb7c8b12384059bf0Angus Kong            entryValues[i] = "" + i;
2447add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
24559ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang        preference.setEntryValues(entryValues);
24659ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang    }
24759ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang
24873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private static boolean removePreference(PreferenceGroup group, String key) {
24973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        for (int i = 0, n = group.size(); i < n; i++) {
25073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            CameraPreference child = group.get(i);
2515945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            if (child instanceof PreferenceGroup) {
25273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                if (removePreference((PreferenceGroup) child, key)) {
2535945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                    return true;
2545945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                }
2555945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            }
25673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            if (child instanceof ListPreference &&
25773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                    ((ListPreference) child).getKey().equals(key)) {
25873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                group.removePreference(i);
25973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                return true;
26073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            }
2615945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        }
2625945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        return false;
2635945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    }
2645945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
26573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void filterUnsupportedOptions(PreferenceGroup group,
26678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            ListPreference pref, List<String> supported) {
26778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
268df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // Remove the preference if the parameter is not supported or there is
269df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // only one options for the settings.
27022a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin        if (supported == null || supported.size() <= 1) {
27173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            removePreference(group, pref.getKey());
2729dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li            return;
2739dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li        }
2749dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li
2751e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin        pref.filterUnsupported(supported);
27622216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        if (pref.getEntries().length <= 1) {
27722216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            removePreference(group, pref.getKey());
27822216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li            return;
27922216b6cc942fc3a97b99d6bce4b1a86f19c08d4Wu-cheng Li        }
28087341536812081826656040ac81f8f386c6c1407Wu-cheng Li
281b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li        resetIfInvalid(pref);
282b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li    }
283b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li
284b3681fed693233f202e250ff22fed70d1bbb1932Wu-cheng Li    private void resetIfInvalid(ListPreference pref) {
2852ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set the value to the first entry if it is invalid.
2862ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        String value = pref.getValue();
28778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pref.findIndexOfValue(value) == NOT_FOUND) {
2882ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            pref.setValueIndex(0);
28987341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
29087341536812081826656040ac81f8f386c6c1407Wu-cheng Li    }
29187341536812081826656040ac81f8f386c6c1407Wu-cheng Li
29278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static List<String> sizeListToStringList(List<Size> sizes) {
29378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ArrayList<String> list = new ArrayList<String>();
29478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        for (Size size : sizes) {
29578f160ee416ba27ba55954950473e17ba9d20052Owen Lin            list.add(String.format("%dx%d", size.width, size.height));
296c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen        }
29778f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return list;
298b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
2996f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
3001ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeLocalPreferences(SharedPreferences pref) {
3011ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        int version;
3021ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        try {
3031ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = pref.getInt(KEY_LOCAL_VERSION, 0);
3041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        } catch (Exception ex) {
3051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = 0;
3061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        }
3071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        if (version == CURRENT_LOCAL_VERSION) return;
308cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong
3091ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        SharedPreferences.Editor editor = pref.edit();
310cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        if (version == 1) {
311cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            // We use numbers to represent the quality now. The quality definition is identical to
312cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            // that of CamcorderProfile.java.
313cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong            editor.remove("pref_video_quality_key");
314cfcb0b746106900c9233f9bf51843f82d50f9d20Angus Kong        }
3151ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION);
3164714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3171ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3181ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
3191ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeGlobalPreferences(SharedPreferences pref) {
32040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        upgradeOldVersion(pref);
32140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        upgradeCameraId(pref);
32240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang    }
32340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang
32440ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang    private static void upgradeOldVersion(SharedPreferences pref) {
3256f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        int version;
3266f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        try {
3276f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = pref.getInt(KEY_VERSION, 0);
3286f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        } catch (Exception ex) {
3296f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = 0;
3306f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
331a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        if (version == CURRENT_VERSION) return;
3326f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
333a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        SharedPreferences.Editor editor = pref.edit();
3346f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        if (version == 0) {
335469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // We won't use the preference which change in version 1.
336469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // So, just upgrade to version 1 directly
337faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 1;
338faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        }
339faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        if (version == 1) {
340faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            // Change jpeg quality {65,75,85} to {normal,fine,superfine}
341faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            String quality = pref.getString(KEY_JPEG_QUALITY, "85");
342faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            if (quality.equals("65")) {
343faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "normal";
344faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else if (quality.equals("75")) {
345faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "fine";
346faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else {
347faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "superfine";
348faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            }
349faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            editor.putString(KEY_JPEG_QUALITY, quality);
350faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 2;
3516f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
3523e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        if (version == 2) {
3533e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            editor.putString(KEY_RECORD_LOCATION,
3543e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    pref.getBoolean(KEY_RECORD_LOCATION, false)
3553e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    ? RecordLocationPreference.VALUE_ON
3563e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    : RecordLocationPreference.VALUE_NONE);
3573e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            version = 3;
3583e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        }
359469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (version == 3) {
360469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // Just use video quality to replace it and
361469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // ignore the current settings.
362469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_videoquality_key");
363469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_video_duration_key");
364469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
36505999715cc38365aa4751a2a355eb1af284573abAngus Kong
366a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.putInt(KEY_VERSION, CURRENT_VERSION);
3674714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3686f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    }
369469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
37040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang    private static void upgradeCameraId(SharedPreferences pref) {
37140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        // The id stored in the preference may be out of range if we are running
37240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        // inside the emulator and a webcam is removed.
37340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        // Note: This method accesses the global preferences directly, not the
37440ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        // combo preferences.
37540ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        int cameraId = readPreferredCameraId(pref);
37640ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        if (cameraId == 0) return;  // fast path
37740ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang
37840ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        int n = CameraHolder.instance().getNumberOfCameras();
37940ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        if (cameraId < 0 || cameraId >= n) {
38040ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang            writePreferredCameraId(pref, 0);
38140ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang        }
38240ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang    }
38340ffd9c0f81e20a482ca6832a8585ac5232370bfChih-Chung Chang
3841ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static int readPreferredCameraId(SharedPreferences pref) {
3852b4b2a4b2ec489f93b2a98d5c90d972c50a38c7dWu-cheng Li        return Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0"));
386ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
387ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
3881ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void writePreferredCameraId(SharedPreferences pref,
3891ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            int cameraId) {
3901ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        Editor editor = pref.edit();
3917add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
3924714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
393ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
394003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
395b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang    public static int readExposure(ComboPreferences preferences) {
396b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        String exposure = preferences.getString(
397b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang                CameraSettings.KEY_EXPOSURE,
398b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang                EXPOSURE_DEFAULT_VALUE);
399b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        try {
400b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang            return Integer.parseInt(exposure);
401b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        } catch (Exception ex) {
402b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang            Log.e(TAG, "Invalid exposure: " + exposure);
403b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        }
404b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang        return 0;
405b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang    }
406003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
4079efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    public static int readEffectType(SharedPreferences pref) {
4089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none");
4099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.equals("none")) {
4109efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_NONE;
4119efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("goofy_face")) {
4129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_GOOFY_FACE;
4139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("backdropper")) {
4149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return EffectsRecorder.EFFECT_BACKDROPPER;
4159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
4169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        Log.e(TAG, "Invalid effect selection: " + effectSelection);
4179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        return EffectsRecorder.EFFECT_NONE;
4189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
4199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    public static Object readEffectParameter(SharedPreferences pref) {
4219efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectSelection = pref.getString(KEY_VIDEO_EFFECT, "none");
4229efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.equals("none")) {
4239efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return null;
4249efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
4259efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        int separatorIndex = effectSelection.indexOf('/');
4269efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        String effectParameter =
4279efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                effectSelection.substring(separatorIndex + 1);
4289efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        if (effectSelection.startsWith("goofy_face")) {
4299efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (effectParameter.equals("squeeze")) {
4309efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SQUEEZE;
4319efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_eyes")) {
4329efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_EYES;
4339efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_mouth")) {
4349efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_MOUTH;
4359efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("small_mouth")) {
4369efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SMALL_MOUTH;
4379efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("big_nose")) {
4389efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_BIG_NOSE;
4399efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            } else if (effectParameter.equals("small_eyes")) {
4409efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                return EffectsRecorder.EFFECT_GF_SMALL_EYES;
4419efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            }
4429efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        } else if (effectSelection.startsWith("backdropper")) {
4439efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            // Parameter is a string that either encodes the URI to use,
4449efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            // or specifies 'gallery'.
4459efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            return effectParameter;
4469efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
4479efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4489efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        Log.e(TAG, "Invalid effect selection: " + effectSelection);
4499efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        return null;
4509efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
4519efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
4529efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
453003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    public static void restorePreferences(Context context,
454003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            ComboPreferences preferences, Parameters parameters) {
455003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int currentCameraId = readPreferredCameraId(preferences);
456003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
457003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // Clear the preferences of both cameras.
458003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int backCameraId = CameraHolder.instance().getBackCameraId();
459003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        if (backCameraId != -1) {
460003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            preferences.setLocalId(context, backCameraId);
461003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            Editor editor = preferences.edit();
462003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.clear();
463003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.apply();
464003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        }
465003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        int frontCameraId = CameraHolder.instance().getFrontCameraId();
466003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        if (frontCameraId != -1) {
467003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            preferences.setLocalId(context, frontCameraId);
468003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            Editor editor = preferences.edit();
469003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.clear();
470003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            editor.apply();
471003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        }
472003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
4734a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        // Switch back to the preferences of the current camera. Otherwise,
4744a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        // we may write the preference to wrong camera later.
4754a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li        preferences.setLocalId(context, currentCameraId);
4764a70e66b58207703f8a705548efcd5353106e452Wu-cheng Li
477003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        upgradeGlobalPreferences(preferences.getGlobal());
478003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        upgradeLocalPreferences(preferences.getLocal());
479003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
480003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // Write back the current camera id because parameters are related to
481003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // the camera. Otherwise, we may switch to the front camera but the
482003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        // initial picture size is that of the back camera.
483003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        initialCameraPictureSize(context, parameters);
484003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        writePreferredCameraId(preferences, currentCameraId);
485003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    }
48610208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li
48705999715cc38365aa4751a2a355eb1af284573abAngus Kong    private ArrayList<String> getSupportedVideoQuality() {
48805999715cc38365aa4751a2a355eb1af284573abAngus Kong        ArrayList<String> supported = new ArrayList<String>();
48905999715cc38365aa4751a2a355eb1af284573abAngus Kong        // Check for supported quality
49005999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_1080P)) {
49105999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_1080P));
49205999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
49305999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_720P)) {
49405999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_720P));
49510208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li        }
49605999715cc38365aa4751a2a355eb1af284573abAngus Kong        if (CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_480P)) {
49705999715cc38365aa4751a2a355eb1af284573abAngus Kong            supported.add(Integer.toString(CamcorderProfile.QUALITY_480P));
49805999715cc38365aa4751a2a355eb1af284573abAngus Kong        }
49905999715cc38365aa4751a2a355eb1af284573abAngus Kong
50005999715cc38365aa4751a2a355eb1af284573abAngus Kong        return supported;
50110208b3b4e2e9ca5af27be49356288531e3cd45bWu-cheng Li    }
5029efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
5039efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    private void initVideoEffect(PreferenceGroup group, ListPreference videoEffect) {
5049efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        CharSequence[] values = videoEffect.getEntryValues();
5059efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
50605999715cc38365aa4751a2a355eb1af284573abAngus Kong        boolean goofyFaceSupported =
50705999715cc38365aa4751a2a355eb1af284573abAngus Kong                EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_GOOFY_FACE);
5089efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        boolean backdropperSupported =
5099efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala                EffectsRecorder.isEffectSupported(EffectsRecorder.EFFECT_BACKDROPPER) &&
510f2229614847f060be34593757ca402ae62c7cc7dAhbong Chang                Util.isAutoExposureLockSupported(mParameters) &&
511f2229614847f060be34593757ca402ae62c7cc7dAhbong Chang                Util.isAutoWhiteBalanceLockSupported(mParameters);
5129efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
5139efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        ArrayList<String> supported = new ArrayList<String>();
5149efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        for (CharSequence value : values) {
5159efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            String effectSelection = value.toString();
5169efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (!goofyFaceSupported && effectSelection.startsWith("goofy_face")) continue;
5179efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            if (!backdropperSupported && effectSelection.startsWith("backdropper")) continue;
5189efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala            supported.add(effectSelection);
5199efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        }
5209efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala
5219efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala        filterUnsupportedOptions(group, videoEffect, supported);
5229efb0b19fa929c528253f0a9b6f5b27791e1ee52Eino-Ville Talvala    }
523b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
524