Merge "Camera2: Implement CameraManager#getCameraCharacteristics" into klp-dev
diff --git a/core/java/android/hardware/ICameraService.aidl b/core/java/android/hardware/ICameraService.aidl
index fc54828..542af6a 100644
--- a/core/java/android/hardware/ICameraService.aidl
+++ b/core/java/android/hardware/ICameraService.aidl
@@ -22,6 +22,7 @@
 import android.hardware.IProCameraCallbacks;
 import android.hardware.camera2.ICameraDeviceUser;
 import android.hardware.camera2.ICameraDeviceCallbacks;
+import android.hardware.camera2.impl.CameraMetadataNative;
 import android.hardware.camera2.utils.BinderHolder;
 import android.hardware.ICameraServiceListener;
 import android.hardware.CameraInfo;
@@ -58,4 +59,6 @@
 
     int addListener(ICameraServiceListener listener);
     int removeListener(ICameraServiceListener listener);
+
+    int getCameraCharacteristics(int cameraId, out CameraMetadataNative info);
 }
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index af0512e..798ad7b 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -176,10 +176,17 @@
             }
         }
 
-        // TODO: implement and call a service function to get the capabilities on C++ side
+        CameraMetadataNative info = new CameraMetadataNative();
+        try {
+            mCameraService.getCameraCharacteristics(Integer.valueOf(cameraId), info);
+        } catch(CameraRuntimeException e) {
+            throw e.asChecked();
+        } catch(RemoteException e) {
+            // impossible
+            return null;
+        }
 
-        // TODO: get properties from service
-        return new CameraCharacteristics(new CameraMetadataNative());
+        return new CameraCharacteristics(info);
     }
 
     /**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
index 9d8489c..aef61c7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
@@ -68,6 +68,7 @@
     }
 
     class IsMetadataNotEmpty extends ArgumentMatcher<CameraMetadataNative> {
+        @Override
         public boolean matches(Object obj) {
             return !((CameraMetadataNative) obj).isEmpty();
         }
@@ -273,6 +274,17 @@
     }
 
     @SmallTest
+    public void testCameraCharacteristics() throws RemoteException {
+        CameraMetadataNative info = new CameraMetadataNative();
+
+        int status = mUtils.getCameraService().getCameraCharacteristics(mCameraId, /*out*/info);
+        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
+
+        assertFalse(info.isEmpty());
+        assertNotNull(info.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
+    }
+
+    @SmallTest
     public void testWaitUntilIdle() throws Exception {
         CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
         int requestIdStreaming = submitCameraRequest(builder.build(), /* streaming */true);