summaryrefslogtreecommitdiffstats
path: root/core/java/android/hardware/Camera.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/hardware/Camera.java')
-rw-r--r--core/java/android/hardware/Camera.java40
1 files changed, 34 insertions, 6 deletions
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 77f826e..a8308c4 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -35,6 +35,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
+import java.util.concurrent.locks.ReentrantLock;
/**
* The Camera class is used to set image capture settings, start/stop preview,
@@ -154,6 +155,7 @@ public class Camera {
private boolean mOneShot;
private boolean mWithBuffer;
private boolean mFaceDetectionRunning = false;
+ private ReentrantLock mFocusLock = new ReentrantLock();
/**
* Broadcast Action: A new picture is taken by the camera, and the entry of
@@ -756,8 +758,14 @@ public class Camera {
return;
case CAMERA_MSG_FOCUS:
- if (mAutoFocusCallback != null) {
- mAutoFocusCallback.onAutoFocus(msg.arg1 == 0 ? false : true, mCamera);
+ mFocusLock.lock();
+ try {
+ if (mAutoFocusCallback != null) {
+ boolean success = msg.arg1 == 0 ? false : true;
+ mAutoFocusCallback.onAutoFocus(success, mCamera);
+ }
+ } finally {
+ mFocusLock.unlock();
}
return;
@@ -882,8 +890,13 @@ public class Camera {
*/
public final void autoFocus(AutoFocusCallback cb)
{
- mAutoFocusCallback = cb;
- native_autoFocus();
+ mFocusLock.lock();
+ try {
+ mAutoFocusCallback = cb;
+ native_autoFocus();
+ } finally {
+ mFocusLock.unlock();
+ }
}
private native final void native_autoFocus();
@@ -897,8 +910,14 @@ public class Camera {
*/
public final void cancelAutoFocus()
{
- mAutoFocusCallback = null;
- native_cancelAutoFocus();
+ mFocusLock.lock();
+ try {
+ mAutoFocusCallback = null;
+ native_cancelAutoFocus();
+ removePendingAFCompletionMessages();
+ } finally {
+ mFocusLock.unlock();
+ }
}
private native final void native_cancelAutoFocus();
@@ -3621,4 +3640,13 @@ public class Camera {
return false;
}
};
+
+ /*
+ * At any time, there should be at most one pending auto focus completion
+ * message, but we simply remove all pending AF completion messages in
+ * the looper's queue.
+ */
+ private void removePendingAFCompletionMessages() {
+ mEventHandler.removeMessages(CAMERA_MSG_FOCUS);
+ }
}