Handle error getting camera info.

bug:13877028
Change-Id: Iff0353738de3290244092076b2f955f0d7d57408
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
index bcf2c7c..b026a83 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
@@ -141,6 +141,77 @@
         mDispatchThread.end();
     }
 
+    @Override
+    public CameraDeviceInfo getCameraDeviceInfo() {
+        return AndroidCameraDeviceInfo.create();
+    }
+
+    private static class AndroidCameraDeviceInfo implements CameraDeviceInfo {
+        private final Camera.CameraInfo[] mCameraInfos;
+        private final int mNumberOfCameras;
+        private final int mFirstBackCameraId;
+        private final int mFirstFrontCameraId;
+
+        private AndroidCameraDeviceInfo(Camera.CameraInfo[] info, int numberOfCameras,
+                int firstBackCameraId, int firstFrontCameraId) {
+
+            mCameraInfos = info;
+            mNumberOfCameras = numberOfCameras;
+            mFirstBackCameraId = firstBackCameraId;
+            mFirstFrontCameraId = firstFrontCameraId;
+        }
+
+        public static AndroidCameraDeviceInfo create() {
+            int numberOfCameras;
+            Camera.CameraInfo[] cameraInfos;
+            try {
+                numberOfCameras = Camera.getNumberOfCameras();
+                cameraInfos = new Camera.CameraInfo[numberOfCameras];
+                for (int i = 0; i < numberOfCameras; i++) {
+                    cameraInfos[i] = new Camera.CameraInfo();
+                    Camera.getCameraInfo(i, cameraInfos[i]);
+                }
+            } catch (RuntimeException ex) {
+                return null;
+            }
+
+            int firstFront = NO_DEVICE;
+            int firstBack = NO_DEVICE;
+            // Get the first (smallest) back and first front camera id.
+            for (int i = numberOfCameras - 1; i >= 0; i--) {
+                if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
+                    firstBack = i;
+                } else {
+                    if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
+                        firstFront = i;
+                    }
+                }
+            }
+
+            return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront);
+        }
+
+        @Override
+        public Camera.CameraInfo[] getCameraInfos() {
+            return mCameraInfos;
+        }
+
+        @Override
+        public int getNumberOfCameras() {
+            return mNumberOfCameras;
+        }
+
+        @Override
+        public int getFirstBackCameraId() {
+            return mFirstBackCameraId;
+        }
+
+        @Override
+        public int getFirstFrontCameraId() {
+            return mFirstFrontCameraId;
+        }
+    }
+
     private static class CameraStateHolder {
         private int mState;
 
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
new file mode 100644
index 0000000..60ad8ed
--- /dev/null
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
@@ -0,0 +1,35 @@
+package com.android.ex.camera2.portability;
+
+import android.hardware.Camera;
+
+/**
+ * The camera device info.
+ */
+public interface CameraDeviceInfo {
+
+    static final int NO_DEVICE = -1;
+
+    /**
+     * @return The camera info.
+     * // TODO: Remove the dependency on API 1.
+     */
+    @Deprecated
+    Camera.CameraInfo[] getCameraInfos();
+
+    /**
+     * @return The total number of the available camera devices.
+     */
+    int getNumberOfCameras();
+
+    /**
+     * @return The first (lowest) ID of the back cameras or {@code NO_DEVICE}
+     *         if not available.
+     */
+    int getFirstBackCameraId();
+
+    /**
+     * @return The first (lowest) ID of the front cameras or {@code NO_DEVICE}
+     *         if not available.
+     */
+    int getFirstFrontCameraId();
+}
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
index b5707b6..06b3ee7 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
@@ -112,6 +112,16 @@
     }
 
     /**
+     * An interface to be called when the camera preview has started.
+     */
+    public interface CameraStartPreviewCallback {
+        /**
+         * Callback when the preview starts.
+         */
+        public void onPreviewStarted();
+    }
+
+    /**
      * An interface to be called for any events when opening or closing the
      * camera device. This error callback is different from the one defined
      * in the framework, {@link android.hardware.Camera.ErrorCallback}, which
@@ -170,7 +180,6 @@
      */
     public void openCamera(Handler handler, int cameraId, CameraOpenCallback callback);
 
-
     /**
      * Closes the camera device.
      *
@@ -180,6 +189,24 @@
     public void closeCamera(CameraProxy camera, boolean synced);
 
     /**
+     * Sets a callback for handling camera api runtime exceptions on
+     * a handler.
+     */
+    public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
+            Handler handler);
+
+    /**
+     * Recycles the resources used by this instance. CameraManager will be in
+     * an unusable state after calling this.
+     */
+    public void recycle();
+
+    /**
+     * @return The camera devices info.
+     */
+    public CameraDeviceInfo getCameraDeviceInfo();
+
+    /**
      * An interface that takes camera operation requests and post messages to the
      * camera handler thread. All camera operations made through this interface is
      * asynchronous by default except those mentioned specifically.
@@ -419,27 +446,4 @@
          */
         public void enableShutterSound(boolean enable);
     }
-
-    /**
-     * An interface to be called when the camera preview has started.
-     */
-    public interface CameraStartPreviewCallback {
-        /**
-         * Callback when the preview starts.
-         */
-        public void onPreviewStarted();
-    }
-
-    /**
-     * Sets a callback for handling camera api runtime exceptions on
-     * a handler.
-     */
-    public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
-            Handler handler);
-
-    /**
-     * Recycles the resources used by this instance. CameraManager will be in
-     * an unusable state after calling this.
-     */
-    public void recycle();
 }