Merge "camera2-portability: Remove Camera.CameraInfo accessor"
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java
index 0cd8ede..7388519 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java
@@ -48,6 +48,7 @@
 
     private Parameters mParameters;
     private boolean mParametersIsDirty;
+    private CameraDeviceInfo.Characteristics mCharacteristics;
     private AndroidCameraCapabilities mCapabilities;
 
     private final CameraHandler mCameraHandler;
@@ -140,8 +141,13 @@
         }
 
         @Override
-        public Camera.CameraInfo[] getCameraInfos() {
-            return mCameraInfos;
+        public Characteristics getCharacteristics(int cameraId) {
+            Camera.CameraInfo info = mCameraInfos[cameraId];
+            if (info != null) {
+                return new AndroidCharacteristics(info);
+            } else {
+                return null;
+            }
         }
 
         @Override
@@ -158,6 +164,34 @@
         public int getFirstFrontCameraId() {
             return mFirstFrontCameraId;
         }
+
+        private static class AndroidCharacteristics implements Characteristics {
+            private Camera.CameraInfo mCameraInfo;
+
+            AndroidCharacteristics(Camera.CameraInfo cameraInfo) {
+                mCameraInfo = cameraInfo;
+            }
+
+            @Override
+            public boolean isFacingBack() {
+                return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK;
+            }
+
+            @Override
+            public boolean isFacingFront() {
+                return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT;
+            }
+
+            @Override
+            public int getSensorOrientation() {
+                return mCameraInfo.orientation;
+            }
+
+            @Override
+            public boolean canDisableShutterSound() {
+                return mCameraInfo.canDisableShutterSound;
+            }
+        }
     }
 
     /**
@@ -265,15 +299,17 @@
                             mCameraId = cameraId;
                             mParametersIsDirty = true;
 
-                            // Get a instance of Camera.Parameters for later use.
+                            // Get an instance of Camera.Parameters for later use.
                             mParamsToSet = mCamera.getParameters();
+                            mCharacteristics =
+                                    AndroidCameraDeviceInfo.create().getCharacteristics(cameraId);
                             mCapabilities = new AndroidCameraCapabilities(mParamsToSet);
 
                             mCameraState.setState(CameraStateHolder.CAMERA_IDLE);
                             if (openCallback != null) {
                                 openCallback.onCameraOpened(
                                         new AndroidCameraProxyImpl(cameraId, mCamera,
-                                                mCapabilities));
+                                                mCharacteristics, mCapabilities));
                             }
                         } else {
                             if (openCallback != null) {
@@ -311,7 +347,8 @@
                         mCameraState.setState(CameraStateHolder.CAMERA_IDLE);
                         if (cbForward != null) {
                             cbForward.onCameraOpened(
-                                    new AndroidCameraProxyImpl(cameraId, mCamera, mCapabilities));
+                                    new AndroidCameraProxyImpl(cameraId, mCamera, mCharacteristics,
+                                            mCapabilities));
                         }
                         break;
                     }
@@ -614,12 +651,15 @@
         private final int mCameraId;
         /* TODO: remove this Camera instance. */
         private final Camera mCamera;
+        private final CameraDeviceInfo.Characteristics mCharacteristics;
         private final AndroidCameraCapabilities mCapabilities;
 
         private AndroidCameraProxyImpl(int cameraId, Camera camera,
+                CameraDeviceInfo.Characteristics characteristics,
                 AndroidCameraCapabilities capabilities) {
             mCamera = camera;
             mCameraId = cameraId;
+            mCharacteristics = characteristics;
             mCapabilities = capabilities;
         }
 
@@ -634,6 +674,11 @@
         }
 
         @Override
+        public CameraDeviceInfo.Characteristics getCharacteristics() {
+            return mCharacteristics;
+        }
+
+        @Override
         public CameraCapabilities getCapabilities() {
             return new AndroidCameraCapabilities(mCapabilities);
         }
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
index db3b1d7..9c3c400 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraAgent.java
@@ -343,6 +343,11 @@
         public int getCameraId();
 
         /**
+         * @return The camera characteristics.
+         */
+        public CameraDeviceInfo.Characteristics getCharacteristics();
+
+        /**
          * @return The camera capabilities.
          */
         public CameraCapabilities getCapabilities();
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
index 60ad8ed..ada1f29 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
@@ -3,18 +3,17 @@
 import android.hardware.Camera;
 
 /**
- * The camera device info.
+ * The device info for all attached cameras.
  */
 public interface CameraDeviceInfo {
 
     static final int NO_DEVICE = -1;
 
     /**
-     * @return The camera info.
-     * // TODO: Remove the dependency on API 1.
+     * @param cameraId Which device to interrogate.
+     * @return The static characteristics of the specified device, or {@code null} on error.
      */
-    @Deprecated
-    Camera.CameraInfo[] getCameraInfos();
+    Characteristics getCharacteristics(int cameraId);
 
     /**
      * @return The total number of the available camera devices.
@@ -32,4 +31,31 @@
      *         if not available.
      */
     int getFirstFrontCameraId();
+
+    /**
+     * Device characteristics for a single camera.
+     */
+    public interface Characteristics {
+        /**
+         * @return Whether the camera faces the back of the device.
+         */
+        boolean isFacingBack();
+
+        /**
+         * @return Whether the camera faces the device's screen.
+         */
+        boolean isFacingFront();
+
+        /**
+         * @return The camera image orientation, or the clockwise rotation angle
+         *         that must be applied to display it in its natural orientation
+         *         (in degrees, and always a multiple of 90).
+         */
+        int getSensorOrientation();
+
+        /**
+         * @return Whether the shutter sound can be disabled.
+         */
+        boolean canDisableShutterSound();
+    }
 }