From 918e9627ecd69dab90be053bba59c6593ad235e9 Mon Sep 17 00:00:00 2001 From: Sai Kumar Sanagavarapu Date: Tue, 7 Apr 2015 19:28:18 +0530 Subject: SnapdragonCamera: Fix camera parameters concurrent modification. Parameters if updated from different threads will lead to concurrent modification exception in frameworks. To avoid this, use synchronize block whereever the parameters are being updated. Change-Id: I51dd27e1b4836ddef910224331551806ff66b24d --- src/com/android/camera/PhotoModule.java | 47 +++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index bba073f68..6bfffb695 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -1518,20 +1518,23 @@ public class PhotoModule // Set rotation and gps data. int orientation = mOrientation; mJpegRotation = CameraUtil.getJpegRotation(mCameraId, orientation); - mParameters.setRotation(mJpegRotation); String pictureFormat = mParameters.get(KEY_PICTURE_FORMAT); Location loc = getLocationAccordPictureFormat(pictureFormat); - CameraUtil.setGpsParameters(mParameters, loc); - if (mRefocus) { - mParameters.set(CameraSettings.KEY_QC_LEGACY_BURST, - CameraSettings.KEY_QC_RE_FOCUS_COUNT); - } else { - mParameters.remove(CameraSettings.KEY_QC_LEGACY_BURST); - } + synchronized (mCameraDevice) { + mParameters.setRotation(mJpegRotation); + CameraUtil.setGpsParameters(mParameters, loc); - mCameraDevice.setParameters(mParameters); - mParameters = mCameraDevice.getParameters(); + if (mRefocus) { + mParameters.set(CameraSettings.KEY_QC_LEGACY_BURST, + CameraSettings.KEY_QC_RE_FOCUS_COUNT); + } else { + mParameters.remove(CameraSettings.KEY_QC_LEGACY_BURST); + } + + mCameraDevice.setParameters(mParameters); + mParameters = mCameraDevice.getParameters(); + } mBurstSnapNum = mParameters.getInt("num-snaps-per-shutter"); mReceivedSnapNum = 0; @@ -1870,9 +1873,11 @@ public class PhotoModule if (oldOrientation != mOrientation) { Log.v(TAG, "onOrientationChanged, update parameters"); if (mParameters != null && mCameraDevice != null) { - setFlipValue(); - updatePowerMode(); - mCameraDevice.setParameters(mParameters); + synchronized (mCameraDevice) { + setFlipValue(); + updatePowerMode(); + mCameraDevice.setParameters(mParameters); + } } mUI.setOrientation(mOrientation, true); if (mGraphView != null) { @@ -4255,10 +4260,12 @@ public class PhotoModule mZoomValue = index; if (mParameters == null || mCameraDevice == null) return index; // Set zoom parameters asynchronously - mParameters.setZoom(mZoomValue); - mCameraDevice.setParameters(mParameters); - Parameters p = mCameraDevice.getParameters(); - if (p != null) return p.getZoom(); + synchronized (mCameraDevice) { + mParameters.setZoom(mZoomValue); + mCameraDevice.setParameters(mParameters); + Parameters p = mCameraDevice.getParameters(); + if (p != null) return p.getZoom(); + } return index; } @@ -4363,6 +4370,12 @@ public class PhotoModule @Override public void onMakeupLevel(String key, String value) { + synchronized (mCameraDevice) { + onMakeupLevelSync(key, value); + } + } + + public void onMakeupLevelSync(String key, String value) { Log.d(TAG, "PhotoModule.onMakeupLevel(): key is " + key + ", value is " + value); if(TextUtils.isEmpty(value)) { -- cgit v1.2.3