summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/SettingsManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/SettingsManager.java')
-rw-r--r--src/com/android/camera/SettingsManager.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index ae46b9587..a3778b444 100644
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -115,6 +115,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
"pref_camera2_video_time_lapse_frame_interval_key";
public static final String KEY_FACE_DETECTION = "pref_camera2_facedetection_key";
public static final String KEY_AUTO_VIDEOSNAP_SIZE = "pref_camera2_videosnap_key";
+ public static final String KEY_VIDEO_HIGH_FRAME_RATE = "pref_camera2_hfr_key";
private static final String TAG = "SnapCam_SettingsManager";
private static SettingsManager sInstance;
@@ -128,6 +129,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
private boolean mIsMonoCameraPresent = false;
private boolean mIsFrontCameraPresent = false;
private JSONObject mDependency;
+ private int mCameraId;
private SettingsManager(Context context) {
mListeners = new ArrayList<>();
@@ -201,6 +203,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
@Override
public void onSettingChanged(ListPreference pref) {
String key = pref.getKey();
+ if (pref.getKey().equals(KEY_VIDEO_QUALITY)) buildHFR();
List changed = checkDependencyAndUpdate(key);
if (changed == null) return;
notifyListeners(changed);
@@ -219,6 +222,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
private void setLocalIdAndInitialize(int cameraId) {
mPreferences.setLocalId(mContext, cameraId);
+ mCameraId = cameraId;
CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());
PreferenceInflater inflater = new PreferenceInflater(mContext);
@@ -505,6 +509,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
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) {
CameraSettings.filterUnsupportedOptions(mPreferenceGroup,
@@ -591,6 +596,10 @@ public class SettingsManager implements ListMenu.SettingsListener {
if (!TrackingFocusFrameListener.isSupportedStatic())
removePreference(mPreferenceGroup, KEY_TRACKINGFOCUS);
}
+
+ if (hfr != null) {
+ buildHFR();
+ }
}
private void buildExposureCompensation(int cameraId) {
@@ -653,6 +662,86 @@ 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);
+ hfrPref.setValueIndex(0);
+ return;
+ }
+
+ 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 (!found) {
+ CharSequence[] entryValues = new CharSequence[1];
+ CharSequence[] entries = new CharSequence[1];
+ entryValues[0] = "off";
+ entries[0] = "Off";
+ hfrPref.setEntryValues(entryValues);
+ hfrPref.setEntries(entries);
+ hfrPref.setValueIndex(0);
+ return;
+ }
+
+ Range[] range = getSupportedHighSpeedVideoFPSRange(mCameraId, highSpeedVideoSize[0]);
+ ArrayList<Range> list = new ArrayList<>();
+ for (Range r : range) {
+ if (r.getLower() == r.getUpper()) {
+ list.add(r);
+ }
+ }
+
+ 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);
+ hfrPref.setValueIndex(0);
+ return;
+ }
+
+ 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);
+ }
+
private boolean removePreference(PreferenceGroup group, String key) {
for (int i = 0, n = group.size(); i < n; i++) {
CameraPreference child = group.get(i);
@@ -816,6 +905,18 @@ public class SettingsManager implements ListMenu.SettingsListener {
return res;
}
+ public Size[] getSupportedHighSpeedVideoSize(int cameraId) {
+ StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
+ CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ return map.getHighSpeedVideoSizes();
+ }
+
+ public Range[] getSupportedHighSpeedVideoFPSRange(int cameraId, Size videoSize) {
+ StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
+ CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ return map.getHighSpeedVideoFpsRangesFor(videoSize);
+ }
+
private List<String> getSupportedRedeyeReduction(int cameraId) {
int[] flashModes = mCharacteristics.get(cameraId).get(CameraCharacteristics
.CONTROL_AE_AVAILABLE_MODES);
@@ -983,6 +1084,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
JSONObject dependencyMap = getDependencyMapForKey(key);
if (dependencyMap == null) return null;
if (!dependencyMap.has(value)) value = "default";
+ if (!dependencyMap.has(value)) return null;
value = getDependencyKey(dependencyMap, value);
try {
return dependencyMap.getJSONObject(value);