From bf809d3a0e1039c95a186597a22c012db786709b Mon Sep 17 00:00:00 2001 From: Sai Kumar Sanagavarapu Date: Wed, 1 Oct 2014 20:44:47 +0530 Subject: SnapdragonCamera: Add support for manual 3A params. Add UI support to take inputs from user for the following 3A paramters 1. Manual focus : a. Scale mode 0-100 b. Diopter mode 0-10 2.White balance: a. CCT b. RGB gains 3. Exposure control a. ISO b. exposure time Change-Id: I92ea3719fa2224e02943bb2191987c7654aaf9ea --- res/values/arrays.xml | 2 +- res/values/qcomarrays.xml | 39 ++ res/values/qcomstrings.xml | 35 ++ res/values/strings.xml | 2 +- res/xml/camera_preferences.xml | 21 + src/com/android/camera/CameraSettings.java | 87 ++++ src/com/android/camera/PhotoMenu.java | 8 +- src/com/android/camera/PhotoModule.java | 610 +++++++++++++++++++++++++++-- 8 files changed, 777 insertions(+), 27 deletions(-) mode change 100755 => 100644 res/values/arrays.xml mode change 100755 => 100644 res/values/strings.xml diff --git a/res/values/arrays.xml b/res/values/arrays.xml old mode 100755 new mode 100644 index d1baeaeb5..fce180df2 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -19,7 +19,7 @@ @string/pref_video_quality_entry_4kdci - @string/pref_video_quality_entry_2160p + @string/pref_video_quality_entry_2160p @string/pref_video_quality_entry_1080p @string/pref_video_quality_entry_720p @string/pref_video_quality_entry_480p diff --git a/res/values/qcomarrays.xml b/res/values/qcomarrays.xml index 9b71634a2..0b1037e72 100644 --- a/res/values/qcomarrays.xml +++ b/res/values/qcomarrays.xml @@ -559,6 +559,45 @@ @string/pref_camera_selectablezoneaf_value_frameaverage + + + @string/pref_camera_manual_exp_entry_ISO_priority + @string/pref_camera_manual_exp_entry_exptime_priority + @string/pref_camera_manual_exp_entry_user_setting + @string/pref_camera_manual_exp_entry_off + + + + @string/pref_camera_manual_exp_value_ISO_priority + @string/pref_camera_manual_exp_value_exptime_priority + @string/pref_camera_manual_exp_value_user_setting + @string/pref_camera_manual_exp_value_off + + + + @string/pref_camera_manual_wb_entry_color_temperature + @string/pref_camera_manual_wb_entry_rbgb_gains + @string/pref_camera_manual_wb_entry_off + + + + @string/pref_camera_manual_wb_value_color_temperature + @string/pref_camera_manual_wb_value_rbgb_gains + @string/pref_camera_manual_wb_value_off + + + + @string/pref_camera_manual_focus_entry_scale_mode + @string/pref_camera_manual_focus_entry_diopter_mode + @string/pref_camera_manual_focus_entry_off + + + + @string/pref_camera_manual_focus_value_scale_mode + @string/pref_camera_manual_focus_value_diopter_mode + @string/pref_camera_manual_focus_value_off + + @string/pref_camera_zsl_entry_off diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml index 93a39003d..c72f9bb1e 100644 --- a/res/values/qcomstrings.xml +++ b/res/values/qcomstrings.xml @@ -166,6 +166,41 @@ true-portrait-off multi-touch-focus-off + + Manual Exposure + ISO priority + Exposure time priority + User setting + Off + + off + iso-priority + exp-time-priority + user-setting + off + + + Manual White balance + Color temperature + RBGB gains + Off + + off + color-temperature + rbgb-gains + off + + + Manual Focus + Scale mode + Diopter mode + Off + + off + scale-mode + diopter-mode + off + Off On diff --git a/res/values/strings.xml b/res/values/strings.xml old mode 100755 new mode 100644 index d597e5af0..2d3aee027 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -244,7 +244,7 @@ Videos will be recorded in 4k DCI quality. [CHAR LIMIT=24] --> 4k DCI - 4k UHD diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml index 4052b9634..39c54daa7 100644 --- a/res/xml/camera_preferences.xml +++ b/res/xml/camera_preferences.xml @@ -282,4 +282,25 @@ camera:title="@string/pref_camera_hdr_need_1x_title" camera:entries="@array/pref_camera_hdr_need_1x_entries" camera:entryValues="@array/pref_camera_hdr_need_1x_entryvalues" /> + + + + + + diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index 4c2a20651..356869b9b 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -184,6 +184,50 @@ public class CameraSettings { private static final String VIDEO_QUALITY_YOUTUBE = "youtube"; + //manual 3A keys and parameter strings + public static final String KEY_MANUAL_EXPOSURE = "pref_camera_manual_exp_key"; + public static final String KEY_MANUAL_WB = "pref_camera_manual_wb_key"; + public static final String KEY_MANUAL_FOCUS = "pref_camera_manual_focus_key"; + + public static final String KEY_MANUAL_EXPOSURE_MODES = "manual-exp-modes"; + public static final String KEY_MANUAL_WB_MODES = "manual-wb-modes"; + public static final String KEY_MANUAL_FOCUS_MODES = "manual-focus-modes"; + //manual exposure + public static final String KEY_MIN_EXPOSURE_TIME = "min-exposure-time"; + public static final String KEY_MAX_EXPOSURE_TIME = "max-exposure-time"; + public static final String KEY_EXPOSURE_TIME = "exposure-time"; + public static final String KEY_MIN_ISO = "min-iso"; + public static final String KEY_MAX_ISO = "max-iso"; + public static final String KEY_CONTINUOUS_ISO = "continuous-iso"; + public static final String KEY_MANUAL_ISO = "manual"; + public static final String KEY_CURRENT_ISO = "cur-iso"; + public static final String KEY_CURRENT_EXPOSURE_TIME = "cur-exposure-time"; + + //manual WB + public static final String KEY_MIN_WB_GAIN = "min-wb-gain"; + public static final String KEY_MAX_WB_GAIN = "max-wb-gain"; + public static final String KEY_MANUAL_WB_GAINS = "manual-wb-gains"; + public static final String KEY_MIN_WB_CCT = "min-wb-cct"; + public static final String KEY_MAX_WB_CCT = "max-wb-cct"; + public static final String KEY_MANUAL_WB_CCT = "wb-manual-cct"; + public static final String KEY_MANUAL_WHITE_BALANCE = "manual"; + public static final String KEY_MANUAL_WB_TYPE = "manual-wb-type"; + public static final String KEY_MANUAL_WB_VALUE = "manual-wb-value"; + + //manual focus + public static final String KEY_MIN_FOCUS_SCALE = "min-focus-pos-ratio"; + public static final String KEY_MAX_FOCUS_SCALE = "max-focus-pos-ratio"; + public static final String KEY_MIN_FOCUS_DIOPTER = "min-focus-pos-diopter"; + public static final String KEY_MAX_FOCUS_DIOPTER = "max-focus-pos-diopter"; + public static final String KEY_MANUAL_FOCUS_TYPE = "manual-focus-pos-type"; + public static final String KEY_MANUAL_FOCUS_POSITION = "manual-focus-position"; + public static final String KEY_MANUAL_FOCUS_SCALE = "cur-focus-scale"; + public static final String KEY_MANUAL_FOCUS_DIOPTER = "cur-focus-diopter"; + + public static final String KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES = "manual-focus-modes"; + public static final String KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES = "manual-exposure-modes"; + public static final String KEY_QC_SUPPORTED_MANUAL_WB_MODES = "manual-wb-modes"; + public static final String EXPOSURE_DEFAULT_VALUE = "0"; public static final int CURRENT_VERSION = 5; @@ -511,6 +555,9 @@ public class CameraSettings { ListPreference video_cds_mode = group.findPreference(KEY_VIDEO_CDS_MODE); ListPreference tnr_mode = group.findPreference(KEY_TNR_MODE); ListPreference video_tnr_mode = group.findPreference(KEY_VIDEO_TNR_MODE); + ListPreference manualFocus = group.findPreference(KEY_MANUAL_FOCUS); + ListPreference manualExposure = group.findPreference(KEY_MANUAL_EXPOSURE); + ListPreference manualWB = group.findPreference(KEY_MANUAL_WB); if (hdr_need_1x != null) { filterUnsupportedOptions(group, @@ -633,6 +680,21 @@ public class CameraSettings { filterUnsupportedOptions(group, videoRotation, mParameters.getSupportedVideoRotationValues()); } + + if (manualFocus != null) { + filterUnsupportedOptions(group, + manualFocus, getSupportedManualFocusModes(mParameters)); + } + + if (manualWB != null) { + filterUnsupportedOptions(group, + manualWB, getSupportedManualWBModes(mParameters)); + } + + if (manualExposure != null) { + filterUnsupportedOptions(group, + manualExposure, getSupportedManualExposureModes(mParameters)); + } } private void initPreference(PreferenceGroup group) { @@ -1130,4 +1192,29 @@ public class CameraSettings { } return ret; } + + public static List getSupportedManualExposureModes(Parameters params) { + String str = params.get(KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES); + if (str == null) { + return null; + } + return split(str); + } + + public static List getSupportedManualFocusModes(Parameters params) { + String str = params.get(KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES); + if (str == null) { + return null; + } + return split(str); + } + + public static List getSupportedManualWBModes(Parameters params) { + String str = params.get(KEY_QC_SUPPORTED_MANUAL_WB_MODES); + if (str == null) { + return null; + } + return split(str); + } + } diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java index 0d4643bf7..629d91526 100644 --- a/src/com/android/camera/PhotoMenu.java +++ b/src/com/android/camera/PhotoMenu.java @@ -137,7 +137,10 @@ public class PhotoMenu extends PieController CameraSettings.KEY_FLASH_MODE, CameraSettings.KEY_FOCUS_MODE, CameraSettings.KEY_REDEYE_REDUCTION, - CameraSettings.KEY_AE_BRACKET_HDR + CameraSettings.KEY_AE_BRACKET_HDR, + CameraSettings.KEY_MANUAL_EXPOSURE, + CameraSettings.KEY_MANUAL_WB, + CameraSettings.KEY_MANUAL_FOCUS }; PieItem item1 = makeItem(R.drawable.ic_settings_holo_light_01); @@ -314,6 +317,9 @@ public class PhotoMenu extends PieController } if ((zsl != null) && Parameters.ZSL_ON.equals(zsl)) { popup3.setPreferenceEnabled(CameraSettings.KEY_FOCUS_MODE,false); + popup3.setPreferenceEnabled(CameraSettings.KEY_MANUAL_EXPOSURE,false); + popup3.setPreferenceEnabled(CameraSettings.KEY_MANUAL_WB,false); + popup3.setPreferenceEnabled(CameraSettings.KEY_MANUAL_FOCUS,false); } if ((faceDetection != null) && !Parameters.FACE_DETECTION_ON.equals(faceDetection)){ popup2.setPreferenceEnabled(CameraSettings.KEY_FACE_RECOGNITION,false); diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 32b6a941e..f2b19644e 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -76,6 +76,11 @@ import com.android.camera.util.GcamHelper; import com.android.camera.util.UsageStatistics; import org.codeaurora.snapcam.R; +import android.widget.EditText; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.text.InputType; + import com.android.internal.util.MemInfoReader; import android.app.ActivityManager; @@ -344,6 +349,11 @@ public class PhotoModule // True if all the parameters needed to start preview is ready. private boolean mCameraPreviewParamsReady = false; + private int mManual3AEnabled = 0; + private static final int MANUAL_FOCUS = 1; + private static final int MANUAL_WB = 2; + private static final int MANUAL_EXPOSURE = 4; + private MediaSaveService.OnMediaSavedListener mOnMediaSavedListener = new MediaSaveService.OnMediaSavedListener() { @Override @@ -688,6 +698,7 @@ public class PhotoModule } updateCameraSettings(); showTapToFocusToastIfNeeded(); + resetManual3ASettings(); } @Override @@ -710,6 +721,37 @@ public class PhotoModule } } + private void resetManual3ASettings() { + String manualExposureDefault = mActivity.getString( + R.string.pref_camera_manual_exp_default); + String manualExposureMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_EXPOSURE, manualExposureDefault); + if (!manualExposureMode.equals(manualExposureDefault)) { + mUI.setPreference( + CameraSettings.KEY_MANUAL_EXPOSURE, manualExposureDefault); + UpdateManualExposureSettings(); + } + String manualFocusDefault = mActivity.getString( + R.string.pref_camera_manual_focus_default); + String manualFocusMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_FOCUS, manualFocusDefault); + if (!manualFocusMode.equals(manualFocusDefault)) { + mUI.setPreference( + CameraSettings.KEY_MANUAL_FOCUS, manualFocusDefault); + UpdateManualFocusSettings(); + } + String manualWBDefault = mActivity.getString( + R.string.pref_camera_manual_wb_default); + String manualWBMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_WB, manualWBDefault); + if (!manualWBMode.equals(manualWBDefault)) { + mUI.setPreference( + CameraSettings.KEY_MANUAL_WB, manualWBDefault); + UpdateManualWBSettings(); + } + mManual3AEnabled = 0; + } + void setPreviewFrameLayoutCameraOrientation(){ CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId]; //if camera mount angle is 0 or 180, we want to resize preview @@ -1556,6 +1598,60 @@ public class PhotoModule } } + private void updateCommonManual3ASettings() { + String touchAfAec = mParameters.TOUCH_AF_AEC_OFF; + mSceneMode = Parameters.SCENE_MODE_AUTO; + String flashMode = Parameters.FLASH_MODE_OFF; + String redeyeReduction = mActivity.getString(R.string. + pref_camera_redeyereduction_entry_disable); + String aeBracketing = mActivity.getString(R.string. + pref_camera_ae_bracket_hdr_entry_off); + String colorEffect = mActivity.getString(R.string. + pref_camera_coloreffect_default); + String exposureCompensation = CameraSettings.EXPOSURE_DEFAULT_VALUE; + + if (mManual3AEnabled > 0) { + overrideCameraSettings(flashMode, null, null, + exposureCompensation, touchAfAec, + mParameters.getAutoExposure(), + Integer.toString(mParameters.getSaturation()), + Integer.toString(mParameters.getContrast()), + Integer.toString(mParameters.getSharpness()), + colorEffect, + mSceneMode, redeyeReduction, aeBracketing); + mUI.overrideSettings(CameraSettings.KEY_LONGSHOT, + mActivity.getString(R.string.setting_off_value)); + } else { + //enable all + touchAfAec = mActivity.getString( + R.string.pref_camera_touchafaec_default); + overrideCameraSettings(null, null, null, + null, touchAfAec, null, + null, null, null, null, + null, null, null); + mUI.overrideSettings(CameraSettings.KEY_LONGSHOT, null); + } + + String isoMode = mParameters.getISOValue(); + final String isoManual = CameraSettings.KEY_MANUAL_ISO; + if (isoMode.equals(isoManual)) { + final String isoPref = mPreferences.getString( + CameraSettings.KEY_ISO, + mActivity.getString(R.string.pref_camera_iso_default)); + mUI.overrideSettings(CameraSettings.KEY_ISO, isoPref); + } + if ((mManual3AEnabled & MANUAL_WB) != 0) { + String whiteBalance = mPreferences.getString( + CameraSettings.KEY_WHITE_BALANCE, + mActivity.getString(R.string.pref_camera_whitebalance_default)); + mUI.overrideSettings(CameraSettings.KEY_WHITE_BALANCE, whiteBalance); + } + if ((mManual3AEnabled & MANUAL_FOCUS) != 0) { + mUI.overrideSettings(CameraSettings.KEY_FOCUS_MODE, + mFocusManager.getFocusMode()); + } + } + private void updateCameraSettings() { String sceneMode = null; String flashMode = null; @@ -1597,6 +1693,11 @@ public class PhotoModule mParameters.get(CameraSettings.KEY_QC_MULTI_TOUCH_FOCUS); String continuousShot = mParameters.get("long-shot"); + + if (mManual3AEnabled > 0) { + disableLongShot = true; + } + if ((continuousShot != null) && continuousShot.equals(continuousShotOn)) { String pictureFormat = mActivity.getString(R.string. pref_camera_picture_format_value_jpeg); @@ -1670,10 +1771,14 @@ public class PhotoModule null, null, null, colorEffect, sceneMode, redeyeReduction, aeBracketing); } else { - overrideCameraSettings(flashMode, null, focusMode, - exposureCompensation, touchAfAec, null, - null, null, null, colorEffect, - sceneMode, redeyeReduction, aeBracketing); + if (mManual3AEnabled > 0) { + updateCommonManual3ASettings(); + } else { + overrideCameraSettings(flashMode, null, focusMode, + exposureCompensation, touchAfAec, null, + null, null, null, colorEffect, + sceneMode, redeyeReduction, aeBracketing); + } } /* Disable focus if aebracket is ON */ String aeBracket = mParameters.get(CameraSettings.KEY_QC_AE_BRACKETING); @@ -2176,6 +2281,7 @@ public class PhotoModule if (mCameraDevice != null && mCameraState != PREVIEW_STOPPED) { mCameraDevice.cancelAutoFocus(); } + resetManual3ASettings(); // If the camera has not been opened asynchronously yet, // and startPreview hasn't been called, then this is a no-op. // (e.g. onResume -> onPause -> onResume). @@ -2708,12 +2814,14 @@ public class PhotoModule mParameters.setRedeyeReductionMode(redeyeReduction); } // Set ISO parameter - String iso = mPreferences.getString( - CameraSettings.KEY_ISO, - mActivity.getString(R.string.pref_camera_iso_default)); - if (CameraUtil.isSupported(iso, + if ((mManual3AEnabled & MANUAL_EXPOSURE) == 0) { + String iso = mPreferences.getString( + CameraSettings.KEY_ISO, + mActivity.getString(R.string.pref_camera_iso_default)); + if (CameraUtil.isSupported(iso, mParameters.getSupportedIsoValues())) { mParameters.setISOValue(iso); + } } // Set color effect parameter. String colorEffect = mPreferences.getString( @@ -3004,8 +3112,10 @@ public class PhotoModule mSnapshotMode = CameraInfo.CAMERA_SUPPORT_MODE_NONZSL; mParameters.setCameraMode(0); mFocusManager.setZslEnable(false); - mFocusManager.overrideFocusMode(null); - mParameters.setFocusMode(mFocusManager.getFocusMode()); + if ((mManual3AEnabled & MANUAL_FOCUS) == 0) { + mFocusManager.overrideFocusMode(null); + mParameters.setFocusMode(mFocusManager.getFocusMode()); + } } // Set face detetction parameter. String faceDetection = mPreferences.getString( @@ -3153,8 +3263,10 @@ public class PhotoModule setMeteringAreasIfSupported(); // initialize focus mode - mFocusManager.overrideFocusMode(null); - mParameters.setFocusMode(mFocusManager.getFocusMode()); + if ((mManual3AEnabled & MANUAL_FOCUS) == 0) { + mFocusManager.overrideFocusMode(null); + mParameters.setFocusMode(mFocusManager.getFocusMode()); + } // Set picture size. String pictureSize = mPreferences.getString( @@ -3337,22 +3449,26 @@ public class PhotoModule } // Set white balance parameter. - String whiteBalance = mPreferences.getString( - CameraSettings.KEY_WHITE_BALANCE, - mActivity.getString(R.string.pref_camera_whitebalance_default)); - if (CameraUtil.isSupported(whiteBalance, - mParameters.getSupportedWhiteBalance())) { - mParameters.setWhiteBalance(whiteBalance); - } else { - whiteBalance = mParameters.getWhiteBalance(); - if (whiteBalance == null) { - whiteBalance = Parameters.WHITE_BALANCE_AUTO; + if ((mManual3AEnabled & MANUAL_WB) == 0) { + String whiteBalance = mPreferences.getString( + CameraSettings.KEY_WHITE_BALANCE, + mActivity.getString(R.string.pref_camera_whitebalance_default)); + if (CameraUtil.isSupported(whiteBalance, + mParameters.getSupportedWhiteBalance())) { + mParameters.setWhiteBalance(whiteBalance); + } else { + whiteBalance = mParameters.getWhiteBalance(); + if (whiteBalance == null) { + whiteBalance = Parameters.WHITE_BALANCE_AUTO; + } } } // Set focus mode. - mFocusManager.overrideFocusMode(null); - mParameters.setFocusMode(mFocusManager.getFocusMode()); + if ((mManual3AEnabled & MANUAL_FOCUS) == 0) { + mFocusManager.overrideFocusMode(null); + mParameters.setFocusMode(mFocusManager.getFocusMode()); + } } else { mFocusManager.overrideFocusMode(mParameters.getFocusMode()); if (hdrOn) @@ -3467,6 +3583,439 @@ public class PhotoModule } } + private void UpdateManualFocusSettings() { + //dismiss all popups first, because we need to show edit dialog + mUI.collapseCameraControls(); + final AlertDialog.Builder alert = new AlertDialog.Builder(mActivity); + LinearLayout linear = new LinearLayout(mActivity); + linear.setOrientation(1); + alert.setTitle("Manual Focus Settings"); + alert.setNegativeButton("Cancel",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + dialog.cancel(); + } + }); + final TextView focusPositionText = new TextView(mActivity); + String scaleMode = mActivity.getString( + R.string.pref_camera_manual_focus_value_scale_mode); + String diopterMode = mActivity.getString( + R.string.pref_camera_manual_focus_value_diopter_mode); + String manualFocusMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_FOCUS, + mActivity.getString(R.string.pref_camera_manual_focus_default)); + + Log.v(TAG, "manualFocusMode selected = " + manualFocusMode); + if (manualFocusMode.equals(scaleMode)) { + final SeekBar focusbar = new SeekBar(mActivity); + final int minFocusPos = mParameters.getInt(CameraSettings.KEY_MIN_FOCUS_SCALE); + final int maxFocusPos = mParameters.getInt(CameraSettings.KEY_MAX_FOCUS_SCALE); + //update mparameters to fetch latest focus position + mParameters = mCameraDevice.getParameters(); + final int CurFocusPos = mParameters.getInt(CameraSettings.KEY_MANUAL_FOCUS_SCALE); + focusbar.setProgress(CurFocusPos); + focusPositionText.setText("Current focus position is " + CurFocusPos); + + alert.setMessage("Enter focus position in the range of " + minFocusPos + + " to " + maxFocusPos); + + focusbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { + focusPositionText.setText("Current focus position is " + progress); + } + }); + linear.addView(focusbar); + linear.addView(focusPositionText); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + int focusPos = focusbar.getProgress(); + Log.v(TAG, "Setting focus position : " + focusPos); + mManual3AEnabled |= MANUAL_FOCUS; + mParameters.setFocusMode(Parameters.FOCUS_MODE_MANUAL_POSITION); + mParameters.set(CameraSettings.KEY_MANUAL_FOCUS_TYPE, 2); // 2 for scale mode + mParameters.set(CameraSettings.KEY_MANUAL_FOCUS_POSITION, focusPos); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } + }); + alert.show(); + } else if (manualFocusMode.equals(diopterMode)) { + String minFocusStr = mParameters.get(CameraSettings.KEY_MIN_FOCUS_DIOPTER); + String maxFocusStr = mParameters.get(CameraSettings.KEY_MAX_FOCUS_DIOPTER); + final double minFocusPos = Double.parseDouble(minFocusStr); + final double maxFocusPos = Double.parseDouble(maxFocusStr); + final EditText input = new EditText(mActivity); + int floatType = InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER; + input.setInputType(floatType); + alert.setMessage("Enter focus position in the range of " + minFocusPos + + " to " + maxFocusPos); + //update mparameters to fetch latest focus position + mParameters = mCameraDevice.getParameters(); + final String CurFocusPos = mParameters.get(CameraSettings.KEY_MANUAL_FOCUS_DIOPTER); + focusPositionText.setText("Current focus position is " + CurFocusPos); + linear.addView(input); + linear.addView(focusPositionText); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + double focuspos = 0; + String focusStr = input.getText().toString(); + if (focusStr.length() > 0) { + focuspos = Double.parseDouble(focusStr); + } else { + Toast.makeText(mActivity, "Invalid focus position", + Toast.LENGTH_SHORT).show(); + return; + } + if (focuspos >= minFocusPos && focuspos <= maxFocusPos) { + Log.v(TAG, "Setting focus position : " + focusStr); + mManual3AEnabled |= MANUAL_FOCUS; + mParameters.setFocusMode(Parameters.FOCUS_MODE_MANUAL_POSITION); + //focus type 3 is diopter mode + mParameters.set(CameraSettings.KEY_MANUAL_FOCUS_TYPE, 3); + mParameters.set(CameraSettings.KEY_MANUAL_FOCUS_POSITION, focusStr); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid focus position", + Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else { + mManual3AEnabled &= ~MANUAL_FOCUS; + mParameters.setFocusMode(mFocusManager.getFocusMode()); + mUI.overrideSettings(CameraSettings.KEY_FOCUS_MODE, null); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } + } + + private void UpdateManualWBSettings() { + //dismiss all popups first, because we need to show edit dialog + mUI.collapseCameraControls(); + final AlertDialog.Builder alert = new AlertDialog.Builder(mActivity); + LinearLayout linear = new LinearLayout(mActivity); + linear.setOrientation(1); + alert.setTitle("Manual White Balance Settings"); + alert.setNegativeButton("Cancel",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + dialog.cancel(); + } + }); + + String cctMode = mActivity.getString( + R.string.pref_camera_manual_wb_value_color_temperature); + String rgbGainMode = mActivity.getString( + R.string.pref_camera_manual_wb_value_rbgb_gains); + String manualWBMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_WB, + mActivity.getString(R.string.pref_camera_manual_wb_default)); + final String wbPref = mPreferences.getString( + CameraSettings.KEY_WHITE_BALANCE, + mActivity.getString(R.string.pref_camera_whitebalance_default)); + Log.v(TAG, "manualWBMode selected = " + manualWBMode); + if (manualWBMode.equals(cctMode)) { + final TextView CCTtext = new TextView(mActivity); + final EditText CCTinput = new EditText(mActivity); + CCTinput.setInputType(InputType.TYPE_CLASS_NUMBER); + final int minCCT = mParameters.getInt(CameraSettings.KEY_MIN_WB_CCT); + final int maxCCT = mParameters.getInt(CameraSettings.KEY_MAX_WB_CCT); + + //refresh camera parameters to get latest CCT value + mParameters = mCameraDevice.getParameters(); + String currentCCT = mParameters.get(CameraSettings.KEY_MANUAL_WB_CCT); + if (currentCCT != null) { + CCTtext.setText("Current CCT is " + currentCCT); + } + alert.setMessage("Enter CCT value in the range of " + minCCT+ " to " + maxCCT); + linear.addView(CCTinput); + linear.addView(CCTtext); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + int newCCT = -1; + String cct = CCTinput.getText().toString(); + if (cct.length() > 0) { + newCCT = Integer.parseInt(cct); + } + if (newCCT <= maxCCT && newCCT >= minCCT) { + mManual3AEnabled |= MANUAL_WB; + Log.v(TAG, "Setting CCT value : " + newCCT); + mParameters.setWhiteBalance(CameraSettings.KEY_MANUAL_WHITE_BALANCE); + //0 corresponds to manual CCT mode + mParameters.set(CameraSettings.KEY_MANUAL_WB_TYPE, 0); + mParameters.set(CameraSettings.KEY_MANUAL_WB_VALUE, newCCT); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid CCT", Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else if (manualWBMode.equals(rgbGainMode)) { + final TextView RGBtext = new TextView(mActivity); + final EditText Rinput = new EditText(mActivity); + Rinput.setHint("Enter R gain here"); + final EditText Ginput = new EditText(mActivity); + Ginput.setHint("Enter G gain here"); + final EditText Binput = new EditText(mActivity); + Binput.setHint("Enter B gain here"); + + int floatType = InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER; + Rinput.setInputType(floatType); + Ginput.setInputType(floatType); + Binput.setInputType(floatType); + + String minGainStr = mParameters.get(CameraSettings.KEY_MIN_WB_GAIN); + final double minGain = Double.parseDouble(minGainStr); + String maxGainStr = mParameters.get(CameraSettings.KEY_MAX_WB_GAIN); + final double maxGain = Double.parseDouble(maxGainStr); + + //refresh camera parameters to get latest WB gains + mParameters = mCameraDevice.getParameters(); + String currentGains = mParameters.get(CameraSettings.KEY_MANUAL_WB_GAINS); + if (currentGains != null) { + RGBtext.setText("Current RGB gains are " + currentGains); + } + + alert.setMessage("Enter RGB gains in the range of " + minGain + + " to " + maxGain); + linear.addView(Rinput); + linear.addView(Ginput); + linear.addView(Binput); + linear.addView(RGBtext); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + String Rgain = Rinput.getText().toString(); + String Ggain = Ginput.getText().toString(); + String Bgain = Binput.getText().toString(); + if (Rgain.length() > 0 && Ggain.length() > 0 && Bgain.length() > 0) { + double Rgainf = Double.parseDouble(Rgain); + double Ggainf = Double.parseDouble(Ggain); + double Bgainf = Double.parseDouble(Bgain); + String RGBGain = Rgain + "," + Ggain + "," + Bgain; + if (Rgainf <= maxGain && Rgainf >= minGain && + Ggainf <= maxGain && Ggainf >= minGain && + Bgainf <= maxGain && Bgainf >= minGain) { + Log.v(TAG, "Setting RGB gains : " + RGBGain); + mManual3AEnabled |= MANUAL_WB; + mParameters.setWhiteBalance(CameraSettings.KEY_MANUAL_WHITE_BALANCE); + // 1 corresponds to manual WB gain mode + mParameters.set(CameraSettings.KEY_MANUAL_WB_TYPE, 1); + mParameters.set(CameraSettings.KEY_MANUAL_WB_VALUE, RGBGain); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid RGB gains", + Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText(mActivity, "Invalid RGB gains", + Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else { + //reset white balance + mManual3AEnabled &= ~MANUAL_WB; + mUI.overrideSettings(CameraSettings.KEY_WHITE_BALANCE, null); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } + } + + private void UpdateManualExposureSettings() { + //dismiss all popups first, because we need to show edit dialog + mUI.collapseCameraControls(); + final AlertDialog.Builder alert = new AlertDialog.Builder(mActivity); + LinearLayout linear = new LinearLayout(mActivity); + linear.setOrientation(1); + final TextView ISOtext = new TextView(mActivity); + final EditText ISOinput = new EditText(mActivity); + final TextView ExpTimeText = new TextView(mActivity); + final EditText ExpTimeInput = new EditText(mActivity); + ISOinput.setInputType(InputType.TYPE_CLASS_NUMBER); + int floatType = InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER; + ExpTimeInput.setInputType(floatType); + alert.setTitle("Manual Exposure Settings"); + alert.setNegativeButton("Cancel",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + dialog.cancel(); + } + }); + + mParameters = mCameraDevice.getParameters(); + final int minISO = mParameters.getInt(CameraSettings.KEY_MIN_ISO); + final int maxISO = mParameters.getInt(CameraSettings.KEY_MAX_ISO); + String isoMode = mParameters.getISOValue(); + final String isoManual = CameraSettings.KEY_MANUAL_ISO; + String currentISO = mParameters.get(CameraSettings.KEY_CURRENT_ISO); + if (currentISO != null) { + ISOtext.setText("Current ISO is " + currentISO); + } + + final String minExpTime = mParameters.get(CameraSettings.KEY_MIN_EXPOSURE_TIME); + final String maxExpTime = mParameters.get(CameraSettings.KEY_MAX_EXPOSURE_TIME); + String currentExpTime = mParameters.get(CameraSettings.KEY_CURRENT_EXPOSURE_TIME); + if (currentExpTime != null) { + ExpTimeText.setText("Current exposure time is " + currentExpTime); + } + + String isoPriority = mActivity.getString( + R.string.pref_camera_manual_exp_value_ISO_priority); + String expTimePriority = mActivity.getString( + R.string.pref_camera_manual_exp_value_exptime_priority); + String userSetting = mActivity.getString( + R.string.pref_camera_manual_exp_value_user_setting); + String manualExposureMode = mPreferences.getString( + CameraSettings.KEY_MANUAL_EXPOSURE, + mActivity.getString(R.string.pref_camera_manual_exp_default)); + Log.v(TAG, "manual Exposure Mode selected = " + manualExposureMode); + if (manualExposureMode.equals(isoPriority)) { + alert.setMessage("Enter ISO in the range of " + minISO + " to " + maxISO); + linear.addView(ISOinput); + linear.addView(ISOtext); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + int newISO = -1; + String iso = ISOinput.getText().toString(); + Log.v(TAG, "string iso length " + iso.length()); + if (iso.length() > 0) { + newISO = Integer.parseInt(iso); + } + if (newISO <= maxISO && newISO >= minISO) { + Log.v(TAG, "Setting ISO : " + newISO); + mManual3AEnabled |= MANUAL_EXPOSURE; + mParameters.setISOValue(isoManual); + mParameters.set(CameraSettings.KEY_CONTINUOUS_ISO, newISO); + mParameters.set(CameraSettings.KEY_EXPOSURE_TIME, "0"); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid ISO", Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else if (manualExposureMode.equals(expTimePriority)) { + alert.setMessage("Enter exposure time in the range of " + minExpTime + + "ms to " + maxExpTime + "ms"); + linear.addView(ExpTimeInput); + linear.addView(ExpTimeText); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + double newExpTime = -1; + String expTime = ExpTimeInput.getText().toString(); + if (expTime.length() > 0) { + newExpTime = Double.parseDouble(expTime); + } + if (newExpTime <= Double.parseDouble(maxExpTime) && + newExpTime >= Double.parseDouble(minExpTime)) { + Log.v(TAG, "Setting Exposure time : " + newExpTime); + mManual3AEnabled |= MANUAL_EXPOSURE; + mParameters.set(CameraSettings.KEY_EXPOSURE_TIME, expTime); + mParameters.setISOValue(Parameters.ISO_AUTO); + mUI.setPreference(CameraSettings.KEY_ISO, Parameters.ISO_AUTO); + mUI.overrideSettings(CameraSettings.KEY_ISO, null); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid exposure time", + Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else if (manualExposureMode.equals(userSetting)) { + alert.setMessage("Full manual mode - Enter both ISO and Exposure Time"); + final TextView ISORangeText = new TextView(mActivity); + final TextView ExpTimeRangeText = new TextView(mActivity); + ISORangeText.setText("Enter ISO in the range of " + minISO + " to " + maxISO); + ExpTimeRangeText.setText("Enter exposure time in the range of " + minExpTime + + "ms to " + maxExpTime + "ms"); + linear.addView(ISORangeText); + linear.addView(ISOinput); + linear.addView(ISOtext); + linear.addView(ExpTimeRangeText); + linear.addView(ExpTimeInput); + linear.addView(ExpTimeText); + alert.setView(linear); + alert.setPositiveButton("Ok",new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog,int id) + { + int newISO = -1; + String iso = ISOinput.getText().toString(); + Log.v(TAG, "string iso length " + iso.length()); + if (iso.length() > 0) { + newISO = Integer.parseInt(iso); + } + double newExpTime = -1; + String expTime = ExpTimeInput.getText().toString(); + if (expTime.length() > 0) { + newExpTime = Double.parseDouble(expTime); + } + if (newISO <= maxISO && newISO >= minISO && + newExpTime <= Double.parseDouble(maxExpTime) && + newExpTime >= Double.parseDouble(minExpTime)) { + mManual3AEnabled |= MANUAL_EXPOSURE; + Log.v(TAG, "Setting ISO : " + newISO); + mParameters.setISOValue(isoManual); + mParameters.set(CameraSettings.KEY_CONTINUOUS_ISO, newISO); + Log.v(TAG, "Setting Exposure time : " + newExpTime); + mParameters.set(CameraSettings.KEY_EXPOSURE_TIME, expTime); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } else { + Toast.makeText(mActivity, "Invalid input", Toast.LENGTH_SHORT).show(); + } + } + }); + alert.show(); + } else { + mManual3AEnabled &= ~MANUAL_EXPOSURE; + //auto exposure mode - reset both exposure time and ISO + mParameters.set(CameraSettings.KEY_EXPOSURE_TIME, "0"); + mUI.overrideSettings(CameraSettings.KEY_ISO, null); + updateCommonManual3ASettings(); + onSharedPreferenceChanged(); + } + } + // Return true if the preference has the specified key but not the value. private static boolean notSame(ListPreference pref, String key, String value) { return (key.equals(pref.getKey()) && !value.equals(pref.getValue())); @@ -3487,6 +4036,19 @@ public class PhotoModule } } + if(CameraSettings.KEY_MANUAL_EXPOSURE.equals(pref.getKey())) { + UpdateManualExposureSettings(); + return; + } + if (CameraSettings.KEY_MANUAL_WB.equals(pref.getKey())) { + UpdateManualWBSettings(); + return; + } + if (CameraSettings.KEY_MANUAL_FOCUS.equals(pref.getKey())) { + UpdateManualFocusSettings(); + return; + } + //call generic onSharedPreferenceChanged onSharedPreferenceChanged(); } -- cgit v1.2.3