summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Wang <jaywang@codeaurora.org>2016-10-18 11:10:14 -0700
committerJay Wang <jaywang@codeaurora.org>2016-11-07 14:25:08 -0800
commite3e71661b5f063dbfe1314800da1da0b217e49f6 (patch)
treee392a7e976c1fd45cc01cfd1b6694715439ac52f
parentcebd17a6fcf0868f9dfaff960f5e87e11d7e6d88 (diff)
downloadandroid_packages_apps_Snap-e3e71661b5f063dbfe1314800da1da0b217e49f6.tar.gz
android_packages_apps_Snap-e3e71661b5f063dbfe1314800da1da0b217e49f6.tar.bz2
android_packages_apps_Snap-e3e71661b5f063dbfe1314800da1da0b217e49f6.zip
SnapdragonCamera: run-time updates the video encoder list
Update the supported video encoder list based on video resolution. In addition, re-factor the run-time filtering of HFR list to follow the same approach. Finally, simplify the beautification dependency handling logic by fixing the supported video resolution to 720x480. CRs-Fixed: 1081552 Change-Id: I32b96f7ccf152ddf01400e9564e072e1bf1b68d1
-rw-r--r--assets/dependency.json3
-rw-r--r--src/com/android/camera/CameraSettings.java4
-rw-r--r--src/com/android/camera/ListPreference.java11
-rw-r--r--src/com/android/camera/SettingsActivity.java16
-rw-r--r--src/com/android/camera/SettingsManager.java309
5 files changed, 166 insertions, 177 deletions
diff --git a/assets/dependency.json b/assets/dependency.json
index ebb9c6a25..e415a1cec 100644
--- a/assets/dependency.json
+++ b/assets/dependency.json
@@ -69,6 +69,7 @@
{
"0":{},
"default":
- {"pref_camera2_facedetection_key":"on"}
+ {"pref_camera2_facedetection_key":"on",
+ "pref_camera2_video_quality_key":"720x480"}
}
}
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 7ca4d9c45..7dc788666 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -1041,7 +1041,7 @@ public class CameraSettings {
return false;
}
- public static boolean filterUnsupportedOptions(PreferenceGroup group,
+ private static boolean filterUnsupportedOptions(PreferenceGroup group,
ListPreference pref, List<String> supported) {
// Remove the preference if the parameter is not supported or there is
@@ -1061,7 +1061,7 @@ public class CameraSettings {
return false;
}
- public static boolean filterSimilarPictureSize(PreferenceGroup group,
+ private static boolean filterSimilarPictureSize(PreferenceGroup group,
ListPreference pref) {
pref.filterDuplicated();
if (pref.getEntries().length <= 1) {
diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java
index 722e958b2..ae37356e1 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -38,10 +38,12 @@ public class ListPreference extends CameraPreference {
private static final String TAG = "ListPreference";
private final String mKey;
private String mValue;
- public final CharSequence[] mDefaultValues;
+ private final CharSequence[] mDefaultValues;
private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
+ private CharSequence[] mInitialEntries;
+ private CharSequence[] mInitialEntryValues;
private CharSequence[] mDependencyList;
private CharSequence[] mLabels;
private boolean mLoaded = false;
@@ -72,6 +74,9 @@ public class ListPreference extends CameraPreference {
setEntries(a.getTextArray(R.styleable.ListPreference_entries));
setEntryValues(a.getTextArray(
R.styleable.ListPreference_entryValues));
+ mInitialEntryValues = mEntryValues;
+ mInitialEntries = mEntries;
+
setLabels(a.getTextArray(
R.styleable.ListPreference_labelList));
setDependencyList(a.getTextArray(
@@ -222,6 +227,10 @@ public class ListPreference extends CameraPreference {
mEntryValues = entryValues.toArray(new CharSequence[size]);
}
+ public void reloadInitialEntriesAndEntryValues() {
+ mEntries = mInitialEntries;
+ mEntryValues = mInitialEntryValues;
+ }
public void print() {
Log.v(TAG, "Preference key=" + getKey() + ". value=" + getValue());
for (int i = 0; i < mEntryValues.length; i++) {
diff --git a/src/com/android/camera/SettingsActivity.java b/src/com/android/camera/SettingsActivity.java
index 32c6b5cad..08e513a88 100644
--- a/src/com/android/camera/SettingsActivity.java
+++ b/src/com/android/camera/SettingsActivity.java
@@ -73,6 +73,7 @@ public class SettingsActivity extends PreferenceActivity {
}
if (key.equals(SettingsManager.KEY_VIDEO_QUALITY)) {
updatePreference(SettingsManager.KEY_VIDEO_HIGH_FRAME_RATE);
+ updatePreference(SettingsManager.KEY_VIDEO_ENCODER);
}
List<String> list = mSettingsManager.getDependentKeys(key);
if (list != null) {
@@ -151,6 +152,7 @@ public class SettingsActivity extends PreferenceActivity {
updatePreference(SettingsManager.KEY_VIDEO_QUALITY);
updatePreference(SettingsManager.KEY_EXPOSURE);
updatePreference(SettingsManager.KEY_VIDEO_HIGH_FRAME_RATE);
+ updatePreference(SettingsManager.KEY_VIDEO_ENCODER);
Map<String, SettingsManager.Values> map = mSettingsManager.getValuesMap();
Set<Map.Entry<String, SettingsManager.Values>> set = map.entrySet();
@@ -199,9 +201,15 @@ public class SettingsActivity extends PreferenceActivity {
private void updatePreference(String key) {
ListPreference pref = (ListPreference) findPreference(key);
if (pref != null) {
- pref.setEntries(mSettingsManager.getEntries(key));
- pref.setEntryValues(mSettingsManager.getEntryValues(key));
- pref.setValueIndex(mSettingsManager.getValueIndex(key));
+ if (mSettingsManager.getEntries(key) != null) {
+ pref.setEntries(mSettingsManager.getEntries(key));
+ pref.setEntryValues(mSettingsManager.getEntryValues(key));
+ int idx = mSettingsManager.getValueIndex(key);
+ if (idx < 0 ) {
+ idx = 0;
+ }
+ pref.setValueIndex(idx);
+ }
}
}
@@ -214,4 +222,4 @@ public class SettingsActivity extends PreferenceActivity {
super.onStop();
mSharedPreferences.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index e076b3824..d2de113ab 100644
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -44,6 +44,8 @@ import android.util.Log;
import android.util.Range;
import android.util.Rational;
import android.util.Size;
+import android.media.EncoderCapabilities;
+import android.media.EncoderCapabilities.VideoEncoderCap;
import com.android.camera.imageprocessor.filter.BeautificationFilter;
import com.android.camera.imageprocessor.filter.BestpictureFilter;
@@ -140,8 +142,6 @@ public class SettingsManager implements ListMenu.SettingsListener {
private JSONObject mDependency;
private int mCameraId;
private Set<String> mFilteredKeys;
- private CharSequence[] mVideoQualityEntryValues;
- private CharSequence[] mVideoQualityEntries;
public Map<String, Values> getValuesMap() {
return mValuesMap;
@@ -225,8 +225,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
String key = pref.getKey();
List changed = checkDependencyAndUpdate(key);
if (changed == null) return;
- if (pref.getKey().equals(KEY_VIDEO_QUALITY)) buildHFR();
- if (pref.getKey().equals(KEY_MAKEUP)) checkVideoSizeDependency();
+ runTimeUpdateDependencyOptions(pref);
notifyListeners(changed);
}
@@ -253,34 +252,8 @@ public class SettingsManager implements ListMenu.SettingsListener {
mDependendsOnMap = new HashMap<>();
mFilteredKeys = new HashSet<>();
filterPreferences(cameraId);
- initDepedencyTable();
+ initDependencyTable();
initializeValueMap();
- checkInitialDependency(cameraId);
- }
-
- private void checkInitialDependency(int cameraId) {
- ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
- if (videoQuality != null) {
- String scene = getValue(SettingsManager.KEY_MAKEUP);
- if (scene != null && !scene.equals("0")) {
- updateVideoQualityMenu(cameraId, 720, 480);
- }
- }
- }
-
- private void checkVideoSizeDependency() {
- String makeup = getValue(SettingsManager.KEY_MAKEUP);
- String video = getValue(SettingsManager.KEY_VIDEO_QUALITY);
- Size videoSize = parseSize(video);
- if (makeup != null && !makeup.equals("0")) {
- if (videoSize.getWidth() > 720 || videoSize.getHeight() > 480) {
- String size = getSupportedVideoSize(mCameraId, 720, 480).get(0);
- setValue(KEY_VIDEO_QUALITY, size);
- }
- updateVideoQualityMenu(mCameraId, 720, 480);
- } else {
- updateVideoQualityMenu(mCameraId, -1, -1);
- }
}
private Size parseSize(String value) {
@@ -290,7 +263,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
return new Size(width, height);
}
- private void initDepedencyTable() {
+ private void initDependencyTable() {
for (int i = 0; i < mPreferenceGroup.size(); i++) {
ListPreference pref = (ListPreference) mPreferenceGroup.get(i);
String baseKey = pref.getKey();
@@ -455,7 +428,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
public int getValueIndex(String key) {
ListPreference pref = mPreferenceGroup.findPreference(key);
String value = getValue(key);
- if (value == null) return -1;
+ if ((value == null) || (pref == null)) return -1;
return pref.findIndexOfValue(value);
}
@@ -481,16 +454,17 @@ public class SettingsManager implements ListMenu.SettingsListener {
public void setValueIndex(String key, int index) {
ListPreference pref = mPreferenceGroup.findPreference(key);
- pref.setValueIndex(index);
- updateMapAndNotify(pref);
+ if (pref != null) {
+ pref.setValueIndex(index);
+ updateMapAndNotify(pref);
+ }
}
private void updateMapAndNotify(ListPreference pref) {
String key = pref.getKey();
List changed = checkDependencyAndUpdate(key);
if (changed == null) return;
- if (pref.getKey().equals(KEY_VIDEO_QUALITY)) buildHFR();
- if (pref.getKey().equals(KEY_MAKEUP)) checkVideoSizeDependency();
+ runTimeUpdateDependencyOptions(pref);
notifyListeners(changed);
}
@@ -500,12 +474,18 @@ public class SettingsManager implements ListMenu.SettingsListener {
public CharSequence[] getEntries(String key) {
ListPreference pref = mPreferenceGroup.findPreference(key);
- return pref.getEntries();
+ if (pref != null) {
+ return pref.getEntries();
+ }
+ return null;
}
public CharSequence[] getEntryValues(String key) {
ListPreference pref = mPreferenceGroup.findPreference(key);
- return pref.getEntryValues();
+ if (pref != null) {
+ return pref.getEntryValues();
+ }
+ return null;
}
public int[] getResource(String key, int type) {
@@ -528,22 +508,6 @@ public class SettingsManager implements ListMenu.SettingsListener {
else return CaptureModule.MONO_ID;
}
- public void updateVideoQualityMenu(int cameraId, int maxWidth, int maxHeight) {
- ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
- videoQuality.setEntryValues(mVideoQualityEntryValues);
- videoQuality.setEntries(mVideoQualityEntries);
- if (videoQuality != null) {
- List<String> sizes;
- if(maxWidth < 0 && maxHeight < 0) {
- sizes = getSupportedVideoSize(cameraId);
- } else {
- sizes = getSupportedVideoSize(cameraId, maxWidth, maxHeight);
- }
- CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
- videoQuality, sizes);
- }
- }
-
private void filterPreferences(int cameraId) {
// filter unsupported preferences
ListPreference whiteBalance = mPreferenceGroup.findPreference(KEY_WHITE_BALANCE);
@@ -560,13 +524,10 @@ public class SettingsManager implements ListMenu.SettingsListener {
ListPreference mpo = mPreferenceGroup.findPreference(KEY_MPO);
ListPreference redeyeReduction = mPreferenceGroup.findPreference(KEY_REDEYE_REDUCTION);
ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
- ListPreference videoEncoder = mPreferenceGroup.findPreference(KEY_VIDEO_ENCODER);
ListPreference audioEncoder = mPreferenceGroup.findPreference(KEY_AUDIO_ENCODER);
ListPreference noiseReduction = mPreferenceGroup.findPreference(KEY_NOISE_REDUCTION);
ListPreference faceDetection = mPreferenceGroup.findPreference(KEY_FACE_DETECTION);
- ListPreference makeup = mPreferenceGroup.findPreference(KEY_MAKEUP);
ListPreference trackingfocus = mPreferenceGroup.findPreference(KEY_TRACKINGFOCUS);
- ListPreference hfr = mPreferenceGroup.findPreference(KEY_VIDEO_HIGH_FRAME_RATE);
if (whiteBalance != null) {
if (filterUnsupportedOptions(whiteBalance, getSupportedWhiteBalanceModes(cameraId))) {
@@ -599,7 +560,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
if (filterUnsupportedOptions(pictureSize, getSupportedPictureSize(cameraId))) {
mFilteredKeys.add(pictureSize.getKey());
} else {
- if (CameraSettings.filterSimilarPictureSize(mPreferenceGroup, pictureSize)) {
+ if (filterSimilarPictureSize(mPreferenceGroup, pictureSize)) {
mFilteredKeys.add(pictureSize.getKey());
}
}
@@ -614,10 +575,10 @@ public class SettingsManager implements ListMenu.SettingsListener {
}
if (videoQuality != null) {
- CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
- videoQuality, getSupportedVideoSize(cameraId));
- mVideoQualityEntryValues = videoQuality.getEntryValues();
- mVideoQualityEntries = videoQuality.getEntries();
+ if (filterUnsupportedOptions(videoQuality,
+ getSupportedVideoSize(cameraId))) {
+ mFilteredKeys.add(videoQuality.getKey());
+ }
}
if (!mIsMonoCameraPresent) {
@@ -633,13 +594,6 @@ public class SettingsManager implements ListMenu.SettingsListener {
}
}
- if (videoEncoder != null) {
- if (filterUnsupportedOptions(videoEncoder,
- getSupportedVideoEncoders(videoEncoder.getEntryValues()))) {
- mFilteredKeys.add(videoEncoder.getKey());
- }
- }
-
if (audioEncoder != null) {
if (filterUnsupportedOptions(audioEncoder,
getSupportedAudioEncoders(audioEncoder.getEntryValues()))) {
@@ -665,9 +619,10 @@ public class SettingsManager implements ListMenu.SettingsListener {
removePreference(mPreferenceGroup, KEY_TRACKINGFOCUS);
}
- if (hfr != null) {
- buildHFR();
- }
+ // filter dynamic lists.
+ // These list can be changed run-time
+ filterHFROptions();
+ filterVideoEncoderOptions();
if (!mIsFrontCameraPresent || !isFacingFront(mCameraId)) {
removePreference(mPreferenceGroup, KEY_SELFIE_FLASH);
@@ -675,6 +630,14 @@ public class SettingsManager implements ListMenu.SettingsListener {
}
}
+ private void runTimeUpdateDependencyOptions(ListPreference pref) {
+ // update the supported list
+ if (pref.getKey().equals(KEY_VIDEO_QUALITY)) {
+ filterHFROptions();
+ filterVideoEncoderOptions();
+ }
+ }
+
private void buildExposureCompensation(int cameraId) {
Range<Integer> range = mCharacteristics.get(cameraId).get(CameraCharacteristics
.CONTROL_AE_COMPENSATION_RANGE);
@@ -747,86 +710,52 @@ public class SettingsManager implements ListMenu.SettingsListener {
cameraIdPref.setEntries(entries);
}
- private void buildHFR() {
- ListPreference hfrPref = mPreferenceGroup.findPreference(KEY_VIDEO_HIGH_FRAME_RATE);
- Size[] highSpeedVideoSize = getSupportedHighSpeedVideoSize(mCameraId);
- if (highSpeedVideoSize.length == 0) {
- CharSequence[] entryValues = new CharSequence[1];
- CharSequence[] entries = new CharSequence[1];
- entryValues[0] = "off";
- entries[0] = "off";
- hfrPref.setEntryValues(entryValues);
- hfrPref.setEntries(entries);
- setValueIndex(KEY_VIDEO_HIGH_FRAME_RATE, 0);
- return;
- }
+ private void filterVideoEncoderOptions() {
+ ListPreference videoEncoder = mPreferenceGroup.findPreference(KEY_VIDEO_ENCODER);
- ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
- String video = videoQuality.getValue();
- int x = video.indexOf('x');
- Size videoSize = new Size(Integer.parseInt(video.substring(0, x)),
- Integer.parseInt(video.substring(x + 1)));
-
- boolean found = false;
- for (Size s : highSpeedVideoSize) {
- if (videoSize.equals(s)) {
- found = true;
- break;
+ if (videoEncoder != null) {
+ videoEncoder.reloadInitialEntriesAndEntryValues();
+ if (filterUnsupportedOptions(videoEncoder,
+ getSupportedVideoEncoders())) {
+ mFilteredKeys.add(videoEncoder.getKey());
}
}
+ }
- if (!found) {
- CharSequence[] entryValues = new CharSequence[1];
- CharSequence[] entries = new CharSequence[1];
- entryValues[0] = "off";
- entries[0] = "Off";
- hfrPref.setEntryValues(entryValues);
- hfrPref.setEntries(entries);
- setValueIndex(KEY_VIDEO_HIGH_FRAME_RATE, 0);
- return;
- }
-
- Range[] range = getSupportedHighSpeedVideoFPSRange(mCameraId, videoSize);
- ArrayList<Range> list = new ArrayList<>();
- for (Range r : range) {
- if (r.getLower() == r.getUpper()) {
- list.add(r);
+ private void filterHFROptions() {
+ ListPreference hfrPref = mPreferenceGroup.findPreference(KEY_VIDEO_HIGH_FRAME_RATE);
+ if (hfrPref != null) {
+ hfrPref.reloadInitialEntriesAndEntryValues();
+ if (filterUnsupportedOptions(hfrPref,
+ getSupportedHighFrameRate())) {
+ mFilteredKeys.add(hfrPref.getKey());
}
}
+ }
- if (list.size() == 0) {
- CharSequence[] entryValues = new CharSequence[1];
- CharSequence[] entries = new CharSequence[1];
- entryValues[0] = "off";
- entries[0] = "Off";
- hfrPref.setEntryValues(entryValues);
- hfrPref.setEntries(entries);
- setValueIndex(KEY_VIDEO_HIGH_FRAME_RATE, 0);
- return;
- }
+ private List<String> getSupportedHighFrameRate() {
+ ArrayList<String> supported = new ArrayList<String>();
+ supported.add("off");
- CharSequence[] entryValues = new CharSequence[list.size() * 2 + 1];
- CharSequence[] entries = new CharSequence[list.size() * 2 + 1];
- entryValues[0] = "off";
- entries[0] = "Off";
- int i = 1;
- for (Range r : list) {
- entries[i] = "HFR " + r.getLower();
- entryValues[i] = "hfr" + r.getLower();
- i++;
- }
- for (Range r : list) {
- entries[i] = "HSR " + r.getLower();
- entryValues[i] = "hsr" + r.getLower();
- i++;
- }
-
- hfrPref.setEntryValues(entryValues);
- hfrPref.setEntries(entries);
- int index = getValueIndex(KEY_VIDEO_HIGH_FRAME_RATE);
- if (index == -1) {
- setValueIndex(KEY_VIDEO_HIGH_FRAME_RATE, 0);
+ ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
+ String videoSizeStr = videoQuality.getValue();
+ if (videoSizeStr != null) {
+ Size videoSize = parseSize(videoSizeStr);
+ try {
+ Range[] range = getSupportedHighSpeedVideoFPSRange(mCameraId, videoSize);
+ for (Range r : range) {
+ // To support HFR for both preview and recording,
+ // minmal FPS needs to be equal to maximum FPS
+ if ((int) r.getUpper() == (int)r.getLower()) {
+ supported.add("hfr" + String.valueOf(r.getUpper()));
+ supported.add("hsr" + String.valueOf(r.getUpper()));
+ }
+ }
+ } catch (IllegalArgumentException ex) {
+ Log.w(TAG, "HFR is not supported for this resolution " + ex);
+ }
}
+ return supported;
}
private boolean removePreference(PreferenceGroup group, String key) {
@@ -991,24 +920,6 @@ public class SettingsManager implements ListMenu.SettingsListener {
return res;
}
- public List<String> getSupportedVideoSize(int cameraId, int maxWidth, int maxHeight) {
- StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
- CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
- Size[] sizes = map.getOutputSizes(MediaRecorder.class);
- List<String> res = new ArrayList<>();
- for (int i = 0; i < sizes.length; i++) {
- if(sizes[i].getWidth() <= maxWidth && sizes[i].getHeight() <= maxHeight) {
- if (CameraSettings.VIDEO_QUALITY_TABLE.containsKey(sizes[i].toString())) {
- int profile = CameraSettings.VIDEO_QUALITY_TABLE.get(sizes[i].toString());
- if (CamcorderProfile.hasProfile(cameraId, profile)) {
- res.add(sizes[i].toString());
- }
- }
- }
- }
- return res;
- }
-
public Size[] getSupportedHighSpeedVideoSize(int cameraId) {
StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
@@ -1103,12 +1014,41 @@ public class SettingsManager implements ListMenu.SettingsListener {
return supportedIso;
}
- private static List<String> getSupportedVideoEncoders(CharSequence[] strings) {
- ArrayList<String> supported = new ArrayList<>();
- for (CharSequence cs: strings) {
- String s = cs.toString();
- int value = SettingTranslation.getVideoEncoder(s.toString());
- if (value != SettingTranslation.NOT_FOUND) supported.add(s.toString());
+ private boolean isCurrentVideoResolutionSupportedByEncoder(VideoEncoderCap encoderCap) {
+ boolean supported = false;
+ ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
+ String videoSizeStr = videoQuality.getValue();
+
+ if (videoSizeStr != null) {
+ Size videoSize = parseSize(videoSizeStr);
+
+ if (videoSize.getWidth() > encoderCap.mMaxFrameWidth ||
+ videoSize.getWidth() < encoderCap.mMinFrameWidth ||
+ videoSize.getHeight() > encoderCap.mMaxFrameHeight ||
+ videoSize.getHeight() < encoderCap.mMinFrameHeight) {
+ Log.e(TAG, "Codec = " + encoderCap.mCodec + ", capabilities: " +
+ "mMinFrameWidth = " + encoderCap.mMinFrameWidth + " , " +
+ "mMinFrameHeight = " + encoderCap.mMinFrameHeight + " , " +
+ "mMaxFrameWidth = " + encoderCap.mMaxFrameWidth + " , " +
+ "mMaxFrameHeight = " + encoderCap.mMaxFrameHeight);
+ } else {
+ supported = true;
+ }
+ }
+ return supported;
+ }
+
+ private List<String> getSupportedVideoEncoders() {
+ ArrayList<String> supported = new ArrayList<String>();
+ String str = null;
+ List<VideoEncoderCap> videoEncoders = EncoderCapabilities.getVideoEncoders();
+ for (VideoEncoderCap videoEncoder: videoEncoders) {
+ str = SettingTranslation.getVideoEncoder(videoEncoder.mCodec);
+ if (str != null) {
+ if (isCurrentVideoResolutionSupportedByEncoder(videoEncoder)) {
+ supported.add(str);
+ }
+ }
}
return supported;
}
@@ -1134,8 +1074,39 @@ public class SettingsManager implements ListMenu.SettingsListener {
return modes;
}
+ private void resetIfInvalid(ListPreference pref) {
+ // Set the value to the first entry if it is invalid.
+ String value = pref.getValue();
+ if (pref.findIndexOfValue(value) == -1) {
+ pref.setValueIndex(0);
+ }
+ }
+
+ private boolean filterSimilarPictureSize(PreferenceGroup group,
+ ListPreference pref) {
+ pref.filterDuplicated();
+ if (pref.getEntries().length <= 1) {
+ removePreference(group, pref.getKey());
+ return true;
+ }
+ resetIfInvalid(pref);
+ return false;
+ }
+
private boolean filterUnsupportedOptions(ListPreference pref, List<String> supported) {
- return CameraSettings.filterUnsupportedOptions(mPreferenceGroup, pref, supported);
+ // Remove the preference if the parameter is not supported
+ if (supported == null) {
+ removePreference(mPreferenceGroup, pref.getKey());
+ return true;
+ }
+ pref.filterUnsupported(supported);
+ if (pref.getEntries().length <= 0) {
+ removePreference(mPreferenceGroup, pref.getKey());
+ return true;
+ }
+
+ resetIfInvalid(pref);
+ return false;
}
public interface Listener {