summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Wang <jaywang@codeaurora.org>2016-07-07 10:59:24 -0700
committerJay Wang <jaywang@codeaurora.org>2016-07-08 12:04:18 -0700
commite21ca420afc1f1638948f001e5e3e50007b8db6b (patch)
tree0ae9cb99c5aa25ba17b995df1e3d3a7163e1da21
parentde98a47425d6f9b1ee017829f99d61ad0620266f (diff)
downloadandroid_packages_apps_Snap-e21ca420afc1f1638948f001e5e3e50007b8db6b.tar.gz
android_packages_apps_Snap-e21ca420afc1f1638948f001e5e3e50007b8db6b.tar.bz2
android_packages_apps_Snap-e21ca420afc1f1638948f001e5e3e50007b8db6b.zip
SnapdragonCamera: Fix race condition when opening cameras
Fix race condition between surface ready and camera opened that was causing createSession to be called twice for same device. CRs-Fixed: 1019361 Change-Id: Ieb62b394f1cf83cc83e2b9e290ce6758e2ade377
-rw-r--r--src/com/android/camera/CaptureModule.java62
1 files changed, 35 insertions, 27 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index a7448aedb..770da35ed 100644
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -179,7 +179,7 @@ public class CaptureModule implements CameraModule, PhotoController,
// The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
private boolean mFirstTimeInitialized;
- private boolean mInitialized = false;
+ private boolean mCamerasOpened = false;
private boolean mIsLinked = false;
private long mCaptureStartTime;
private boolean mPaused = true;
@@ -441,23 +441,23 @@ public class CaptureModule implements CameraModule, PhotoController,
if (mPaused) {
return;
}
+
+ mCameraDevice[id] = cameraDevice;
+ mCameraOpened[id] = true;
+
if (isBackCamera() && getCameraMode() == DUAL_MODE && id == BAYER_ID) {
Message msg = mCameraHandler.obtainMessage(OPEN_CAMERA, MONO_ID);
mCameraHandler.sendMessage(msg);
- }
- if (!mInitialized) {
- mInitialized = true;
+ } else {
+ mCamerasOpened = true;
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mUI.onCameraOpened(mCameraIdList);
}
});
+ createSessions();
}
-
- mCameraDevice[id] = cameraDevice;
- mCameraOpened[id] = true;
- createSession(id);
}
@Override
@@ -465,8 +465,9 @@ public class CaptureModule implements CameraModule, PhotoController,
int id = Integer.parseInt(cameraDevice.getId());
Log.d(TAG, "onDisconnected " + id);
cameraDevice.close();
- mCameraDevice = null;
+ mCameraDevice[id] = null;
mCameraOpenCloseLock.release();
+ mCamerasOpened = false;
}
@Override
@@ -476,6 +477,7 @@ public class CaptureModule implements CameraModule, PhotoController,
cameraDevice.close();
mCameraDevice[id] = null;
mCameraOpenCloseLock.release();
+ mCamerasOpened = false;
if (null != mActivity) {
mActivity.finish();
}
@@ -487,6 +489,7 @@ public class CaptureModule implements CameraModule, PhotoController,
Log.d(TAG, "onClosed " + id);
mCameraDevice[id] = null;
mCameraOpenCloseLock.release();
+ mCamerasOpened = false;
}
};
@@ -661,6 +664,26 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private void createSessions() {
+ if (mPaused || !mCamerasOpened || !mSurfaceReady) return;
+ if (isBackCamera()) {
+ switch (getCameraMode()) {
+ case DUAL_MODE:
+ createSession(BAYER_ID);
+ createSession(MONO_ID);
+ break;
+ case BAYER_MODE:
+ createSession(BAYER_ID);
+ break;
+ case MONO_MODE:
+ createSession(MONO_ID);
+ break;
+ }
+ } else {
+ createSession(FRONT_ID);
+ }
+ }
+
private void createSession(final int id) {
if (mPaused || !mCameraOpened[id] || !mSurfaceReady) return;
Log.d(TAG, "createSession " + id);
@@ -1326,7 +1349,7 @@ public class CaptureModule implements CameraModule, PhotoController,
for (int i = 0; i < MAX_NUM_CAM; i++) {
if (null != mCaptureSession[i]) {
- if (mIsLinked) {
+ if (mIsLinked && mCamerasOpened) {
unLinkBayerMono(i);
try {
mCaptureSession[i].capture(mPreviewRequestBuilder[i].build(), null,
@@ -1759,7 +1782,7 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void onSingleTapUp(View view, int x, int y) {
- if (mPaused || mCameraDevice == null || !mFirstTimeInitialized || !mAutoFocusRegionSupported
+ if (mPaused || !mCamerasOpened || !mFirstTimeInitialized || !mAutoFocusRegionSupported
|| !mAutoExposureRegionSupported || !isTouchToFocusAllowed()) {
return;
}
@@ -1870,22 +1893,7 @@ public class CaptureModule implements CameraModule, PhotoController,
}
Log.d(TAG, "onPreviewUIReady");
mSurfaceReady = true;
- if (isBackCamera()) {
- switch (getCameraMode()) {
- case DUAL_MODE:
- createSession(BAYER_ID);
- createSession(MONO_ID);
- break;
- case BAYER_MODE:
- createSession(BAYER_ID);
- break;
- case MONO_MODE:
- createSession(MONO_ID);
- break;
- }
- } else {
- createSession(FRONT_ID);
- }
+ createSessions();
}
@Override