Update camera parameters when setting has changed.

Bug: 12250474

* Implemented for photo mode only.
* To be extended to all other modules.

Change-Id: Ie5218f3a76acb757ac526d3f987ef3165736b46d
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 1fbd1b2..433b552 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -89,7 +89,8 @@
         MemoryListener,
         FocusOverlayManager.Listener,
         ShutterButton.OnShutterButtonListener,
-        SensorEventListener {
+        SensorEventListener,
+        SettingsManager.OnSettingChangedListener {
 
     private static final String TAG = "CAM_PhotoModule";
 
@@ -996,9 +997,15 @@
         }
         mFocusManager.setParameters(mInitialParams);
 
+        // Do camera parameter dependent initialization.
         mParameters = mCameraDevice.getParameters();
         setCameraParameters(UPDATE_PARAM_ALL);
+        // Set a listener which updates camera parameters based
+        // on changed settings.
+        SettingsManager settingsManager = mActivity.getSettingsManager();
+        settingsManager.setOnSettingChangedListener(this);
         mCameraPreviewParamsReady = true;
+
         startPreview();
 
         onCameraOpened();
@@ -1521,6 +1528,29 @@
         stopSmartCamera();
     }
 
+    @Override
+    public void onSettingChanged(int id) {
+        switch (id) {
+            case SettingsManager.SETTING_FLASH_MODE: {
+                updateParametersFlashMode();
+                break;
+            }
+            case SettingsManager.SETTING_PICTURE_SIZE: {
+                updateParametersPictureSize();
+                break;
+            }
+            case SettingsManager.SETTING_RECORD_LOCATION: {
+                SettingsController settingsController = mActivity.getSettingsController();
+                settingsController.syncLocationManager();
+                break;
+            }
+            default: {
+                // Do nothing.
+            }
+        }
+        mCameraDevice.setParameters(mParameters);
+    }
+
     private void updateCameraParametersInitialize() {
         // Reset preview frame rate to the maximum because it may be lowered by
         // video camera application.
@@ -1587,6 +1617,28 @@
         mParameters.setFocusMode(mFocusManager.getFocusMode());
 
         // Set picture size.
+        updateParametersPictureSize();
+
+        // Set JPEG quality.
+        updateParametersPictureQuality();
+
+        // For the following settings, we need to check if the settings are
+        // still supported by latest driver, if not, ignore the settings.
+
+        // Set exposure compensation
+        updateParametersExposureCompensation();
+
+        // Set the scene mode: also sets flash and white balance.
+        updateParametersSceneMode();
+
+        if (mContinuousFocusSupported && ApiHelper.HAS_AUTO_FOCUS_MOVE_CALLBACK) {
+            updateAutoFocusMoveCallback();
+        }
+    }
+
+    private void updateParametersPictureSize() {
+        SettingsManager settingsManager = mActivity.getSettingsManager();
+
         String pictureSize = settingsManager.get(SettingsManager.SETTING_PICTURE_SIZE);
         if (pictureSize == null) {
             //TODO: deprecate CameraSettings.
@@ -1624,16 +1676,17 @@
                     / (float) optimalSize.height);
         }
         Log.v(TAG, "Preview size is " + optimalSize.width + "x" + optimalSize.height);
+    }
 
-        // Set JPEG quality.
+    private void updateParametersPictureQuality() {
         int jpegQuality = CameraProfile.getJpegEncodingQualityParameter(mCameraId,
                 CameraProfile.QUALITY_HIGH);
         mParameters.setJpegQuality(jpegQuality);
+    }
 
-        // For the following settings, we need to check if the settings are
-        // still supported by latest driver, if not, ignore the settings.
+    private void updateParametersExposureCompensation() {
+        SettingsManager settingsManager = mActivity.getSettingsManager();
 
-        // Set exposure compensation
         int value = Integer.parseInt(settingsManager.get(SettingsManager.SETTING_EXPOSURE));
         int max = mParameters.getMaxExposureCompensation();
         int min = mParameters.getMinExposureCompensation();
@@ -1642,18 +1695,12 @@
         } else {
             Log.w(TAG, "invalid exposure range: " + value);
         }
-
-        mSceneMode = settingsManager.get(SettingsManager.SETTING_SCENE_MODE);
-        updateParametersSceneMode();
-
-        if (mContinuousFocusSupported && ApiHelper.HAS_AUTO_FOCUS_MOVE_CALLBACK) {
-            updateAutoFocusMoveCallback();
-        }
     }
 
-    public void updateParametersSceneMode() {
+    private void updateParametersSceneMode() {
         SettingsManager settingsManager = mActivity.getSettingsManager();
 
+        mSceneMode = settingsManager.get(SettingsManager.SETTING_SCENE_MODE);
         if (CameraUtil.isSupported(mSceneMode, mParameters.getSupportedSceneModes())) {
             if (!mParameters.getSceneMode().equals(mSceneMode)) {
                 mParameters.setSceneMode(mSceneMode);
@@ -1673,29 +1720,10 @@
 
         if (Parameters.SCENE_MODE_AUTO.equals(mSceneMode)) {
             // Set flash mode.
-            String flashMode = settingsManager.get(SettingsManager.SETTING_FLASH_MODE);
-            List<String> supportedFlash = mParameters.getSupportedFlashModes();
-            if (CameraUtil.isSupported(flashMode, supportedFlash)) {
-                mParameters.setFlashMode(flashMode);
-            } else {
-                flashMode = mParameters.getFlashMode();
-                if (flashMode == null) {
-                    flashMode = mActivity.getString(
-                            R.string.pref_camera_flashmode_no_flash);
-                }
-            }
+            updateParametersFlashMode();
 
-            // Set white balance parameter.
-            String whiteBalance = settingsManager.get(SettingsManager.SETTING_WHITE_BALANCE);
-            if (CameraUtil.isSupported(whiteBalance,
-                    mParameters.getSupportedWhiteBalance())) {
-                mParameters.setWhiteBalance(whiteBalance);
-            } else {
-                whiteBalance = mParameters.getWhiteBalance();
-                if (whiteBalance == null) {
-                    whiteBalance = Parameters.WHITE_BALANCE_AUTO;
-                }
-            }
+            // Set white balance mode.
+            updateParametersWhiteBalanceMode();
 
             // Set focus mode.
             mFocusManager.overrideFocusMode(null);
@@ -1705,6 +1733,27 @@
         }
     }
 
+    private void updateParametersFlashMode() {
+        SettingsManager settingsManager = mActivity.getSettingsManager();
+
+        String flashMode = settingsManager.get(SettingsManager.SETTING_FLASH_MODE);
+        List<String> supportedFlash = mParameters.getSupportedFlashModes();
+        if (CameraUtil.isSupported(flashMode, supportedFlash)) {
+            mParameters.setFlashMode(flashMode);
+        }
+    }
+
+    private void updateParametersWhiteBalanceMode() {
+        SettingsManager settingsManager = mActivity.getSettingsManager();
+
+        // Set white balance parameter.
+        String whiteBalance = settingsManager.get(SettingsManager.SETTING_WHITE_BALANCE);
+        if (CameraUtil.isSupported(whiteBalance,
+            mParameters.getSupportedWhiteBalance())) {
+            mParameters.setWhiteBalance(whiteBalance);
+        }
+    }
+
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
     private void updateAutoFocusMoveCallback() {
         if (mParameters.getFocusMode().equals(CameraUtil.FOCUS_MODE_CONTINUOUS_PICTURE)) {