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