OSDN Git Service

Major refactor: Make resources access through app.
[android-x86/packages-apps-Camera2.git] / src / com / android / camera / CameraHolder.java
index d913df7..4603dd8 100644 (file)
 
 package com.android.camera;
 
-import static com.android.camera.Util.Assert;
-
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
-import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.util.Log;
 
-import com.android.camera.CameraManager.CameraProxy;
+import com.android.camera.app.CameraManager;
+import com.android.camera.app.CameraManager.CameraProxy;
+import com.android.camera.app.CameraManagerFactory;
 
-import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 
+import static com.android.camera.util.CameraUtil.Assert;
+
 /**
  * The class is used to hold an {@code android.hardware.Camera} instance.
  *
@@ -188,8 +188,9 @@ public class CameraHolder {
         return mInfo;
     }
 
-    public synchronized CameraProxy open(int cameraId)
-            throws CameraHardwareException {
+    public synchronized CameraProxy open(
+            Handler handler, int cameraId,
+            CameraManager.CameraOpenCallback cb) {
         if (DEBUG_OPEN_RELEASE) {
             collectState(cameraId, mCameraDevice);
             if (mCameraOpened) {
@@ -199,33 +200,33 @@ public class CameraHolder {
         }
         Assert(!mCameraOpened);
         if (mCameraDevice != null && mCameraId != cameraId) {
-            mCameraDevice.release();
+            mCameraDevice.release(true);
             mCameraDevice = null;
             mCameraId = -1;
         }
         if (mCameraDevice == null) {
-            try {
-                Log.v(TAG, "open camera " + cameraId);
-                if (mMockCameraInfo == null) {
-                    mCameraDevice = CameraManagerFactory
-                            .getAndroidCameraManager().cameraOpen(cameraId);
-                } else {
-                    if (mMockCamera == null)
-                        throw new RuntimeException();
+            Log.v(TAG, "open camera " + cameraId);
+            if (mMockCameraInfo == null) {
+                mCameraDevice = CameraManagerFactory
+                        .getAndroidCameraManager().cameraOpenOld(handler, cameraId, cb);
+            } else {
+                if (mMockCamera != null) {
                     mCameraDevice = mMockCamera[cameraId];
+                } else {
+                    Log.e(TAG, "MockCameraInfo found, but no MockCamera provided.");
+                    mCameraDevice = null;
                 }
-                mCameraId = cameraId;
-            } catch (RuntimeException e) {
-                Log.e(TAG, "fail to connect Camera", e);
-                throw new CameraHardwareException(e);
             }
+            if (mCameraDevice == null) {
+                Log.e(TAG, "fail to connect Camera:" + mCameraId + ", aborting.");
+                return null;
+            }
+            mCameraId = cameraId;
             mParameters = mCameraDevice.getParameters();
         } else {
-            try {
-                mCameraDevice.reconnect();
-            } catch (IOException e) {
-                Log.e(TAG, "reconnect failed.");
-                throw new CameraHardwareException(e);
+            if (!mCameraDevice.reconnectOld(handler, cb)) {
+                Log.e(TAG, "fail to reconnect Camera:" + mCameraId + ", aborting.");
+                return null;
             }
             mCameraDevice.setParameters(mParameters);
         }
@@ -239,17 +240,9 @@ public class CameraHolder {
      * Tries to open the hardware camera. If the camera is being used or
      * unavailable then return {@code null}.
      */
-    public synchronized CameraProxy tryOpen(int cameraId) {
-        try {
-            return !mCameraOpened ? open(cameraId) : null;
-        } catch (CameraHardwareException e) {
-            // In eng build, we throw the exception so that test tool
-            // can detect it and report it
-            if ("eng".equals(Build.TYPE)) {
-                throw new RuntimeException(e);
-            }
-            return null;
-        }
+    public synchronized CameraProxy tryOpen(
+            Handler handler, int cameraId, CameraManager.CameraOpenCallback cb) {
+            return (!mCameraOpened ? open(handler, cameraId, cb) : null);
     }
 
     public synchronized void release() {
@@ -259,18 +252,14 @@ public class CameraHolder {
 
         if (mCameraDevice == null) return;
 
-        long now = System.currentTimeMillis();
-        if (now < mKeepBeforeTime) {
-            if (mCameraOpened) {
-                mCameraOpened = false;
-                mCameraDevice.stopPreview();
-            }
-            mHandler.sendEmptyMessageDelayed(RELEASE_CAMERA,
-                    mKeepBeforeTime - now);
-            return;
-        }
+        strongRelease();
+    }
+
+    public synchronized void strongRelease() {
+        if (mCameraDevice == null) return;
+
         mCameraOpened = false;
-        mCameraDevice.release();
+        mCameraDevice.release(true);
         mCameraDevice = null;
         // We must set this to null because it has a reference to Camera.
         // Camera has references to the listeners.