diff options
-rw-r--r-- | res/values/camera2arrays.xml | 14 | ||||
-rw-r--r-- | res/xml/capture_preferences.xml | 14 | ||||
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 21 | ||||
-rw-r--r-- | src/com/android/camera/CaptureUI.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/SettingsManager.java | 67 |
5 files changed, 112 insertions, 8 deletions
diff --git a/res/values/camera2arrays.xml b/res/values/camera2arrays.xml index 9865e3900..f4ac13e8c 100644 --- a/res/values/camera2arrays.xml +++ b/res/values/camera2arrays.xml @@ -507,7 +507,6 @@ <!-- Camera Preferences ISO dialog box entries --> <string-array name="pref_camera2_iso_entries"> <item>@string/pref_camera_iso_entry_auto</item> - <item>@string/pref_camera_iso_entry_isodeblur</item> <item>@string/pref_camera_iso_entry_iso100</item> <item>@string/pref_camera_iso_entry_iso200</item> <item>@string/pref_camera_iso_entry_iso400</item> @@ -517,13 +516,12 @@ <!-- Do not localize entryvalues --> <string-array name="pref_camera2_iso_entryvalues"> - <item>@string/pref_camera_iso_value_auto</item> - <item>@string/pref_camera_iso_value_isodeblur</item> - <item>@string/pref_camera_iso_value_iso100</item> - <item>@string/pref_camera_iso_value_iso200</item> - <item>@string/pref_camera_iso_value_iso400</item> - <item>@string/pref_camera_iso_value_iso800</item> - <item>@string/pref_camera_iso_value_iso1600</item> + <item>auto</item> + <item>100</item> + <item>200</item> + <item>400</item> + <item>800</item> + <item>1600</item> </string-array> <!-- Camera Preferences Auto Exposure dialog box entries --> diff --git a/res/xml/capture_preferences.xml b/res/xml/capture_preferences.xml index 59803aeb8..7ee4ae465 100644 --- a/res/xml/capture_preferences.xml +++ b/res/xml/capture_preferences.xml @@ -151,4 +151,18 @@ camera:key="pref_camera2_picturesize_key" camera:singleIcon="@drawable/ic_settings_picturesize" camera:title="@string/pref_camera_picturesize_title"/> + + <IconListPreference + camera:defaultValue="@string/pref_exposure_default" + camera:key="pref_camera2_exposure_key" + camera:singleIcon="@drawable/ic_settings_exposure" + camera:title="@string/pref_exposure_title"/> + + <IconListPreference + camera:defaultValue="@string/pref_camera_iso_default" + camera:entries="@array/pref_camera2_iso_entries" + camera:entryValues="@array/pref_camera2_iso_entryvalues" + camera:key="pref_camera2_iso_key" + camera:singleIcon="@drawable/ic_settings_iso" + camera:title="@string/pref_camera_iso_title"/> </PreferenceGroup> diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index 574fe4daf..c31658ae8 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -960,6 +960,8 @@ public class CaptureModule implements CameraModule, PhotoController, builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode); applyWhiteBalance(builder); + applyExposure(builder); + applyIso(builder); applyColorEffect(builder); applySceneMode(builder); applyZoom(builder, id); @@ -1431,6 +1433,10 @@ public class CaptureModule implements CameraModule, PhotoController, updatePreview = true; applySceneMode(mPreviewRequestBuilder[cameraId]); break; + case SettingsManager.KEY_EXPOSURE: + updatePreview = true; + applyExposure(mPreviewRequestBuilder[cameraId]); + break; } return updatePreview; } @@ -1469,6 +1475,21 @@ public class CaptureModule implements CameraModule, PhotoController, } } + private void applyExposure(CaptureRequest.Builder request) { + String value = mSettingsManager.getValue(SettingsManager.KEY_EXPOSURE); + if (value == null) return; + int intValue = Integer.parseInt(value); + request.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, intValue); + } + + private void applyIso(CaptureRequest.Builder request) { + String value = mSettingsManager.getValue(SettingsManager.KEY_ISO); + if (value == null) return; + if (value.equals("auto")) return; + int intValue = Integer.parseInt(value); + request.set(CaptureRequest.SENSOR_SENSITIVITY, intValue); + } + private void applyColorEffect(CaptureRequest.Builder request) { String value = mSettingsManager.getValue(SettingsManager.KEY_COLOR_EFFECT); if (value == null) return; diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java index 0060f2c8b..c26d90eea 100644 --- a/src/com/android/camera/CaptureUI.java +++ b/src/com/android/camera/CaptureUI.java @@ -88,6 +88,8 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, SettingsManager.KEY_PICTURE_SIZE, SettingsManager.KEY_JPEG_QUALITY, SettingsManager.KEY_CAMERA_SAVEPATH, + SettingsManager.KEY_ISO, + SettingsManager.KEY_EXPOSURE, SettingsManager.KEY_WHITE_BALANCE, SettingsManager.KEY_CAMERA2, SettingsManager.KEY_DUAL_CAMERA, @@ -99,6 +101,8 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, SettingsManager.KEY_PICTURE_SIZE, SettingsManager.KEY_JPEG_QUALITY, SettingsManager.KEY_CAMERA_SAVEPATH, + SettingsManager.KEY_ISO, + SettingsManager.KEY_EXPOSURE, SettingsManager.KEY_WHITE_BALANCE, SettingsManager.KEY_CAMERA2, SettingsManager.KEY_DUAL_CAMERA, diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java index 09bee5e66..a79b642b5 100644 --- a/src/com/android/camera/SettingsManager.java +++ b/src/com/android/camera/SettingsManager.java @@ -37,12 +37,15 @@ import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; import android.hardware.camera2.params.StreamConfigurationMap; import android.util.Log; +import android.util.Range; +import android.util.Rational; import android.util.Size; import com.android.camera.ui.ListMenu; import org.codeaurora.snapcam.R; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -350,6 +353,8 @@ public class SettingsManager implements ListMenu.SettingsListener { ListPreference sceneMode = mPreferenceGroup.findPreference(KEY_SCENE_MODE); ListPreference cameraIdPref = mPreferenceGroup.findPreference(KEY_CAMERA_ID); ListPreference pictureSize = mPreferenceGroup.findPreference(KEY_PICTURE_SIZE); + ListPreference exposure = mPreferenceGroup.findPreference(KEY_EXPOSURE); + ListPreference iso = mPreferenceGroup.findPreference(KEY_ISO); if (whiteBalance != null) { CameraSettings.filterUnsupportedOptions(mPreferenceGroup, @@ -376,6 +381,52 @@ public class SettingsManager implements ListMenu.SettingsListener { CameraSettings.filterUnsupportedOptions(mPreferenceGroup, pictureSize, getSupportedPictureSize(cameraId)); } + + if (exposure != null) buildExposureCompensation(cameraId); + + if (iso != null) { + CameraSettings.filterUnsupportedOptions(mPreferenceGroup, + iso, getSupportedIso(cameraId)); + } + } + + private void buildExposureCompensation(int cameraId) { + Range<Integer> range = mCharacteristics.get(cameraId).get(CameraCharacteristics + .CONTROL_AE_COMPENSATION_RANGE); + int max = range.getUpper(); + int min = range.getLower(); + if (min == 0 && max == 0) { + removePreference(mPreferenceGroup, KEY_EXPOSURE); + return; + } + ListPreference pref = mPreferenceGroup.findPreference(KEY_EXPOSURE); + Rational rational = mCharacteristics.get(cameraId).get(CameraCharacteristics + .CONTROL_AE_COMPENSATION_STEP); + double step = rational.doubleValue(); + int increment = 1; + while ((max - min) / increment > 10) { + increment++; + } + int start = min; + if (start < 0) { + while (Math.abs(start) % increment != 0) { + start++; + } + } + int size = 0; + for (int i = start; i <= max; i += increment) size++; + CharSequence entries[] = new CharSequence[size]; + CharSequence entryValues[] = new CharSequence[size]; + int count = 0; + for (int i = start; i <= max; i += increment, count++) { + entryValues[count] = Integer.toString(i); + StringBuilder builder = new StringBuilder(); + if (i > 0) builder.append('+'); + DecimalFormat format = new DecimalFormat("#.##"); + entries[count] = builder.append(format.format(i * step)).toString(); + } + pref.setEntries(entries); + pref.setEntryValues(entryValues); } private void buildCameraId() { @@ -512,6 +563,22 @@ public class SettingsManager implements ListMenu.SettingsListener { return modes; } + private List<String> getSupportedIso(int cameraId) { + Range<Integer> range = mCharacteristics.get(cameraId).get(CameraCharacteristics + .SENSOR_INFO_SENSITIVITY_RANGE); + int max = range.getUpper(); + int value = 50; + List<String> supportedIso = new ArrayList<>(); + supportedIso.add("auto"); + while (value <= max) { + if (range.contains(value)) { + supportedIso.add("" + value); + } + value += 50; + } + return supportedIso; + } + public interface Listener { void onSettingsChanged(List<SettingState> settings); } |