SnapdragonCamera: Add support for CDS and TNR settings

Add support for CDS and TNR settings

- CDS and TNR can be controlled in
  photo mode and video mode.
- CDS is set to off and cannot be
  set to other value when TNR is enabled
- CDS value is restored when TNR is disabled again

CRs-Fixed: 715042
Change-Id: Idf08403e38d0e3e634b047a955f2328b4237e691
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 1232d09..2859d1a 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -93,6 +93,10 @@
     public static final String KEY_HISTOGRAM = "pref_camera_histogram_key";
     public static final String KEY_DENOISE = "pref_camera_denoise_key";
     public static final String KEY_REDEYE_REDUCTION = "pref_camera_redeyereduction_key";
+    public static final String KEY_CDS_MODE = "pref_camera_cds_mode_key";
+    public static final String KEY_VIDEO_CDS_MODE = "pref_camera_video_cds_mode_key";
+    public static final String KEY_TNR_MODE = "pref_camera_tnr_mode_key";
+    public static final String KEY_VIDEO_TNR_MODE = "pref_camera_video_tnr_mode_key";
     public static final String KEY_AE_BRACKET_HDR = "pref_camera_ae_bracket_hdr_key";
     public static final String KEY_ADVANCED_FEATURES = "pref_camera_advanced_features_key";
     public static final String KEY_HDR_MODE = "pref_camera_hdr_mode_key";
@@ -117,6 +121,10 @@
     private static final String KEY_QC_SUPPORTED_OZ_MODES = "opti-zoom-values";
     private static final String KEY_QC_SUPPORTED_FACE_RECOGNITION_MODES = "face-recognition-values";
     private static final String KEY_QC_SUPPORTED_DIS_MODES = "dis-values";
+    private static final String KEY_QC_SUPPORTED_CDS_MODES = "cds-mode-values";
+    private static final String KEY_QC_SUPPORTED_VIDEO_CDS_MODES = "video-cds-mode-values";
+    private static final String KEY_QC_SUPPORTED_TNR_MODES = "tnr-mode-values";
+    private static final String KEY_QC_SUPPORTED_VIDEO_TNR_MODES = "video-tnr-mode-values";
     private static final String KEY_SNAPCAM_SUPPORTED_HDR_MODES = "hdr-mode-values";
     private static final String KEY_SNAPCAM_SUPPORTED_HDR_NEED_1X = "hdr-need-1x-values";
     public static final String KEY_QC_AE_BRACKETING = "ae-bracket-hdr";
@@ -128,6 +136,10 @@
     public static final String KEY_QC_OPTI_ZOOM = "opti-zoom";
     public static final String KEY_QC_FACE_RECOGNITION = "face-recognition";
     public static final String KEY_QC_DIS_MODE = "dis";
+    public static final String KEY_QC_CDS_MODE = "cds-mode";
+    public static final String KEY_QC_VIDEO_CDS_MODE = "video-cds-mode";
+    public static final String KEY_QC_TNR_MODE = "tnr-mode";
+    public static final String KEY_QC_VIDEO_TNR_MODE = "video-tnr-mode";
     public static final String KEY_SNAPCAM_HDR_MODE = "hdr-mode";
     public static final String KEY_SNAPCAM_HDR_NEED_1X = "hdr-need-1x";
     public static final String KEY_VIDEO_HSR = "video-hsr";
@@ -276,6 +288,38 @@
         return split(str);
     }
 
+    public static List<String> getSupportedCDSModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_CDS_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    public static List<String> getSupportedVideoCDSModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_VIDEO_CDS_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    public static List<String> getSupportedTNRModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_TNR_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
+    public static List<String> getSupportedVideoTNRModes(Parameters params) {
+        String str = params.get(KEY_QC_SUPPORTED_VIDEO_TNR_MODES);
+        if (str == null) {
+            return null;
+        }
+        return split(str);
+    }
+
     public static List<String> getSupportedHDRModes(Parameters params) {
         String str = params.get(KEY_SNAPCAM_SUPPORTED_HDR_MODES);
         if (str == null) {
@@ -392,6 +436,10 @@
         ListPreference auto_hdr = group.findPreference(KEY_AUTO_HDR);
         ListPreference hdr_mode = group.findPreference(KEY_HDR_MODE);
         ListPreference hdr_need_1x = group.findPreference(KEY_HDR_NEED_1X);
+        ListPreference cds_mode = group.findPreference(KEY_CDS_MODE);
+        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);
 
         if (hdr_need_1x != null) {
             filterUnsupportedOptions(group,
@@ -402,6 +450,27 @@
             filterUnsupportedOptions(group,
                     hdr_mode, getSupportedHDRModes(mParameters));
         }
+
+        if (cds_mode != null) {
+            filterUnsupportedOptions(group,
+                    cds_mode, getSupportedCDSModes(mParameters));
+        }
+
+        if (video_cds_mode != null) {
+            filterUnsupportedOptions(group,
+                    video_cds_mode, getSupportedVideoCDSModes(mParameters));
+        }
+
+        if (tnr_mode != null) {
+            filterUnsupportedOptions(group,
+                    tnr_mode, getSupportedTNRModes(mParameters));
+        }
+
+        if (video_tnr_mode != null) {
+            filterUnsupportedOptions(group,
+                    video_tnr_mode, getSupportedVideoTNRModes(mParameters));
+        }
+
         ListPreference videoRotation = group.findPreference(KEY_VIDEO_ROTATION);
 
         if (touchAfAec != null) {
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 78ab98c..c4e8f83 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -60,6 +60,9 @@
     private int popupNum = 0;
     private PieItem mHdrItem = null;
     private PieItem mHdrPlusItem = null;
+    private String mPrevSavedCDS;
+    private boolean mIsTNREnabled = false;
+    private boolean mIsCDSUpdated = false;
 
     public PhotoMenu(CameraActivity activity, PhotoUI ui, PieRenderer pie) {
         super(activity, pie);
@@ -106,7 +109,9 @@
                 CameraSettings.KEY_LONGSHOT,
                 CameraSettings.KEY_AUTO_HDR,
                 CameraSettings.KEY_HDR_MODE,
-                CameraSettings.KEY_HDR_NEED_1X
+                CameraSettings.KEY_HDR_NEED_1X,
+                CameraSettings.KEY_CDS_MODE,
+                CameraSettings.KEY_TNR_MODE
         };
 
         mOtherKeys2 = new String[] {
@@ -213,10 +218,43 @@
         onSettingChanged(pref);
     }
 
-   @Override
+    @Override
     public void overrideSettings(final String ... keyvalues) {
+        if (mPopup1 != null) {
+            ListPreference pref_tnr = mPreferenceGroup.findPreference(CameraSettings.KEY_TNR_MODE);
+            ListPreference pref_cds = mPreferenceGroup.findPreference(CameraSettings.KEY_CDS_MODE);
+
+            String tnr = (pref_tnr != null) ? pref_tnr.getValue() : null;
+            String cds = (pref_cds != null) ? pref_cds.getValue() : null;
+
+            if (mPrevSavedCDS == null && cds != null) {
+                mPrevSavedCDS = cds;
+            }
+
+            if ((tnr != null) && !mActivity.getString(R.string.
+                    pref_camera_tnr_default).equals(tnr)) {
+                mPopup1.setPreferenceEnabled(CameraSettings.KEY_CDS_MODE, false);
+                mPopup1.overrideSettings(CameraSettings.KEY_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_cds_value_off));
+                mIsTNREnabled = true;
+                if (!mIsCDSUpdated) {
+                    if (cds != null) {
+                        mPrevSavedCDS = cds;
+                    }
+                    mIsCDSUpdated = true;
+                }
+            } else if (tnr != null) {
+                mPopup1.setPreferenceEnabled(CameraSettings.KEY_CDS_MODE, true);
+                if (mIsTNREnabled && mPrevSavedCDS != cds) {
+                    mPopup1.overrideSettings(CameraSettings.KEY_CDS_MODE, mPrevSavedCDS);
+                    mIsTNREnabled = false;
+                    mIsCDSUpdated = false;
+                }
+            }
+        }
+
         super.overrideSettings(keyvalues);
-       if ((mPopup1 == null) &&  (mPopup2 == null)  &&  (mPopup3 == null)) initializePopup();
+        if ((mPopup1 == null) &&  (mPopup2 == null)  &&  (mPopup3 == null)) initializePopup();
         mPopup1.overrideSettings(keyvalues);
         mPopup2.overrideSettings(keyvalues);
         mPopup3.overrideSettings(keyvalues);
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index b81e96f..8f1fa89 100755
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -190,6 +190,8 @@
     // The degrees of the device rotated clockwise from its natural orientation.
     private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
     private ComboPreferences mPreferences;
+    private String mPrevSavedCDS;
+    private boolean isTNREnabled;
 
     private static final String sTempCropFilename = "crop-temp";
 
@@ -2629,6 +2631,42 @@
             mParameters.set(CameraSettings.KEY_QC_AE_BRACKETING, aeBracketing);
         }
 
+        // Set CDS
+        String cds = mPreferences.getString(
+                CameraSettings.KEY_CDS_MODE,
+                mActivity.getString(R.string.pref_camera_cds_default));
+        if ((mPrevSavedCDS == null) && (cds != null)) {
+            mPrevSavedCDS = cds;
+        }
+        if (CameraUtil.isSupported(cds,
+                CameraSettings.getSupportedCDSModes(mParameters))) {
+            mParameters.set(CameraSettings.KEY_QC_CDS_MODE, cds);
+        }
+
+        // Set TNR
+        String tnr = mPreferences.getString(
+                CameraSettings.KEY_TNR_MODE,
+                mActivity.getString(R.string.pref_camera_tnr_default));
+        if (CameraUtil.isSupported(tnr,
+                CameraSettings.getSupportedTNRModes(mParameters))) {
+            if (!tnr.equals(mActivity.getString(R.string.
+                    pref_camera_tnr_value_off))) {
+                mParameters.set(CameraSettings.KEY_QC_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_cds_value_off));
+                mUI.overrideSettings(CameraSettings.KEY_QC_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_cds_value_off));
+                if (cds != null) {
+                    mPrevSavedCDS = cds;
+                }
+                isTNREnabled = true;
+            } else if (isTNREnabled) {
+                mParameters.set(CameraSettings.KEY_QC_CDS_MODE, mPrevSavedCDS);
+                mUI.overrideSettings(CameraSettings.KEY_QC_CDS_MODE, mPrevSavedCDS);
+                isTNREnabled = false;
+            }
+            mParameters.set(CameraSettings.KEY_QC_TNR_MODE, tnr);
+        }
+
         // Set hdr mode
         String hdrMode = mPreferences.getString(
                 CameraSettings.KEY_HDR_MODE,
diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java
index 85e77dd..33fc569 100644
--- a/src/com/android/camera/VideoMenu.java
+++ b/src/com/android/camera/VideoMenu.java
@@ -48,6 +48,9 @@
     private int mPopupStatus;
     private int popupNum;
     private CameraActivity mActivity;
+    private String mPrevSavedVideoCDS;
+    private boolean mIsVideoTNREnabled = false;
+    private boolean mIsVideoCDSUpdated = false;
 
     public VideoMenu(CameraActivity activity, VideoUI ui, PieRenderer pie) {
         super(activity, pie);
@@ -83,7 +86,9 @@
                 CameraSettings.KEY_WHITE_BALANCE,
                 CameraSettings.KEY_VIDEO_HIGH_FRAME_RATE,
                 CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE,
-                CameraSettings.KEY_VIDEO_ROTATION
+                CameraSettings.KEY_VIDEO_ROTATION,
+                CameraSettings.KEY_VIDEO_CDS_MODE,
+                CameraSettings.KEY_VIDEO_TNR_MODE
        };
 
         PieItem item1 = makeItem(R.drawable.ic_settings_holo_light_01);
@@ -169,8 +174,49 @@
         }
     }
 
+    public void overrideCDSMode() {
+        if (mPopup2 != null) {
+            ListPreference pref_tnr = mPreferenceGroup.
+                    findPreference(CameraSettings.KEY_VIDEO_TNR_MODE);
+            ListPreference pref_cds = mPreferenceGroup.
+                    findPreference(CameraSettings.KEY_VIDEO_CDS_MODE);
+            String tnr = (pref_tnr != null) ? pref_tnr.getValue() : null;
+            String cds = (pref_cds != null) ? pref_cds.getValue() : null;
+
+            if (mPrevSavedVideoCDS == null && cds != null) {
+                mPrevSavedVideoCDS = cds;
+            }
+
+            if ((tnr != null) && !mActivity.getString(R.string.
+                    pref_camera_video_tnr_default).equals(tnr)) {
+                ((MoreSettingPopup) mPopup2).setPreferenceEnabled(
+                        CameraSettings.KEY_VIDEO_CDS_MODE,false);
+                ((MoreSettingPopup) mPopup2).overrideSettings(
+                        CameraSettings.KEY_VIDEO_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_video_cds_value_off));
+                mIsVideoTNREnabled = true;
+                if (!mIsVideoCDSUpdated) {
+                    if (cds != null) {
+                        mPrevSavedVideoCDS = cds;
+                    }
+                    mIsVideoCDSUpdated = true;
+                }
+            } else if (tnr != null) {
+                ((MoreSettingPopup) mPopup2).setPreferenceEnabled(
+                        CameraSettings.KEY_VIDEO_CDS_MODE,true);
+                if (mIsVideoTNREnabled) {
+                    ((MoreSettingPopup) mPopup2).overrideSettings(
+                            CameraSettings.KEY_VIDEO_CDS_MODE, mPrevSavedVideoCDS);
+                    mIsVideoTNREnabled = false;
+                    mIsVideoCDSUpdated = false;
+                }
+            }
+        }
+    }
+
     @Override
     public void overrideSettings(final String ... keyvalues) {
+        overrideCDSMode();
         super.overrideSettings(keyvalues);
         if (((mPopup1 == null) && (mPopup2 == null)) || mPopupStatus != POPUP_FIRST_LEVEL) {
             mPopupStatus = POPUP_FIRST_LEVEL;
@@ -212,6 +258,7 @@
         popup2.setSettingChangedListener(this);
         popup2.initialize(mPreferenceGroup, mOtherKeys2);
         mPopup2 = popup2;
+        overrideCDSMode();
     }
 
     public void popupDismissed(boolean topPopupOnly) {
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 8223fad..226e503 100755
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -187,6 +187,11 @@
     private boolean mStopRecPending = false;
     private boolean mStartPrevPending = false;
     private boolean mStopPrevPending = false;
+    private String mPrevSavedVideoCDS = null;
+    private String mTempVideoCDS = null;
+    private boolean mIsVideoTNREnabled;
+    private boolean mIsVideoCDSUpdated = false;
+    private boolean mOverrideCDS = false;
 
     // The preview window is on focus
     private boolean mPreviewFocused = false;
@@ -2096,6 +2101,57 @@
             mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);
         }
 
+        // Set video CDS
+        String video_cds = mPreferences.getString(
+                CameraSettings.KEY_VIDEO_CDS_MODE,
+                mActivity.getString(R.string.pref_camera_video_cds_default));
+
+        if ((mPrevSavedVideoCDS == null) && (video_cds != null)) {
+            mPrevSavedVideoCDS = video_cds;
+        }
+
+        if (mOverrideCDS) {
+            video_cds = mPrevSavedVideoCDS;
+            mOverrideCDS = false;
+        }
+
+        if (CameraUtil.isSupported(video_cds,
+                CameraSettings.getSupportedVideoCDSModes(mParameters))) {
+            mParameters.set(CameraSettings.KEY_QC_VIDEO_CDS_MODE, video_cds);
+        }
+
+        // Set video TNR
+        String video_tnr = mPreferences.getString(
+                CameraSettings.KEY_VIDEO_TNR_MODE,
+                mActivity.getString(R.string.pref_camera_video_tnr_default));
+        if (CameraUtil.isSupported(video_tnr,
+                CameraSettings.getSupportedVideoTNRModes(mParameters))) {
+            if (!video_tnr.equals(mActivity.getString(R.string.
+                    pref_camera_video_tnr_value_off))) {
+                mParameters.set(CameraSettings.KEY_QC_VIDEO_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_video_cds_value_off));
+                mUI.overrideSettings(CameraSettings.KEY_QC_VIDEO_CDS_MODE,
+                        mActivity.getString(R.string.pref_camera_video_cds_value_off));
+                if (!mIsVideoCDSUpdated) {
+                    if (video_cds != null) {
+                        mPrevSavedVideoCDS = mTempVideoCDS;
+                    }
+                    mIsVideoTNREnabled = true;
+                    mIsVideoCDSUpdated = true;
+                }
+            } else if (mIsVideoTNREnabled) {
+                mParameters.set(CameraSettings.KEY_QC_VIDEO_CDS_MODE, mPrevSavedVideoCDS);
+                mUI.overrideSettings(CameraSettings.KEY_QC_VIDEO_CDS_MODE, mPrevSavedVideoCDS);
+                mIsVideoTNREnabled = false;
+                mIsVideoCDSUpdated = false;
+                mOverrideCDS = true;
+            } else {
+                mTempVideoCDS = video_cds;
+            }
+            mParameters.set(CameraSettings.KEY_QC_VIDEO_TNR_MODE, video_tnr);
+            mUI.overrideSettings(CameraSettings.KEY_QC_VIDEO_CDS_MODE, video_tnr);
+        }
+
         // Set Video HDR.
         String videoHDR = mPreferences.getString(
                 CameraSettings.KEY_VIDEO_HDR,
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 328645a..8de713a 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -438,7 +438,9 @@
     }
 
     public void overrideSettings(final String... keyvalues) {
-        mVideoMenu.overrideSettings(keyvalues);
+        if (mVideoMenu != null) {
+            mVideoMenu.overrideSettings(keyvalues);
+        }
     }
 
     public void setOrientationIndicator(int orientation, boolean animation) {