CameraSettings.java revision ed6661e212048dc3e143c48402b3935911c3741c
1package com.android.camera;
2
3import android.app.Activity;
4import android.content.Context;
5import android.content.SharedPreferences;
6import android.hardware.Camera.Parameters;
7import android.hardware.Camera.Size;
8import android.os.SystemProperties;
9import android.preference.ListPreference;
10import android.preference.Preference;
11import android.preference.PreferenceGroup;
12import android.preference.PreferenceManager;
13import android.preference.PreferenceScreen;
14
15import java.util.ArrayList;
16import java.util.List;
17
18public class CameraSettings {
19    private static final int FIRST_REQUEST_CODE = 100;
20    private static final int NOT_FOUND = -1;
21
22    public static final String KEY_VERSION = "pref_version_key";
23    public static final String KEY_RECORD_LOCATION =
24            "pref_camera_recordlocation_key";
25    public static final String KEY_VIDEO_QUALITY =
26            "pref_camera_videoquality_key";
27    public static final String KEY_VIDEO_DURATION =
28            "pref_camera_video_duration_key";
29    public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
30    public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
31    public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
32    public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
33    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
34    public static final String KEY_WHITE_BALANCE =
35            "pref_camera_whitebalance_key";
36    public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
37
38    public static final int CURRENT_VERSION = 1;
39
40    // max mms video duration in seconds.
41    public static final int MMS_VIDEO_DURATION =
42            SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
43
44    public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true;
45
46    // MMS video length
47    public static final int DEFAULT_VIDEO_DURATION_VALUE = -1;
48
49    private static final String TAG = "CameraSettings";
50
51    private final Context mContext;
52    private final Parameters mParameters;
53    private final PreferenceManager mManager;
54
55    public CameraSettings(Activity activity, Parameters parameters) {
56        mContext = activity;
57        mParameters = parameters;
58        mManager = new PreferenceManager(activity, FIRST_REQUEST_CODE);
59    }
60
61    public PreferenceScreen getPreferenceScreen(int preferenceRes) {
62        PreferenceScreen screen = mManager.createPreferenceScreen(mContext);
63        mManager.inflateFromResource(mContext, preferenceRes, screen);
64        initPreference(screen);
65        return screen;
66    }
67
68    private void initPreference(PreferenceScreen screen) {
69        ListPreference videoDuration =
70                (ListPreference) screen.findPreference(KEY_VIDEO_DURATION);
71        ListPreference pictureSize =
72                (ListPreference) screen.findPreference(KEY_PICTURE_SIZE);
73        ListPreference whiteBalance =
74                (ListPreference) screen.findPreference(KEY_WHITE_BALANCE);
75        ListPreference colorEffect =
76                (ListPreference) screen.findPreference(KEY_COLOR_EFFECT);
77        ListPreference sceneMode =
78                (ListPreference) screen.findPreference(KEY_SCENE_MODE);
79        ListPreference flashMode =
80                (ListPreference) screen.findPreference(KEY_FLASH_MODE);
81
82        // Since the screen could be loaded from different resources, we need
83        // to check if the preference is available here
84        if (videoDuration != null) {
85            // Modify video duration settings.
86            // The first entry is for MMS video duration, and we need to fill
87            // in the device-dependent value (in seconds).
88            CharSequence[] entries = videoDuration.getEntries();
89            entries[0] = String.format(
90                    entries[0].toString(), MMS_VIDEO_DURATION);
91        }
92
93        // Filter out unsupported settings / options
94        if (pictureSize != null) {
95            filterUnsupportedOptions(screen, pictureSize, sizeListToStringList(
96                    mParameters.getSupportedPictureSizes()));
97        }
98        if (whiteBalance != null) {
99            filterUnsupportedOptions(screen,
100                    whiteBalance, mParameters.getSupportedWhiteBalance());
101        }
102        if (colorEffect != null) {
103            filterUnsupportedOptions(screen,
104                    colorEffect, mParameters.getSupportedColorEffects());
105        }
106        if (sceneMode != null) {
107            filterUnsupportedOptions(screen,
108                    sceneMode, mParameters.getSupportedSceneModes());
109        }
110        if (flashMode != null) {
111            filterUnsupportedOptions(screen,
112                    flashMode, mParameters.getSupportedFlashModes());
113        }
114    }
115
116    private boolean removePreference(PreferenceGroup group, Preference remove) {
117        if (group.removePreference(remove)) return true;
118
119        for (int i = 0; i < group.getPreferenceCount(); i++) {
120            final Preference child = group.getPreference(i);
121            if (child instanceof PreferenceGroup) {
122                if (removePreference((PreferenceGroup) child, remove)) {
123                    return true;
124                }
125            }
126        }
127        return false;
128    }
129
130    private void filterUnsupportedOptions(PreferenceScreen screen,
131            ListPreference pref, List<String> supported) {
132
133        // Remove the preference if the parameter is not supported.
134        if (supported == null) {
135            removePreference(screen, pref);
136            return;
137        }
138
139        // Prepare setting entries and entry values.
140        CharSequence[] allEntries = pref.getEntries();
141        CharSequence[] allEntryValues = pref.getEntryValues();
142        ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
143        ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>();
144        for (int i = 0, len = allEntryValues.length; i < len; i++) {
145            if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) {
146                entries.add(allEntries[i]);
147                entryValues.add(allEntryValues[i]);
148            }
149        }
150
151        // Set entries and entry values to list preference.
152        pref.setEntries(entries.toArray(new CharSequence[entries.size()]));
153        pref.setEntryValues(entryValues.toArray(
154                new CharSequence[entryValues.size()]));
155
156        // Set the value to the first entry if it is invalid.
157        String value = pref.getValue();
158        if (pref.findIndexOfValue(value) == NOT_FOUND) {
159            pref.setValueIndex(0);
160        }
161    }
162
163    private static List<String> sizeListToStringList(List<Size> sizes) {
164        ArrayList<String> list = new ArrayList<String>();
165        for (Size size : sizes) {
166            list.add(String.format("%dx%d", size.width, size.height));
167        }
168        return list;
169    }
170
171    public static void upgradePreferences(SharedPreferences pref) {
172        int version;
173        try {
174            version = pref.getInt(KEY_VERSION, 0);
175        } catch (Exception ex) {
176            version = 0;
177        }
178
179        if (version == 0) {
180            SharedPreferences.Editor editor = pref.edit();
181            // For old version, change 1 to -1 for video duration preference.
182            if (pref.getString(KEY_VIDEO_DURATION, "1").equals("1")) {
183                editor.putString(KEY_VIDEO_DURATION, "-1");
184            }
185            editor.putInt(KEY_VERSION, CURRENT_VERSION);
186            editor.commit();
187        }
188    }
189}
190