diff options
Diffstat (limited to 'src/com/android/camera/SettingsManager.java')
-rw-r--r-- | src/com/android/camera/SettingsManager.java | 102 |
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); |