OSDN Git Service

Add wrapper for face detection listener.
authorAngus Kong <shkong@google.com>
Wed, 31 Jul 2013 21:05:20 +0000 (14:05 -0700)
committerAngus Kong <shkong@google.com>
Wed, 31 Jul 2013 22:08:55 +0000 (15:08 -0700)
  bug:10113532

Change-Id: I01dc051d7b25cb97153b5e3e4cf06744dccb9fd4

src/com/android/camera/AndroidCameraManagerImpl.java
src/com/android/camera/CameraManager.java
src/com/android/camera/PhotoModule.java
src/com/android/camera/PhotoUI.java

index 907cf13..897aa92 100644 (file)
@@ -391,12 +391,12 @@ class AndroidCameraManagerImpl implements CameraManager {
 
         @TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
         @Override
-        public void setPreviewTexture(final SurfaceTexture surfaceTexture) {
+        public void setPreviewTexture(SurfaceTexture surfaceTexture) {
             mCameraHandler.obtainMessage(SET_PREVIEW_TEXTURE_ASYNC, surfaceTexture).sendToTarget();
         }
 
         @Override
-        public void setPreviewDisplay(final SurfaceHolder surfaceHolder) {
+        public void setPreviewDisplay(SurfaceHolder surfaceHolder) {
             mCameraHandler.obtainMessage(SET_PREVIEW_DISPLAY_ASYNC, surfaceHolder).sendToTarget();
         }
 
@@ -413,18 +413,18 @@ class AndroidCameraManagerImpl implements CameraManager {
 
         @Override
         public void setPreviewDataCallback(
-                Handler handler, final CameraPreviewDataCallback cb) {
+                Handler handler, CameraPreviewDataCallback cb) {
             mCameraHandler.obtainMessage(
                     SET_PREVIEW_CALLBACK,
-                    PreviewCallbackForward.instance(handler, this, cb)).sendToTarget();
+                    PreviewCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
         }
 
         @Override
         public void setPreviewDataCallbackWithBuffer(
-                Handler handler, final CameraPreviewDataCallback cb) {
+                Handler handler, CameraPreviewDataCallback cb) {
             mCameraHandler.obtainMessage(
                     SET_PREVIEW_CALLBACK_WITH_BUFFER,
-                    PreviewCallbackForward.instance(handler, this, cb)).sendToTarget();
+                    PreviewCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
         }
 
         @Override
@@ -436,7 +436,7 @@ class AndroidCameraManagerImpl implements CameraManager {
         public void autoFocus(Handler handler, CameraAFCallback cb) {
             mCameraHandler.obtainMessage(
                     AUTO_FOCUS,
-                    AFCallbackForward.instance(handler, this, cb)).sendToTarget();
+                    AFCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
         }
 
         @Override
@@ -448,24 +448,24 @@ class AndroidCameraManagerImpl implements CameraManager {
         @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
         @Override
         public void setAutoFocusMoveCallback(
-                Handler handler, final CameraAFMoveCallback cb) {
+                Handler handler, CameraAFMoveCallback cb) {
             mCameraHandler.obtainMessage(
                     SET_AUTO_FOCUS_MOVE_CALLBACK,
-                    AFMoveCallbackForward.instance(handler, this, cb)).sendToTarget();
+                    AFMoveCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
         }
 
         @Override
         public void takePicture(
-                final Handler handler,
-                final CameraShutterCallback shutter,
-                final CameraPictureCallback raw,
-                final CameraPictureCallback post,
-                final CameraPictureCallback jpeg) {
+                Handler handler,
+                CameraShutterCallback shutter,
+                CameraPictureCallback raw,
+                CameraPictureCallback post,
+                CameraPictureCallback jpeg) {
             mCameraHandler.requestTakePicture(
-                    ShutterCallbackForward.instance(handler, this, shutter),
-                    PictureCallbackForward.instance(handler, this, raw),
-                    PictureCallbackForward.instance(handler, this, post),
-                    PictureCallbackForward.instance(handler, this, jpeg));
+                    ShutterCallbackForward.getNewInstance(handler, this, shutter),
+                    PictureCallbackForward.getNewInstance(handler, this, raw),
+                    PictureCallbackForward.getNewInstance(handler, this, post),
+                    PictureCallbackForward.getNewInstance(handler, this, jpeg));
         }
 
         @Override
@@ -480,8 +480,11 @@ class AndroidCameraManagerImpl implements CameraManager {
         }
 
         @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH)
-        public void setFaceDetectionListener(FaceDetectionListener listener) {
-            mCameraHandler.obtainMessage(SET_FACE_DETECTION_LISTENER, listener).sendToTarget();
+        public void setFaceDetectionCallback(
+                Handler handler, CameraFaceDetectionCallback cb) {
+            mCameraHandler.obtainMessage(
+                    SET_FACE_DETECTION_LISTENER,
+                    FaceDetectionCallbackForward.getNewInstance(handler, this, cb)).sendToTarget();
         }
 
         @Override
@@ -537,15 +540,15 @@ class AndroidCameraManagerImpl implements CameraManager {
         private final CameraAFCallback mCallback;
 
         /**
-         * Returns an instance of {@link AFCallbackForward}.
+         * Returns a new instance of {@link AFCallbackForward}.
          *
          * @param handler The handler in which the callback will be invoked in.
          * @param camera  The {@link CameraProxy} which the callback is from.
          * @param cb      The callback to be invoked.
          * @return        The instance of the {@link AFCallbackForward},
-         *                or null if any one of other parameters is null.
+         *                or null if any parameter is null.
          */
-        public static AFCallbackForward instance(
+        public static AFCallbackForward getNewInstance(
                 Handler handler, CameraProxy camera, CameraAFCallback cb) {
             if (handler == null || camera == null || cb == null) return null;
             return new AFCallbackForward(handler, camera, cb);
@@ -577,15 +580,15 @@ class AndroidCameraManagerImpl implements CameraManager {
         private final CameraProxy mCamera;
 
         /**
-         * Returns an instance of {@link AFMoveCallbackForward}.
+         * Returns a new instance of {@link AFMoveCallbackForward}.
          *
          * @param handler The handler in which the callback will be invoked in.
          * @param camera  The {@link CameraProxy} which the callback is from.
          * @param cb      The callback to be invoked.
          * @return        The instance of the {@link AFMoveCallbackForward},
-         *                or null if any one of other parameters is null.
+         *                or null if any parameter is null.
          */
-        public static AFMoveCallbackForward instance(
+        public static AFMoveCallbackForward getNewInstance(
                 Handler handler, CameraProxy camera, CameraAFMoveCallback cb) {
             if (handler == null || camera == null || cb == null) return null;
             return new AFMoveCallbackForward(handler, camera, cb);
@@ -619,15 +622,15 @@ class AndroidCameraManagerImpl implements CameraManager {
         private final CameraProxy mCamera;
 
         /**
-         * Returns an instance of {@link ShutterCallbackForward}.
+         * Returns a new instance of {@link ShutterCallbackForward}.
          *
          * @param handler The handler in which the callback will be invoked in.
          * @param camera  The {@link CameraProxy} which the callback is from.
          * @param cb      The callback to be invoked.
          * @return        The instance of the {@link ShutterCallbackForward},
-         *                or null if any one of other parameters is null.
+         *                or null if any parameter is null.
          */
-        public static ShutterCallbackForward instance(
+        public static ShutterCallbackForward getNewInstance(
                 Handler handler, CameraProxy camera, CameraShutterCallback cb) {
             if (handler == null || camera == null || cb == null) return null;
             return new ShutterCallbackForward(handler, camera, cb);
@@ -660,15 +663,15 @@ class AndroidCameraManagerImpl implements CameraManager {
         private final CameraProxy mCamera;
 
         /**
-         * Returns an instance of {@link PictureCallbackForward}.
+         * Returns a new instance of {@link PictureCallbackForward}.
          *
          * @param handler The handler in which the callback will be invoked in.
          * @param camera  The {@link CameraProxy} which the callback is from.
          * @param cb      The callback to be invoked.
          * @return        The instance of the {@link PictureCallbackForward},
-         *                or null if any one of other parameters is null.
+         *                or null if any parameters is null.
          */
-        public static PictureCallbackForward instance(
+        public static PictureCallbackForward getNewInstance(
                 Handler handler, CameraProxy camera, CameraPictureCallback cb) {
             if (handler == null || camera == null || cb == null) return null;
             return new PictureCallbackForward(handler, camera, cb);
@@ -702,15 +705,15 @@ class AndroidCameraManagerImpl implements CameraManager {
         private final CameraProxy mCamera;
 
         /**
-         * Returns an instance of {@link PreviewCallbackForward}.
+         * Returns a new instance of {@link PreviewCallbackForward}.
          *
          * @param handler The handler in which the callback will be invoked in.
          * @param camera  The {@link CameraProxy} which the callback is from.
          * @param cb      The callback to be invoked.
-         * @return        The instance of the {@link PictureCallbackForward},
-         *                or null if any one of other parameters is null.
+         * @return        The instance of the {@link PreviewCallbackForward},
+         *                or null if any parameters is null.
          */
-        public static PreviewCallbackForward instance(
+        public static PreviewCallbackForward getNewInstance(
                 Handler handler, CameraProxy camera, CameraPreviewDataCallback cb) {
             if (handler == null || camera == null || cb == null) return null;
             return new PreviewCallbackForward(handler, camera, cb);
@@ -734,4 +737,43 @@ class AndroidCameraManagerImpl implements CameraManager {
             });
         }
     }
+
+    private static class FaceDetectionCallbackForward implements FaceDetectionListener {
+        private final Handler mHandler;
+        private final CameraFaceDetectionCallback mCallback;
+        private final CameraProxy mCamera;
+
+        /**
+         * Returns a new instance of {@link FaceDetectionCallbackForward}.
+         *
+         * @param handler The handler in which the callback will be invoked in.
+         * @param camera  The {@link CameraProxy} which the callback is from.
+         * @param cb      The callback to be invoked.
+         * @return        The instance of the {@link FaceDetectionCallbackForward},
+         *                or null if any parameter is null.
+         */
+        public static FaceDetectionCallbackForward getNewInstance(
+                Handler handler, CameraProxy camera, CameraFaceDetectionCallback cb) {
+            if (handler == null || camera == null || cb == null) return null;
+            return new FaceDetectionCallbackForward(handler, camera, cb);
+        }
+
+        private FaceDetectionCallbackForward(
+                Handler h, CameraProxy camera, CameraFaceDetectionCallback cb) {
+            mHandler = h;
+            mCamera = camera;
+            mCallback = cb;
+        }
+
+        @Override
+        public void onFaceDetection(
+                final Camera.Face[] faces, Camera camera) {
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    mCallback.onFaceDetection(faces, mCamera);
+                }
+            });
+        }
+    }
 }
index e4a0667..90a838c 100644 (file)
@@ -18,8 +18,8 @@ package com.android.camera;
 
 import android.annotation.TargetApi;
 import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
 import android.hardware.Camera.ErrorCallback;
-import android.hardware.Camera.FaceDetectionListener;
 import android.hardware.Camera.OnZoomChangeListener;
 import android.hardware.Camera.Parameters;
 import android.os.Handler;
@@ -30,7 +30,7 @@ import com.android.gallery3d.common.ApiHelper;
 import java.io.IOException;
 
 /**
- * An interface which provides possible camera device operations. 
+ * An interface which provides possible camera device operations.
  *
  * The client should call {@code CameraManager.cameraOpen} to get an instance
  * of {@link CameraManager.CameraProxy} to control the camera. Classes
@@ -41,7 +41,6 @@ import java.io.IOException;
  *
  * TODO: provide callback interfaces for:
  * {@code android.hardware.Camera.ErrorCallback},
- * {@code android.hardware.Camera.FaceDetectionListener},
  * {@code android.hardware.Camera.OnZoomChangeListener}, and
  * {@code android.hardware.Camera.Parameters}.
  */
@@ -88,6 +87,20 @@ public interface CameraManager {
     }
 
     /**
+     * An interface which wraps
+     * {@link android.hardware.Camera.FaceDetectionListener}.
+     */
+    public interface CameraFaceDetectionCallback {
+        /**
+         * Callback for face detection.
+         *
+         * @param faces   Recognized face in the preview.
+         * @param camera  The camera which the preview image comes from.
+         */
+        public void onFaceDetection(Camera.Face[] faces, CameraProxy camera);
+    }
+
+    /**
      * Opens the camera of the specified ID synchronously.
      *
      * @param cameraId      The camera ID to open.
@@ -248,10 +261,11 @@ public interface CameraManager {
         /**
          * Sets the face detection listener.
          *
-         * @param listener The listener for face detection results.
+         * @param handler  The handler in which the callback will be invoked.
+         * @param callback The callback for face detection results.
          */
         @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH)
-        public void setFaceDetectionListener(FaceDetectionListener listener);
+        public void setFaceDetectionCallback(Handler handler, CameraFaceDetectionCallback callback);
 
         /**
          * Starts the face detection.
index 6140848..c65a49e 100644 (file)
@@ -664,7 +664,7 @@ public class PhotoModule
             CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
             mUI.onStartFaceDetection(mDisplayOrientation,
                     (info.facing == CameraInfo.CAMERA_FACING_FRONT));
-            mCameraDevice.setFaceDetectionListener(mUI);
+            mCameraDevice.setFaceDetectionCallback(mHandler, mUI);
             mCameraDevice.startFaceDetection();
         }
     }
@@ -676,7 +676,7 @@ public class PhotoModule
         if (!mFaceDetectionStarted) return;
         if (mParameters.getMaxNumDetectedFaces() > 0) {
             mFaceDetectionStarted = false;
-            mCameraDevice.setFaceDetectionListener(null);
+            mCameraDevice.setFaceDetectionCallback(null, null);
             mCameraDevice.stopFaceDetection();
             mUI.clearFaces();
         }
@@ -1502,7 +1502,7 @@ public class PhotoModule
         if (mCameraDevice != null) {
             mCameraDevice.setZoomChangeListener(null);
             if(ApiHelper.HAS_FACE_DETECTION) {
-                mCameraDevice.setFaceDetectionListener(null);
+                mCameraDevice.setFaceDetectionCallback(null, null);
             }
             mCameraDevice.setErrorCallback(null);
             CameraHolder.instance().release();
index 22fcc05..1e341a6 100644 (file)
@@ -27,13 +27,11 @@ import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.Face;
 import android.hardware.Camera.FaceDetectionListener;
-import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
 import android.os.Handler;
 import android.os.Message;
 import android.util.Log;
 import android.view.Gravity;
-import android.view.MotionEvent;
 import android.view.TextureView;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -42,20 +40,19 @@ import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.widget.FrameLayout;
 import android.widget.FrameLayout.LayoutParams;
-import android.widget.ImageView;
 import android.widget.Toast;
 
 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
 import com.android.camera.FocusOverlayManager.FocusUI;
 import com.android.camera.ui.AbstractSettingPopup;
 import com.android.camera.ui.CameraControls;
+import com.android.camera.ui.CameraRootView;
+import com.android.camera.ui.CameraSwitcher;
 import com.android.camera.ui.CameraSwitcher.CameraSwitchListener;
 import com.android.camera.ui.CountDownView;
 import com.android.camera.ui.CountDownView.OnCountDownFinishedListener;
-import com.android.camera.ui.CameraSwitcher;
 import com.android.camera.ui.FaceView;
 import com.android.camera.ui.FocusIndicator;
-import com.android.camera.ui.CameraRootView;
 import com.android.camera.ui.PieRenderer;
 import com.android.camera.ui.PieRenderer.PieListener;
 import com.android.camera.ui.RenderOverlay;
@@ -63,14 +60,13 @@ import com.android.camera.ui.ZoomRenderer;
 import com.android.gallery3d.R;
 import com.android.gallery3d.common.ApiHelper;
 
-import java.io.IOException;
 import java.util.List;
 
 public class PhotoUI implements PieListener,
     PreviewGestures.SingleTapListener,
     FocusUI, TextureView.SurfaceTextureListener,
     LocationManager.Listener, CameraRootView.MyDisplayListener,
-    FaceDetectionListener {
+    CameraManager.CameraFaceDetectionCallback {
 
     private static final String TAG = "CAM_UI";
     private static final int UPDATE_TRANSFORM_MATRIX = 1;
@@ -856,7 +852,7 @@ public class PhotoUI implements PieListener,
     }
 
     @Override
-    public void onFaceDetection(Face[] faces, android.hardware.Camera camera) {
+    public void onFaceDetection(Face[] faces, CameraManager.CameraProxy camera) {
         mFaceView.setFaces(faces);
     }