Refactor CameraManager.

1. CameraManager should be the only class accessing android.hardware.Camera.
2. For potential future upgrade in Camera HAL and android.hardward.Camera API
   upgrade, CameraManager should be just an interface instead of concrete
   implementation.
3. waitDone() in CameraProxy is removed.
4. ShutterCallback, PreviewCallback, PictureCallback and AF Callbacks are
   wrapped by our own interfaces.

Change-Id: I595da17a1a9c6d476ee805b71c7f45ebb609e465
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 361f111..6140848 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -28,7 +28,6 @@
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
-import android.hardware.Camera.PictureCallback;
 import android.hardware.Camera.Size;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
@@ -52,7 +51,11 @@
 import android.view.View;
 import android.view.WindowManager;
 
+import com.android.camera.CameraManager.CameraAFCallback;
+import com.android.camera.CameraManager.CameraAFMoveCallback;
+import com.android.camera.CameraManager.CameraPictureCallback;
 import com.android.camera.CameraManager.CameraProxy;
+import com.android.camera.CameraManager.CameraShutterCallback;
 import com.android.camera.ui.CountDownView.OnCountDownFinishedListener;
 import com.android.camera.ui.PopupManager;
 import com.android.camera.ui.RotateTextToast;
@@ -623,7 +626,7 @@
         if (mCameraDevice == null || mCameraStartUpThread != null)
             return;
 
-        mCameraDevice.setPreviewDisplayAsync(holder);
+        mCameraDevice.setPreviewDisplay(holder);
         // This happens when onConfigurationChanged arrives, surface has been
         // destroyed, and there is no onFullScreenChanged.
         if (mCameraState == PREVIEW_STOPPED) {
@@ -680,7 +683,7 @@
     }
 
     private final class ShutterCallback
-            implements android.hardware.Camera.ShutterCallback {
+            implements CameraShutterCallback {
 
         private boolean mAnimateFlash;
 
@@ -689,7 +692,7 @@
         }
 
         @Override
-        public void onShutter() {
+        public void onShutter(CameraProxy camera) {
             mShutterCallbackTime = System.currentTimeMillis();
             mShutterLag = mShutterCallbackTime - mCaptureStartTime;
             Log.v(TAG, "mShutterLag = " + mShutterLag + "ms");
@@ -699,10 +702,10 @@
         }
     }
 
-    private final class PostViewPictureCallback implements PictureCallback {
+    private final class PostViewPictureCallback
+            implements CameraPictureCallback {
         @Override
-        public void onPictureTaken(
-                byte [] data, android.hardware.Camera camera) {
+        public void onPictureTaken(byte [] data, CameraProxy camera) {
             mPostViewPictureCallbackTime = System.currentTimeMillis();
             Log.v(TAG, "mShutterToPostViewCallbackTime = "
                     + (mPostViewPictureCallbackTime - mShutterCallbackTime)
@@ -710,17 +713,18 @@
         }
     }
 
-    private final class RawPictureCallback implements PictureCallback {
+    private final class RawPictureCallback
+            implements CameraPictureCallback {
         @Override
-        public void onPictureTaken(
-                byte [] rawData, android.hardware.Camera camera) {
+        public void onPictureTaken(byte [] rawData, CameraProxy camera) {
             mRawPictureCallbackTime = System.currentTimeMillis();
             Log.v(TAG, "mShutterToRawCallbackTime = "
                     + (mRawPictureCallbackTime - mShutterCallbackTime) + "ms");
         }
     }
 
-    private final class JpegPictureCallback implements PictureCallback {
+    private final class JpegPictureCallback
+            implements CameraPictureCallback {
         Location mLocation;
 
         public JpegPictureCallback(Location loc) {
@@ -728,8 +732,7 @@
         }
 
         @Override
-        public void onPictureTaken(
-                final byte [] jpegData, final android.hardware.Camera camera) {
+        public void onPictureTaken(final byte [] jpegData, CameraProxy camera) {
             if (mPaused) {
                 return;
             }
@@ -841,11 +844,10 @@
         }
     }
 
-    private final class AutoFocusCallback
-            implements android.hardware.Camera.AutoFocusCallback {
+    private final class AutoFocusCallback implements CameraAFCallback {
         @Override
         public void onAutoFocus(
-                boolean focused, android.hardware.Camera camera) {
+                boolean focused, CameraProxy camera) {
             if (mPaused) return;
 
             mAutoFocusTime = System.currentTimeMillis() - mFocusStartTime;
@@ -857,10 +859,10 @@
 
     @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
     private final class AutoFocusMoveCallback
-            implements android.hardware.Camera.AutoFocusMoveCallback {
+            implements CameraAFMoveCallback {
         @Override
         public void onAutoFocusMoving(
-            boolean moving, android.hardware.Camera camera) {
+            boolean moving, CameraProxy camera) {
                 mFocusManager.onAutoFocusMoving(moving);
         }
     }
@@ -965,10 +967,10 @@
         Util.setGpsParameters(mParameters, loc);
         mCameraDevice.setParameters(mParameters);
 
-        mCameraDevice.takePicture2(new ShutterCallback(!animateBefore),
+        mCameraDevice.takePicture(mHandler,
+                new ShutterCallback(!animateBefore),
                 mRawPictureCallback, mPostViewPictureCallback,
-                new JpegPictureCallback(loc), mCameraState,
-                mFocusManager.getFocusState());
+                new JpegPictureCallback(loc));
 
         mNamedImages.nameNewImage(mContentResolver, mCaptureStartTime);
 
@@ -1408,7 +1410,7 @@
     @Override
     public void autoFocus() {
         mFocusStartTime = System.currentTimeMillis();
-        mCameraDevice.autoFocus(mAutoFocusCallback);
+        mCameraDevice.autoFocus(mHandler, mAutoFocusCallback);
         setCameraState(FOCUSING);
     }
 
@@ -1558,11 +1560,11 @@
         mUI.setPreviewSize(mParameters.getPreviewSize());
         Object st = mUI.getSurfaceTexture();
         if (st != null) {
-           mCameraDevice.setPreviewTextureAsync((SurfaceTexture) st);
+           mCameraDevice.setPreviewTexture((SurfaceTexture) st);
         }
 
         Log.v(TAG, "startPreview");
-        mCameraDevice.startPreviewAsync();
+        mCameraDevice.startPreview();
         mFocusManager.onPreviewStarted();
 
         if (mSnapshotOnIdle) {
@@ -1769,10 +1771,10 @@
     @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
     private void updateAutoFocusMoveCallback() {
         if (mParameters.getFocusMode().equals(Util.FOCUS_MODE_CONTINUOUS_PICTURE)) {
-            mCameraDevice.setAutoFocusMoveCallback(
-                (AutoFocusMoveCallback) mAutoFocusMoveCallback);
+            mCameraDevice.setAutoFocusMoveCallback(mHandler,
+                    (CameraManager.CameraAFMoveCallback) mAutoFocusMoveCallback);
         } else {
-            mCameraDevice.setAutoFocusMoveCallback(null);
+            mCameraDevice.setAutoFocusMoveCallback(null, null);
         }
     }