CameraSettings.java revision f6a9ed7f6b08d0694795adc6ea6fce999e8cab87
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";
426227fa641518492a6b660c78463da18d9ec8fcd8Nipun Kwatra    public static final String KEY_VIDEO_TIME_LAPSE_QUALITY = "pref_video_time_lapse_quality_key";
43f6a9ed7f6b08d0694795adc6ea6fce999e8cab87Nipun Kwatra    public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key";
449dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
45e0770004600f76cc4b440104e98e14712b4fd1c6Wu-cheng Li    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
460f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
475945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
48da3e9964a4a82a942d7f450e7c89904f5c5aa03fWu-cheng Li    public static final String KEY_VIDEOCAMERA_FLASH_MODE = "pref_camera_video_flashmode_key";
4978f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
5033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key";
518d0ba007ec6ef9bb34dc0c9f40c4c29dad2691e0Owen Lin    public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
5233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    public static final String KEY_EXPOSURE = "pref_camera_exposure_key";
537add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public static final String KEY_CAMERA_ID = "pref_camera_id_key";
548791695ba110ad0b088d2e8b3b0127c0042e1865Owen Lin
55469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_HIGH = "high";
56469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_MMS = "mms";
57469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final String VIDEO_QUALITY_YOUTUBE = "youtube";
586f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
59f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin    public static final String EXPOSURE_DEFAULT_VALUE = "0";
60f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin
61469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final int CURRENT_VERSION = 4;
621ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static final int CURRENT_LOCAL_VERSION = 1;
63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
64469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    // max video duration in seconds for mms and youtube.
653a4ef93f95bed9f812fe75ef94296450833b3997James Dong    private static final int MMS_VIDEO_DURATION = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW).duration;
66469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final int YOUTUBE_VIDEO_DURATION = 10 * 60; // 10 mins
67469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    private static final int DEFAULT_VIDEO_DURATION = 30 * 60; // 10 mins
68469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
69469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static final String DEFAULT_VIDEO_QUALITY_VALUE = "high";
70b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
7178f160ee416ba27ba55954950473e17ba9d20052Owen Lin    // MMS video length
7278f160ee416ba27ba55954950473e17ba9d20052Owen Lin    public static final int DEFAULT_VIDEO_DURATION_VALUE = -1;
734305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
7471d56e21859a797ec4633f209b3605276345d44eOwen Lin    @SuppressWarnings("unused")
7578f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static final String TAG = "CameraSettings";
7678f160ee416ba27ba55954950473e17ba9d20052Owen Lin
7778f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Context mContext;
7878f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private final Parameters mParameters;
797add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private final CameraInfo[] mCameraInfo;
8078f160ee416ba27ba55954950473e17ba9d20052Owen Lin
817add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    public CameraSettings(Activity activity, Parameters parameters,
827add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                          CameraInfo[] cameraInfo) {
8378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mContext = activity;
8478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        mParameters = parameters;
857add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        mCameraInfo = cameraInfo;
8678f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
8778f160ee416ba27ba55954950473e17ba9d20052Owen Lin
8873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    public PreferenceGroup getPreferenceGroup(int preferenceRes) {
8973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceInflater inflater = new PreferenceInflater(mContext);
9073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        PreferenceGroup group =
9173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                (PreferenceGroup) inflater.inflate(preferenceRes);
9273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        initPreference(group);
9373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        return group;
9478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    }
9578f160ee416ba27ba55954950473e17ba9d20052Owen Lin
9632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static void initialCameraPictureSize(
9732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            Context context, Parameters parameters) {
9832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // When launching the camera app first time, we will set the picture
9932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // size to the first one in the list defined in "arrays.xml" and is also
10032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        // supported by the driver.
10132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        List<Size> supported = parameters.getSupportedPictureSizes();
10232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (supported == null) return;
10332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (String candidate : context.getResources().getStringArray(
10432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                R.array.pref_camera_picturesize_entryvalues)) {
10532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (setCameraPictureSize(candidate, supported, parameters)) {
1061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                SharedPreferences.Editor editor = ComboPreferences
1071ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang                        .get(context).edit();
10832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                editor.putString(KEY_PICTURE_SIZE, candidate);
1094714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li                editor.apply();
11032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return;
11132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
11232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
1134ddee78a1507b3c067745023bd2330b866b8aaf9Owen Lin        Log.e(TAG, "No supported picture size found");
11432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
11532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
1167e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    public static void removePreferenceFromScreen(
11773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            PreferenceGroup group, String key) {
11873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        removePreference(group, key);
1197e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen    }
1207e4655b1b3fcbc543430bea680872f564af098f5Wei-Ta Chen
12132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    public static boolean setCameraPictureSize(
12232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            String candidate, List<Size> supported, Parameters parameters) {
12332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int index = candidate.indexOf('x');
12432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        if (index == NOT_FOUND) return false;
12532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int width = Integer.parseInt(candidate.substring(0, index));
12632bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        int height = Integer.parseInt(candidate.substring(index + 1));
12732bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        for (Size size: supported) {
12832bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            if (size.width == width && size.height == height) {
12932bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                parameters.setPictureSize(width, height);
13032bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin                return true;
13132bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin            }
13232bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        }
13332bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin        return false;
13432bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin    }
13532bfffa5822490ea0e105e9fe00b9df8db1b7b02Owen Lin
13673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void initPreference(PreferenceGroup group) {
137469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
138035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        ListPreference videoTimeLapseQuality = group.findPreference(KEY_VIDEO_TIME_LAPSE_QUALITY);
13973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE);
14073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference whiteBalance =  group.findPreference(KEY_WHITE_BALANCE);
14173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT);
14273e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference sceneMode = group.findPreference(KEY_SCENE_MODE);
14373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference flashMode = group.findPreference(KEY_FLASH_MODE);
14473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE);
14533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        ListPreference exposure = group.findPreference(KEY_EXPOSURE);
1467add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        IconListPreference cameraId =
1477add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                (IconListPreference)group.findPreference(KEY_CAMERA_ID);
1486988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        ListPreference videoFlashMode =
1496988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
15078f160ee416ba27ba55954950473e17ba9d20052Owen Lin
15178f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Since the screen could be loaded from different resources, we need
15278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // to check if the preference is available here
153469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (videoQuality != null) {
15478f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // Modify video duration settings.
15578f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // The first entry is for MMS video duration, and we need to fill
15678f160ee416ba27ba55954950473e17ba9d20052Owen Lin            // in the device-dependent value (in seconds).
157469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            CharSequence[] entries = videoQuality.getEntries();
158469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            CharSequence[] values = videoQuality.getEntryValues();
159469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            for (int i = 0; i < entries.length; ++i) {
160469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                if (VIDEO_QUALITY_MMS.equals(values[i])) {
161469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                    entries[i] = entries[i].toString().replace(
162469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                            "30", Integer.toString(MMS_VIDEO_DURATION));
163469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                    break;
164469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                }
165469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            }
1664305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li        }
1674305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Li
16878f160ee416ba27ba55954950473e17ba9d20052Owen Lin        // Filter out unsupported settings / options
169035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        if (videoTimeLapseQuality != null) {
170035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra            filterUnsupportedOptions(group, videoTimeLapseQuality, getSupportedTimeLapseProfiles());
171035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        }
17278f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pictureSize != null) {
17373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group, pictureSize, sizeListToStringList(
17478f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    mParameters.getSupportedPictureSizes()));
1753f3c857e3f34650c15d764810335024654b0fcc3Owen Lin        }
17678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (whiteBalance != null) {
17773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
17878f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    whiteBalance, mParameters.getSupportedWhiteBalance());
1790f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
18078f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (colorEffect != null) {
18173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
18278f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    colorEffect, mParameters.getSupportedColorEffects());
18378f160ee416ba27ba55954950473e17ba9d20052Owen Lin        }
18478f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (sceneMode != null) {
18573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
18678f160ee416ba27ba55954950473e17ba9d20052Owen Lin                    sceneMode, mParameters.getSupportedSceneModes());
1870f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li        }
188b6ad206f53981faee04800b787569dbb60492844Owen Lin        if (flashMode != null) {
18973e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
190b6ad206f53981faee04800b787569dbb60492844Owen Lin                    flashMode, mParameters.getSupportedFlashModes());
191b6ad206f53981faee04800b787569dbb60492844Owen Lin        }
192df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        if (focusMode != null) {
19373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            filterUnsupportedOptions(group,
194df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin                    focusMode, mParameters.getSupportedFocusModes());
1956988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        }
1966988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin        if (videoFlashMode != null) {
1976988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin            filterUnsupportedOptions(group,
1986988d4e2ef8d14d8bf3ee81c8eb3175bbf1b88ecOwen Lin                    videoFlashMode, mParameters.getSupportedFlashModes());
199df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        }
2007add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (exposure != null) buildExposureCompensation(group, exposure);
2017add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (cameraId != null) buildCameraId(group, cameraId);
20233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    }
20333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
204035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra    private static List<String> getSupportedTimeLapseProfiles() {
205035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        ArrayList<String> supportedProfiles = new ArrayList<String>();
206035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P)) {
207035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra            supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_480P));
208035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        }
209035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_720P)) {
210035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra            supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_720P));
211035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        }
212035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_1080P)) {
213035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra            supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_1080P));
214035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        }
215035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra
216035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra        return supportedProfiles;
217035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra    }
218035376721081f70aaf41d3da31aa50b479624ef0Nipun Kwatra
21933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin    private void buildExposureCompensation(
22033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            PreferenceGroup group, ListPreference exposure) {
22133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int max = mParameters.getMaxExposureCompensation();
22233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int min = mParameters.getMinExposureCompensation();
22333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        if (max == 0 && min == 0) {
22433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            removePreference(group, exposure.getKey());
22533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            return;
22633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
22733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        float step = mParameters.getExposureCompensationStep();
22833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin
22933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        // show only integer values for exposure compensation
23033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int maxValue = (int) Math.floor(max * step);
23133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        int minValue = (int) Math.ceil(min * step);
23233be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
23333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
23433be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        for (int i = minValue; i <= maxValue; ++i) {
23533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entryValues[maxValue - i] = Integer.toString(Math.round(i / step));
23633be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            StringBuilder builder = new StringBuilder();
23733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            if (i > 0) builder.append('+');
23833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin            entries[maxValue - i] = builder.append(i).toString();
23933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        }
24033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntries(entries);
24133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin        exposure.setEntryValues(entryValues);
242b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
243b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
2447add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    private void buildCameraId(
2457add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            PreferenceGroup group, IconListPreference cameraId) {
2467add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        int numOfCameras = mCameraInfo.length;
2477add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        if (numOfCameras < 2) {
2487add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            removePreference(group, cameraId.getKey());
2497add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            return;
2507add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
2517add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li
2527add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        CharSequence entries[] = new CharSequence[numOfCameras];
2537add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        CharSequence entryValues[] = new CharSequence[numOfCameras];
2547add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        int[] iconIds = new int[numOfCameras];
2557add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        int[] largeIconIds = new int[numOfCameras];
2567add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        for (int i = 0; i < numOfCameras; i++) {
2577add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            entryValues[i] = Integer.toString(i);
2587add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            if (mCameraInfo[i].mFacing == CameraInfo.CAMERA_FACING_FRONT) {
2597add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                entries[i] = mContext.getString(
2607add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                        R.string.pref_camera_id_entry_front);
2617add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                iconIds[i] = R.drawable.ic_menuselect_camera_facing_front;
2627add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_front;
2637add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            } else {
2647add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                entries[i] = mContext.getString(
2657add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                        R.string.pref_camera_id_entry_back);
2667add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                iconIds[i] = R.drawable.ic_menuselect_camera_facing_back;
2677add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_back;
2687add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li            }
2697add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        }
2707add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        cameraId.setEntries(entries);
2717add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        cameraId.setEntryValues(entryValues);
2727add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        cameraId.setIconIds(iconIds);
2737add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        cameraId.setLargeIconIds(largeIconIds);
2747add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li    }
2757add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li
27673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private static boolean removePreference(PreferenceGroup group, String key) {
27773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin        for (int i = 0, n = group.size(); i < n; i++) {
27873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            CameraPreference child = group.get(i);
2795945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            if (child instanceof PreferenceGroup) {
28073e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                if (removePreference((PreferenceGroup) child, key)) {
2815945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                    return true;
2825945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li                }
2835945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li            }
28473e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            if (child instanceof ListPreference &&
28573e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                    ((ListPreference) child).getKey().equals(key)) {
28673e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                group.removePreference(i);
28773e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin                return true;
28873e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            }
2895945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        }
2905945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li        return false;
2915945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li    }
2925945773c664ada754ce5eb9239bd4c8bd95ee4b4Wu-cheng Li
29373e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin    private void filterUnsupportedOptions(PreferenceGroup group,
29478f160ee416ba27ba55954950473e17ba9d20052Owen Lin            ListPreference pref, List<String> supported) {
29578f160ee416ba27ba55954950473e17ba9d20052Owen Lin
296df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        CharSequence[] allEntries = pref.getEntries();
297df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin
298df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // Remove the preference if the parameter is not supported or there is
299df3731bacfe26910a5dd0813c6aa80a6e55b85adCheng-Ru Lin        // only one options for the settings.
30022a695f8ca31dc2899e7206d68316c7e6d960657Owen Lin        if (supported == null || supported.size() <= 1) {
30173e782de608cbe2ddffd75c055009ff2e208f78bOwen Lin            removePreference(group, pref.getKey());
3029dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li            return;
3039dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li        }
3049dacf7b214339440c16f3d66e12d6afef1248f68Wu-cheng Li
3051e7d70c59c3547db7589c1cae977e98d9b4e95b9Owen Lin        pref.filterUnsupported(supported);
30687341536812081826656040ac81f8f386c6c1407Wu-cheng Li
3072ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        // Set the value to the first entry if it is invalid.
3082ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li        String value = pref.getValue();
30978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        if (pref.findIndexOfValue(value) == NOT_FOUND) {
3102ac0387bbd6792187aeaacf10e40688f4260e316Wu-cheng Li            pref.setValueIndex(0);
31187341536812081826656040ac81f8f386c6c1407Wu-cheng Li        }
31287341536812081826656040ac81f8f386c6c1407Wu-cheng Li    }
31387341536812081826656040ac81f8f386c6c1407Wu-cheng Li
31478f160ee416ba27ba55954950473e17ba9d20052Owen Lin    private static List<String> sizeListToStringList(List<Size> sizes) {
31578f160ee416ba27ba55954950473e17ba9d20052Owen Lin        ArrayList<String> list = new ArrayList<String>();
31678f160ee416ba27ba55954950473e17ba9d20052Owen Lin        for (Size size : sizes) {
31778f160ee416ba27ba55954950473e17ba9d20052Owen Lin            list.add(String.format("%dx%d", size.width, size.height));
318c8cd9098d9ca174f5a0374789145faf1f15d503dRay Chen        }
31978f160ee416ba27ba55954950473e17ba9d20052Owen Lin        return list;
320b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
3216f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
3221ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeLocalPreferences(SharedPreferences pref) {
3231ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        int version;
3241ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        try {
3251ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = pref.getInt(KEY_LOCAL_VERSION, 0);
3261ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        } catch (Exception ex) {
3271ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            version = 0;
3281ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        }
3291ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        if (version == CURRENT_LOCAL_VERSION) return;
3301ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        SharedPreferences.Editor editor = pref.edit();
3311ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        editor.putInt(KEY_LOCAL_VERSION, CURRENT_LOCAL_VERSION);
3324714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3331ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3341ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
3351ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeGlobalPreferences(SharedPreferences pref) {
3366f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        int version;
3376f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        try {
3386f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = pref.getInt(KEY_VERSION, 0);
3396f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        } catch (Exception ex) {
3406f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang            version = 0;
3416f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
342a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        if (version == CURRENT_VERSION) return;
3436f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang
344a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        SharedPreferences.Editor editor = pref.edit();
3456f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        if (version == 0) {
346469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // We won't use the preference which change in version 1.
347469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // So, just upgrade to version 1 directly
348faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 1;
349faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        }
350faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang        if (version == 1) {
351faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            // Change jpeg quality {65,75,85} to {normal,fine,superfine}
352faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            String quality = pref.getString(KEY_JPEG_QUALITY, "85");
353faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            if (quality.equals("65")) {
354faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "normal";
355faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else if (quality.equals("75")) {
356faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "fine";
357faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            } else {
358faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang                quality = "superfine";
359faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            }
360faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            editor.putString(KEY_JPEG_QUALITY, quality);
361faf398ff0fa2b51348b4545505112d70ba7b47a1Chih-Chung Chang            version = 2;
3626f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang        }
3633e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        if (version == 2) {
3643e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            editor.putString(KEY_RECORD_LOCATION,
3653e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    pref.getBoolean(KEY_RECORD_LOCATION, false)
3663e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    ? RecordLocationPreference.VALUE_ON
3673e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin                    : RecordLocationPreference.VALUE_NONE);
3683e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin            version = 3;
3693e44f8076a16792bb295589ca4b467ba27ea2a6fOwen Lin        }
370469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (version == 3) {
371469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // Just use video quality to replace it and
372469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            // ignore the current settings.
373469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_videoquality_key");
374469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            editor.remove("pref_camera_video_duration_key");
375469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
376a8bbcd7ce25aada705561852ea9f356dc38c0f43Cheng-Ru Lin        editor.putInt(KEY_VERSION, CURRENT_VERSION);
3774714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
3786f2c530d91749ff2b235125c3d134c981970f13dChih-Chung Chang    }
379469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
3801ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void upgradeAllPreferences(ComboPreferences pref) {
3811ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        upgradeGlobalPreferences(pref.getGlobal());
3821ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        upgradeLocalPreferences(pref.getLocal());
3831ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    }
3841ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang
385469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static boolean getVideoQuality(String quality) {
386469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        return VIDEO_QUALITY_YOUTUBE.equals(
387469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin                quality) || VIDEO_QUALITY_HIGH.equals(quality);
388469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    }
389469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin
390469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    public static int getVidoeDurationInMillis(String quality) {
391469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        if (VIDEO_QUALITY_MMS.equals(quality)) {
392469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            return MMS_VIDEO_DURATION * 1000;
393469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        } else if (VIDEO_QUALITY_YOUTUBE.equals(quality)) {
394469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin            return YOUTUBE_VIDEO_DURATION * 1000;
395469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        }
396469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin        return DEFAULT_VIDEO_DURATION * 1000;
397469a9ef839e38630e1e652d182f7e0ee5882e277Owen Lin    }
398ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
3991ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static int readPreferredCameraId(SharedPreferences pref) {
4007add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        String id = Integer.toString(android.hardware.Camera.CAMERA_ID_DEFAULT);
4017add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        return Integer.parseInt(pref.getString(KEY_CAMERA_ID, id));
402ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
403ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang
4041ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang    public static void writePreferredCameraId(SharedPreferences pref,
4051ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang            int cameraId) {
4061ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang        Editor editor = pref.edit();
4077add00693c1ec910bc8700fe046ee18cbe4e1148Wu-cheng Li        editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
4084714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li        editor.apply();
409ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang    }
410b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
411