blob: 0f28902621047d4a0e2f86c82031f4059ca8537b [file] [log] [blame]
The Android Open Source Projectb64d3452009-03-03 19:32:20 -08001package com.android.camera;
2
Owen Lin78f160e2009-09-10 19:08:01 +08003import android.app.Activity;
4import android.content.Context;
The Android Open Source Projectb64d3452009-03-03 19:32:20 -08005import android.content.SharedPreferences;
Cheng-Ru Lin2f3774c2009-10-01 02:29:55 +08006import android.graphics.drawable.Drawable;
Wu-cheng Li87341532009-04-02 01:39:36 -07007import android.hardware.Camera.Parameters;
Wu-cheng Li4305c702009-09-02 16:33:59 +08008import android.hardware.Camera.Size;
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +08009import android.os.SystemProperties;
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080010import android.preference.ListPreference;
Wu-cheng Li59457732009-08-03 22:25:29 +080011import android.preference.Preference;
Wu-cheng Li59457732009-08-03 22:25:29 +080012import android.preference.PreferenceGroup;
Owen Lin78f160e2009-09-10 19:08:01 +080013import android.preference.PreferenceManager;
14import android.preference.PreferenceScreen;
Wei-Ta Chen7e4655b2009-09-25 17:23:22 -070015import android.util.Log;
Ray Chend4247bc2009-04-07 14:01:16 +080016
17import java.util.ArrayList;
Wu-cheng Li4305c702009-09-02 16:33:59 +080018import java.util.List;
Wu-cheng Li87341532009-04-02 01:39:36 -070019
Owen Lin78f160e2009-09-10 19:08:01 +080020public class CameraSettings {
21 private static final int FIRST_REQUEST_CODE = 100;
22 private static final int NOT_FOUND = -1;
23
24 public static final String KEY_VERSION = "pref_version_key";
25 public static final String KEY_RECORD_LOCATION =
26 "pref_camera_recordlocation_key";
Chih-Chung Chang0a475e12009-04-16 11:42:12 +080027 public static final String KEY_VIDEO_QUALITY =
Wu-cheng Li2ac03872009-04-02 02:38:09 -070028 "pref_camera_videoquality_key";
Chih-Chung Chang82ded202009-05-20 14:24:25 +080029 public static final String KEY_VIDEO_DURATION =
30 "pref_camera_video_duration_key";
Wu-cheng Li9dacf7b2009-04-09 23:46:15 -070031 public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
Wu-cheng Lie0770002009-04-13 07:02:51 -070032 public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
Wu-cheng Li0f56ef52009-04-15 17:47:56 +080033 public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
Wu-cheng Li59457732009-08-03 22:25:29 +080034 public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
Owen Lin78f160e2009-09-10 19:08:01 +080035 public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
President Li5f6484a2009-04-02 02:38:09 -070036 public static final String KEY_WHITE_BALANCE =
37 "pref_camera_whitebalance_key";
Owen Lin8d0ba002009-09-08 17:03:07 +080038 public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
Owen Lin6d12b822009-09-18 00:20:12 +080039
Owen Lin78f160e2009-09-10 19:08:01 +080040 public static final int CURRENT_VERSION = 1;
41
42 // max mms video duration in seconds.
43 public static final int MMS_VIDEO_DURATION =
44 SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
Owen Lin8d0ba002009-09-08 17:03:07 +080045
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080046 public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true;
Chih-Chung Chang120bf582009-09-07 18:51:47 +080047
Chih-Chung Chang9b93bcb2009-09-04 19:46:14 +080048 // MMS video length
49 public static final int DEFAULT_VIDEO_DURATION_VALUE = -1;
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +080050
Owen Lin71d56e22009-09-23 22:27:04 +080051 @SuppressWarnings("unused")
Owen Lin78f160e2009-09-10 19:08:01 +080052 private static final String TAG = "CameraSettings";
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080053
Owen Lin78f160e2009-09-10 19:08:01 +080054 private final Context mContext;
55 private final Parameters mParameters;
56 private final PreferenceManager mManager;
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080057
Owen Lin78f160e2009-09-10 19:08:01 +080058 public CameraSettings(Activity activity, Parameters parameters) {
59 mContext = activity;
60 mParameters = parameters;
61 mManager = new PreferenceManager(activity, FIRST_REQUEST_CODE);
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080062 }
63
Owen Lin78f160e2009-09-10 19:08:01 +080064 public PreferenceScreen getPreferenceScreen(int preferenceRes) {
65 PreferenceScreen screen = mManager.createPreferenceScreen(mContext);
66 mManager.inflateFromResource(mContext, preferenceRes, screen);
67 initPreference(screen);
68 return screen;
The Android Open Source Projectb64d3452009-03-03 19:32:20 -080069 }
70
Owen Lin32bfffa2009-09-19 19:50:42 +080071 public static void initialCameraPictureSize(
72 Context context, Parameters parameters) {
73 // When launching the camera app first time, we will set the picture
74 // size to the first one in the list defined in "arrays.xml" and is also
75 // supported by the driver.
76 List<Size> supported = parameters.getSupportedPictureSizes();
77 if (supported == null) return;
78 for (String candidate : context.getResources().getStringArray(
79 R.array.pref_camera_picturesize_entryvalues)) {
80 if (setCameraPictureSize(candidate, supported, parameters)) {
81 SharedPreferences.Editor editor = PreferenceManager
82 .getDefaultSharedPreferences(context).edit();
83 editor.putString(KEY_PICTURE_SIZE, candidate);
84 editor.commit();
85 return;
86 }
87 }
88 }
89
Wei-Ta Chen7e4655b2009-09-25 17:23:22 -070090 public static void removePreferenceFromScreen(
91 PreferenceScreen screen, String key) {
92 Preference pref = screen.findPreference(key);
93 if (pref == null) {
94 Log.i(TAG, "No preference found based the key : " + key);
95 throw new IllegalArgumentException();
96 } else {
97 removePreference(screen, pref);
98 }
99 }
100
Owen Lin32bfffa2009-09-19 19:50:42 +0800101 public static boolean setCameraPictureSize(
102 String candidate, List<Size> supported, Parameters parameters) {
103 int index = candidate.indexOf('x');
104 if (index == NOT_FOUND) return false;
105 int width = Integer.parseInt(candidate.substring(0, index));
106 int height = Integer.parseInt(candidate.substring(index + 1));
107 for (Size size: supported) {
108 if (size.width == width && size.height == height) {
109 parameters.setPictureSize(width, height);
110 return true;
111 }
112 }
113 return false;
114 }
115
Owen Lin78f160e2009-09-10 19:08:01 +0800116 private void initPreference(PreferenceScreen screen) {
117 ListPreference videoDuration =
118 (ListPreference) screen.findPreference(KEY_VIDEO_DURATION);
119 ListPreference pictureSize =
120 (ListPreference) screen.findPreference(KEY_PICTURE_SIZE);
121 ListPreference whiteBalance =
122 (ListPreference) screen.findPreference(KEY_WHITE_BALANCE);
123 ListPreference colorEffect =
124 (ListPreference) screen.findPreference(KEY_COLOR_EFFECT);
125 ListPreference sceneMode =
126 (ListPreference) screen.findPreference(KEY_SCENE_MODE);
Owen Linb6ad2062009-09-21 09:58:09 +0800127 ListPreference flashMode =
128 (ListPreference) screen.findPreference(KEY_FLASH_MODE);
Cheng-Ru Lindf3731b2009-10-02 08:37:21 +0800129 ListPreference focusMode =
130 (ListPreference) screen.findPreference(KEY_FOCUS_MODE);
Wu-cheng Li4305c702009-09-02 16:33:59 +0800131
Owen Lin78f160e2009-09-10 19:08:01 +0800132 // Since the screen could be loaded from different resources, we need
133 // to check if the preference is available here
134 if (videoDuration != null) {
135 // Modify video duration settings.
136 // The first entry is for MMS video duration, and we need to fill
137 // in the device-dependent value (in seconds).
138 CharSequence[] entries = videoDuration.getEntries();
139 entries[0] = String.format(
140 entries[0].toString(), MMS_VIDEO_DURATION);
Wu-cheng Li0f56ef52009-04-15 17:47:56 +0800141 }
142
Owen Lin78f160e2009-09-10 19:08:01 +0800143 // Filter out unsupported settings / options
144 if (pictureSize != null) {
145 filterUnsupportedOptions(screen, pictureSize, sizeListToStringList(
146 mParameters.getSupportedPictureSizes()));
Wu-cheng Li0f56ef52009-04-15 17:47:56 +0800147 }
Owen Lin78f160e2009-09-10 19:08:01 +0800148 if (whiteBalance != null) {
149 filterUnsupportedOptions(screen,
150 whiteBalance, mParameters.getSupportedWhiteBalance());
151 }
152 if (colorEffect != null) {
153 filterUnsupportedOptions(screen,
154 colorEffect, mParameters.getSupportedColorEffects());
155 }
156 if (sceneMode != null) {
157 filterUnsupportedOptions(screen,
158 sceneMode, mParameters.getSupportedSceneModes());
159 }
Owen Linb6ad2062009-09-21 09:58:09 +0800160 if (flashMode != null) {
161 filterUnsupportedOptions(screen,
162 flashMode, mParameters.getSupportedFlashModes());
163 }
Cheng-Ru Lindf3731b2009-10-02 08:37:21 +0800164 if (focusMode != null) {
165 filterUnsupportedOptions(screen,
166 focusMode, mParameters.getSupportedFocusModes());
167 }
The Android Open Source Projectb64d3452009-03-03 19:32:20 -0800168 }
169
Wei-Ta Chen7e4655b2009-09-25 17:23:22 -0700170 private static boolean removePreference(PreferenceGroup group,
171 Preference remove) {
Wu-cheng Li59457732009-08-03 22:25:29 +0800172 if (group.removePreference(remove)) return true;
173
174 for (int i = 0; i < group.getPreferenceCount(); i++) {
175 final Preference child = group.getPreference(i);
176 if (child instanceof PreferenceGroup) {
Chih-Chung Chang522e8362009-08-26 16:12:34 +0800177 if (removePreference((PreferenceGroup) child, remove)) {
Wu-cheng Li59457732009-08-03 22:25:29 +0800178 return true;
179 }
180 }
181 }
182 return false;
183 }
184
Owen Lin78f160e2009-09-10 19:08:01 +0800185 private void filterUnsupportedOptions(PreferenceScreen screen,
186 ListPreference pref, List<String> supported) {
187
Cheng-Ru Lindf3731b2009-10-02 08:37:21 +0800188 CharSequence[] allEntries = pref.getEntries();
189
190 // Remove the preference if the parameter is not supported or there is
191 // only one options for the settings.
192 if (supported == null || allEntries.length <= 1) {
Owen Lin78f160e2009-09-10 19:08:01 +0800193 removePreference(screen, pref);
Wu-cheng Li9dacf7b2009-04-09 23:46:15 -0700194 return;
195 }
196
Wu-cheng Li59457732009-08-03 22:25:29 +0800197 CharSequence[] allEntryValues = pref.getEntryValues();
Cheng-Ru Lin2f3774c2009-10-01 02:29:55 +0800198 Drawable[] allIcons = (pref instanceof IconListPreference)
199 ? ((IconListPreference) pref).getIcons()
200 : null;
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700201 ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
202 ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>();
Cheng-Ru Lin2f3774c2009-10-01 02:29:55 +0800203 ArrayList<Drawable> icons =
204 allIcons == null ? null : new ArrayList<Drawable>();
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700205 for (int i = 0, len = allEntryValues.length; i < len; i++) {
Owen Lin78f160e2009-09-10 19:08:01 +0800206 if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) {
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700207 entries.add(allEntries[i]);
208 entryValues.add(allEntryValues[i]);
Cheng-Ru Lin2f3774c2009-10-01 02:29:55 +0800209 if (allIcons != null) icons.add(allIcons[i]);
Wu-cheng Li87341532009-04-02 01:39:36 -0700210 }
211 }
212
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700213 // Set entries and entry values to list preference.
Cheng-Ru Lin2f3774c2009-10-01 02:29:55 +0800214 int size = entries.size();
215 pref.setEntries(entries.toArray(new CharSequence[size]));
216 pref.setEntryValues(entryValues.toArray(new CharSequence[size]));
217 if (allIcons != null) {
218 ((IconListPreference) pref)
219 .setIcons(icons.toArray(new Drawable[size]));
220 }
Wu-cheng Li87341532009-04-02 01:39:36 -0700221
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700222 // Set the value to the first entry if it is invalid.
223 String value = pref.getValue();
Owen Lin78f160e2009-09-10 19:08:01 +0800224 if (pref.findIndexOfValue(value) == NOT_FOUND) {
Wu-cheng Li2ac03872009-04-02 02:38:09 -0700225 pref.setValueIndex(0);
Wu-cheng Li87341532009-04-02 01:39:36 -0700226 }
227 }
228
Owen Lin78f160e2009-09-10 19:08:01 +0800229 private static List<String> sizeListToStringList(List<Size> sizes) {
230 ArrayList<String> list = new ArrayList<String>();
231 for (Size size : sizes) {
232 list.add(String.format("%dx%d", size.width, size.height));
Ray Chenc8cd9092009-04-17 14:46:02 +0800233 }
Owen Lin78f160e2009-09-10 19:08:01 +0800234 return list;
The Android Open Source Projectb64d3452009-03-03 19:32:20 -0800235 }
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800236
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800237 public static void upgradePreferences(SharedPreferences pref) {
238 int version;
239 try {
240 version = pref.getInt(KEY_VERSION, 0);
241 } catch (Exception ex) {
242 version = 0;
243 }
Cheng-Ru Lina8bbcd72009-09-26 04:46:06 +0800244 if (version == CURRENT_VERSION) return;
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800245
Cheng-Ru Lina8bbcd72009-09-26 04:46:06 +0800246 SharedPreferences.Editor editor = pref.edit();
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800247 if (version == 0) {
Chih-Chung Chang5a0f8a82009-10-05 17:45:59 -0700248 // For old version, change 1 to 10 for video duration preference.
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800249 if (pref.getString(KEY_VIDEO_DURATION, "1").equals("1")) {
Chih-Chung Chang5a0f8a82009-10-05 17:45:59 -0700250 editor.putString(KEY_VIDEO_DURATION, "10");
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800251 }
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800252 }
Cheng-Ru Lina8bbcd72009-09-26 04:46:06 +0800253 editor.putInt(KEY_VERSION, CURRENT_VERSION);
254 editor.commit();
Chih-Chung Chang6f2c5302009-08-31 20:02:55 +0800255 }
The Android Open Source Projectb64d3452009-03-03 19:32:20 -0800256}