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