Cherry pick two commits that implements color effect and white-balance
settings and then make it workable.

Change-Id: I519bff761db4b2b0acc1a61a8f901fafcd4b2586
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index b1668fc..d4b2912 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -84,4 +84,65 @@
         <item>@string/pref_camera_focusmode_value_infinity</item>
     </string-array>
 
+    <!-- Camera Preferences White Balance dialog box entries -->
+    <string-array name="pref_camera_whitebalance_entries" translatable="false">
+        <item>@string/pref_camera_whitebalance_entry_auto</item>
+        <item>@string/pref_camera_whitebalance_entry_incandescent</item>
+        <item>@string/pref_camera_whitebalance_entry_daylight</item>
+        <item>@string/pref_camera_whitebalance_entry_fluorescent</item>
+        <item>@string/pref_camera_whitebalance_entry_cloudy</item>
+        <item>@string/pref_camera_whitebalance_entry_twilight</item>
+        <item>@string/pref_camera_whitebalance_entry_shade</item>
+        <item>@string/pref_camera_whitebalance_entry_warm_fluorescent</item>
+        <item>@string/pref_camera_whitebalance_entry_halogen</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_whitebalance_entryvalues" translatable="false">
+        <item>auto</item>
+        <item>incandescent</item>
+        <item>daylight</item>
+        <item>fluorescent</item>
+        <item>cloudy</item>
+        <item>twilight</item>
+        <item>shade</item>
+        <item>warm-fluorescent</item>
+        <item>halogen</item>
+    </string-array>
+
+    <!-- Camera Preferences Color effect dialog box entries -->
+    <string-array name="pref_camera_coloreffect_entries" translatable="false">
+        <item>@string/pref_camera_coloreffect_entry_none</item>
+        <item>@string/pref_camera_coloreffect_entry_mono</item>
+        <item>@string/pref_camera_coloreffect_entry_sepia</item>
+        <item>@string/pref_camera_coloreffect_entry_negative</item>
+        <item>@string/pref_camera_coloreffect_entry_solarize</item>
+        <item>@string/pref_camera_coloreffect_entry_posterize</item>
+        <item>@string/pref_camera_coloreffect_entry_whiteboard</item>
+        <item>@string/pref_camera_coloreffect_entry_blackboard</item>
+        <item>@string/pref_camera_coloreffect_entry_aqua</item>
+        <item>@string/pref_camera_coloreffect_entry_pastel</item>
+        <item>@string/pref_camera_coloreffect_entry_mosaic</item>
+        <item>@string/pref_camera_coloreffect_entry_redtint</item>
+        <item>@string/pref_camera_coloreffect_entry_bluetint</item>
+        <item>@string/pref_camera_coloreffect_entry_greentint</item>
+    </string-array>
+
+    <!-- Do not localize entryvalues -->
+    <string-array name="pref_camera_coloreffect_entryvalues" translatable="false">
+        <item>none</item>
+        <item>mono</item>
+        <item>sepia</item>
+        <item>negative</item>
+        <item>solarize</item>
+        <item>posterize</item>
+        <item>whiteboard</item>
+        <item>blackboard</item>
+        <item>aqua</item>
+        <item>pastel</item>
+        <item>mosaic</item>
+        <item>red-tint</item>
+        <item>blue-tint</item>
+        <item>green-tint</item>
+    </string-array>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7e0920e..7b6c566 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -414,6 +414,51 @@
     <!-- Settings screen, focus mode dialog title -->
     <string name="pref_camera_focusmode_dialogtitle">Focus mode</string>
 
+    <!-- Default white balance setting. Do not translate. -->
+    <string name="pref_camera_whitebalance_default">auto</string>
+
+    <!-- Settings screen, white balance dialog title -->
+    <string name="pref_camera_whitebalance_dialogtitle">White balance</string>
+
+    <!-- Settings screen, white balance title -->
+    <string name="pref_camera_whitebalance_title">White balance</string>
+
+    <!-- Settings screen, White balance dialog radio button choices -->
+    <string name="pref_camera_whitebalance_entry_auto">Auto</string>
+    <string name="pref_camera_whitebalance_entry_incandescent">Incandescent</string>
+    <string name="pref_camera_whitebalance_entry_daylight">Daylight</string>
+    <string name="pref_camera_whitebalance_entry_fluorescent">Fluorescent</string>
+    <string name="pref_camera_whitebalance_entry_cloudy">Cloudy</string>
+    <string name="pref_camera_whitebalance_entry_twilight">Twilight</string>
+    <string name="pref_camera_whitebalance_entry_shade">Shade</string>
+    <string name="pref_camera_whitebalance_entry_warm_fluorescent">Warm Fluorescent</string>
+    <string name="pref_camera_whitebalance_entry_halogen">Halogen</string>
+
+    <!-- Settings screen, color effect dialog title -->
+    <string name="pref_camera_coloreffect_dialogtitle">Color effect</string>
+
+    <!-- Default color effect setting. Do not translate. -->
+    <string name="pref_camera_coloreffect_default">none</string>
+
+    <!-- Settings screen, Select Color effect title -->
+    <string name="pref_camera_coloreffect_title">Color effect</string>
+
+    <!-- Settings screen, Color effect dialog radio button choices -->
+    <string name="pref_camera_coloreffect_entry_none">None</string>
+    <string name="pref_camera_coloreffect_entry_mono">Mono</string>
+    <string name="pref_camera_coloreffect_entry_sepia">Sepia</string>
+    <string name="pref_camera_coloreffect_entry_negative">Negative</string>
+    <string name="pref_camera_coloreffect_entry_solarize">Solarize</string>
+    <string name="pref_camera_coloreffect_entry_posterize">Posterize</string>
+    <string name="pref_camera_coloreffect_entry_whiteboard">Whiteboard</string>
+    <string name="pref_camera_coloreffect_entry_blackboard">Blackboard</string>
+    <string name="pref_camera_coloreffect_entry_aqua">Aqua</string>
+    <string name="pref_camera_coloreffect_entry_pastel">Pastel</string>
+    <string name="pref_camera_coloreffect_entry_mosaic">Mosaic</string>
+    <string name="pref_camera_coloreffect_entry_redtint">Red Tint</string>
+    <string name="pref_camera_coloreffect_entry_bluetint">Blue Tint</string>
+    <string name="pref_camera_coloreffect_entry_greentint">Green Tint</string>
+
     <!-- Menu item to go to the settings screen -->
     <string name="camerasettings">Settings</string>
 
@@ -427,7 +472,7 @@
     <!-- Preference summary for whether the user should be prompted form confirmation when deleting images  -->
     <string name="pref_gallery_confirm_delete_summary">Show confirmation before deleting a picture or video</string>
 
-   <!-- Details stuff -->
+    <!-- Details stuff -->
     <!-- Do not translate -->
     <string name="details_title_text">myvideo</string>
     <!-- Do not translate -->
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 6da66c7..432c80b 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -73,6 +73,22 @@
                 android:entries="@array/pref_camera_focusmode_entries"
                 android:entryValues="@array/pref_camera_focusmode_entryvalues"
                 android:dialogTitle="@string/pref_camera_focusmode_dialogtitle" />
+
+        <ListPreference
+                android:key="pref_camera_whitebalance_key"
+                android:defaultValue="@string/pref_camera_whitebalance_default"
+                android:title="@string/pref_camera_whitebalance_title"
+                android:entries="@array/pref_camera_whitebalance_entries"
+                android:entryValues="@array/pref_camera_whitebalance_entryvalues"
+                android:dialogTitle="@string/pref_camera_whitebalance_dialogtitle" />
+
+        <ListPreference
+                android:key="pref_camera_coloreffect_key"
+                android:defaultValue="@string/pref_camera_coloreffect_default"
+                android:title="@string/pref_camera_coloreffect_title"
+                android:entries="@array/pref_camera_coloreffect_entries"
+                android:entryValues="@array/pref_camera_coloreffect_entryvalues"
+                android:dialogTitle="@string/pref_camera_coloreffect_dialogtitle" />
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index 5deb0d6..76aefa0 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -107,6 +107,8 @@
     public static final double ZOOM_MIN = 1.0;
     public static final String ZOOM_SPEED = "99";
 
+    private Parameters mParameters;
+
     // The parameter strings to communicate with camera driver.
     public static final String PARM_ZOOM_STATE = "zoom-state";
     public static final String PARM_ZOOM_STEP = "zoom-step";
@@ -114,8 +116,6 @@
     public static final String PARM_ZOOM_SPEED = "zoom-speed";
     public static final String PARM_ZOOM_MAX = "max-picture-continuous-zoom";
 
-    private Parameters mParameters;
-
     private OrientationEventListener mOrientationListener;
     private int mLastOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
     private SharedPreferences mPreferences;
@@ -413,6 +413,7 @@
 
     private class ZoomGestureListener extends
             GestureDetector.SimpleOnGestureListener {
+        @Override
         public boolean onDown(MotionEvent e) {
             // Show zoom buttons only when preview is started and snapshot
             // is not in progress. mZoomButtons may be null if it is not
@@ -424,6 +425,7 @@
             return true;
         }
 
+        @Override
         public boolean onDoubleTap(MotionEvent e) {
             // Perform zoom only when preview is started and snapshot is not in
             // progress.
@@ -1596,6 +1598,22 @@
             mParameters.setFlashMode(flashMode);
         }
 
+        // Set white balance parameter.
+        if (mParameters.getSupportedWhiteBalance() != null) {
+            String whiteBalance = mPreferences.getString(
+                    CameraSettings.KEY_WHITE_BALANCE,
+                    getString(R.string.pref_camera_whitebalance_default));
+            mParameters.setWhiteBalance(whiteBalance);
+        }
+
+        // Set color effect parameter.
+        if (mParameters.getSupportedColorEffects() != null) {
+            String colorEffect = mPreferences.getString(
+                    CameraSettings.KEY_COLOR_EFFECT,
+                    getString(R.string.pref_camera_coloreffect_default));
+            mParameters.setColorEffect(colorEffect);
+        }
+
         mCameraDevice.setParameters(mParameters);
     }
 
@@ -1825,6 +1843,16 @@
             } else {
                 stopReceivingLocationUpdates();
             }
+        } else if (CameraSettings.KEY_COLOR_EFFECT.equals(key)) {
+            String colorEffect = preferences.getString(key,
+                    getString(R.string.pref_camera_coloreffect_default));
+            mParameters.setColorEffect(colorEffect);
+            mCameraDevice.setParameters(mParameters);
+        } else if (CameraSettings.KEY_WHITE_BALANCE.equals(key)) {
+            String whiteBalance = preferences.getString(key,
+                    getString(R.string.pref_camera_whitebalance_default));
+            mParameters.setWhiteBalance(whiteBalance);
+            mCameraDevice.setParameters(mParameters);
         }
     }
 
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index de56ce2..6cf6892 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -46,6 +46,9 @@
     public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
     public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
     public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
+    public static final String KEY_WHITE_BALANCE =
+            "pref_camera_whitebalance_key";
+    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
     public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true;
 
     // MMS video length
@@ -60,6 +63,8 @@
     private ListPreference mPictureSize;
     private ListPreference mJpegQuality;
     private ListPreference mFocusMode;
+    private ListPreference mWhiteBalance;
+    private ListPreference mColorEffect;
     private Parameters mParameters;
 
     @Override
@@ -79,6 +84,8 @@
         updatePictureSizeSummary();
         updateJpegQualitySummary();
         updateFocusModeSummary();
+        updateWhiteBalanceSummary();
+        updateEffectSummary();
     }
 
     private ArrayList<String> sizeToStr(List<Size> sizes) {
@@ -97,6 +104,9 @@
         mPictureSize = (ListPreference) findPreference(KEY_PICTURE_SIZE);
         mJpegQuality = (ListPreference) findPreference(KEY_JPEG_QUALITY);
         mFocusMode = (ListPreference) findPreference(KEY_FOCUS_MODE);
+        mWhiteBalance = (ListPreference) findPreference(KEY_WHITE_BALANCE);
+        mColorEffect = (ListPreference) findPreference(KEY_COLOR_EFFECT);
+
         SharedPreferences pref = getPreferenceScreen().getSharedPreferences();
         upgradePreferences(pref);
         pref.registerOnSharedPreferenceChangeListener(this);
@@ -120,6 +130,12 @@
         ArrayList<String> pictureSizesInString = sizeToStr(pictureSizes);
         createSettings(mPictureSize, pictureSizesInString);
 
+        // Create white balance settings.
+        createSettings(mWhiteBalance, mParameters.getSupportedWhiteBalance());
+
+        // Create color effect settings.
+        createSettings(mColorEffect, mParameters.getSupportedColorEffects());
+
         // Modify video duration settings.
         // The first entry is for MMS video duration, and we need to fill in the
         // device-dependent value (in seconds).
@@ -137,6 +153,7 @@
             mFocusMode.setValue(getString(
                 R.string.pref_camera_focusmode_default));
         }
+        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
     }
 
     private boolean removePreference(PreferenceGroup group, Preference remove) {
@@ -153,8 +170,8 @@
         return false;
     }
 
-    private void createSettings(ListPreference pref,
-                                List<String> supportedParam) {
+    private void createSettings(
+            ListPreference pref, List<String> supportedParam) {
         // Remove the preference if the parameter is not supported.
         if (supportedParam == null) {
             removePreference(getPreferenceScreen(), pref);
@@ -203,10 +220,18 @@
         mJpegQuality.setSummary(mJpegQuality.getEntry());
     }
 
+    private void updateWhiteBalanceSummary() {
+        mWhiteBalance.setSummary(mWhiteBalance.getEntry());
+    }
+
     private void updateFocusModeSummary() {
         mFocusMode.setSummary(mFocusMode.getEntry());
     }
 
+    private void updateEffectSummary() {
+        mColorEffect.setSummary(mColorEffect.getEntry());
+    }
+
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
             String key) {
         if (key.equals(KEY_VIDEO_QUALITY)) {
@@ -219,10 +244,13 @@
             updateJpegQualitySummary();
         } else if (key.equals(KEY_FOCUS_MODE)) {
             updateFocusModeSummary();
+        } else if (key.equals(KEY_WHITE_BALANCE)) {
+            updateWhiteBalanceSummary();
+        } else if (key.equals(KEY_COLOR_EFFECT)) {
+            updateEffectSummary();
         }
     }
 
-    private static final String TAG = "CameraSettings";
     public static void upgradePreferences(SharedPreferences pref) {
         int version;
         try {
diff --git a/src/com/android/camera/CameraSettingsHelper.java b/src/com/android/camera/CameraSettingsHelper.java
index 6b86d8b..f0c8191 100644
--- a/src/com/android/camera/CameraSettingsHelper.java
+++ b/src/com/android/camera/CameraSettingsHelper.java
@@ -16,6 +16,8 @@
 
 public class CameraSettingsHelper {
     private static final int FIRST_REQUEST_CODE = 100;
+    private static final int NOT_FOUND = -1;
+
     public static final String KEY_RECORD_LOCATION =
             "pref_camera_recordlocation_key";
     public static final String KEY_VIDEO_QUALITY =
@@ -26,6 +28,9 @@
     public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
     public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
     public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key";
+    public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key";
+    public static final String KEY_WHITE_BALANCE =
+            "pref_camera_whitebalance_key";
 
     // max mms video duration in seconds.
     public static final int MMS_VIDEO_DURATION =
@@ -57,7 +62,7 @@
         return mScreen;
     }
 
-    private void setDefault(String key, int strRes) {
+    private void setDefaultIfNull(String key, int strRes) {
         ListPreference pref = (ListPreference) mScreen.findPreference(key);
         if (pref.getValue() == null) pref.setValue(mContext.getString(strRes));
     }
@@ -66,6 +71,12 @@
 
         ListPreference videoDuration =
                 (ListPreference) screen.findPreference(KEY_VIDEO_DURATION);
+        ListPreference pictureSize =
+                (ListPreference) screen.findPreference(KEY_PICTURE_SIZE);
+        ListPreference whiteBalance =
+                (ListPreference) screen.findPreference(KEY_WHITE_BALANCE);
+        ListPreference colorEffect =
+                (ListPreference) screen.findPreference(KEY_COLOR_EFFECT);
 
         // Modify video duration settings.
         // The first entry is for MMS video duration, and we need to fill in the
@@ -73,10 +84,18 @@
         CharSequence[] entries = videoDuration.getEntries();
         entries[0] = String.format(entries[0].toString(), MMS_VIDEO_DURATION);
 
-        // Create picture size settings.
-        filterSupportedSizes(screen);
-        setDefault(KEY_JPEG_QUALITY, R.string.pref_camera_jpegquality_default);
-        setDefault(KEY_FOCUS_MODE, R.string.pref_camera_focusmode_default);
+        // Filter out unsupported settings / options
+        filterUnsupportedOptions(screen, pictureSize,
+                sizeListToStringList(mParameters.getSupportedPictureSizes()));
+        filterUnsupportedOptions(screen,
+                whiteBalance, mParameters.getSupportedWhiteBalance());
+        filterUnsupportedOptions(screen,
+                colorEffect, mParameters.getSupportedColorEffects());
+
+        setDefaultIfNull(
+                KEY_JPEG_QUALITY, R.string.pref_camera_jpegquality_default);
+        setDefaultIfNull(
+                KEY_FOCUS_MODE, R.string.pref_camera_focusmode_default);
     }
 
     private boolean removePreference(PreferenceGroup group, Preference remove) {
@@ -93,23 +112,11 @@
         return false;
     }
 
-    private static boolean isSupported(List<Size> supported, String required) {
-        int index = required.indexOf('x');
-        int width = Integer.parseInt(required.substring(0, index));
-        int height = Integer.parseInt(required.substring(index + 1));
-        for (Size size : supported) {
-            if (size.width == width && size.height == height) return true;
-        }
-        return false;
-    }
-
-    private void filterSupportedSizes(PreferenceScreen screen) {
-        ListPreference pref =
-                (ListPreference) screen.findPreference(KEY_PICTURE_SIZE);
+    private void filterUnsupportedOptions(PreferenceScreen screen,
+            ListPreference pref, List<String> supported) {
 
         // Remove the preference if the parameter is not supported.
-        List<Size> supportedSizes = mParameters.getSupportedPictureSizes();
-        if (supportedSizes == null) {
+        if (supported == null) {
             removePreference(screen, pref);
             return;
         }
@@ -120,7 +127,7 @@
         ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
         ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>();
         for (int i = 0, len = allEntryValues.length; i < len; i++) {
-            if (isSupported(supportedSizes, allEntryValues[i].toString())) {
+            if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) {
                 entries.add(allEntries[i]);
                 entryValues.add(allEntryValues[i]);
             }
@@ -133,8 +140,16 @@
 
         // Set the value to the first entry if it is invalid.
         String value = pref.getValue();
-        if (pref.findIndexOfValue(value) == -1) {
+        if (pref.findIndexOfValue(value) == NOT_FOUND) {
             pref.setValueIndex(0);
         }
     }
+
+    private static List<String> sizeListToStringList(List<Size> sizes) {
+        ArrayList<String> list = new ArrayList<String>();
+        for (Size size : sizes) {
+            list.add(String.format("%dx%d", size.width, size.height));
+        }
+        return list;
+    }
 }