Camera service: Add skeleton support for camera2 devices.

- Add Camera2Client, which maps the current android.hardware.Camera
  API to the new camera2 semantics
- Add Camera2Device, a C++ wrapper for the HAL camera 2 device

No functionality besides create/destroy; all client methods return
error or null.

Bug: 6243944
Change-Id: I6bd5136fa1efd8279b8cd2d9847d9b0bb2862294
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 03830c4..b273f6f 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -40,6 +40,8 @@
 #include "CameraService.h"
 #include "CameraClient.h"
 #include "CameraHardwareInterface.h"
+#include "Camera2Client.h"
+#include "Camera2Device.h"
 
 namespace android {
 
@@ -134,7 +136,6 @@
 sp<ICamera> CameraService::connect(
         const sp<ICameraClient>& cameraClient, int cameraId) {
     int callingPid = getCallingPid();
-    sp<CameraHardwareInterface> hardware = NULL;
 
     LOG1("CameraService::connect E (pid %d, id %d)", callingPid, cameraId);
 
@@ -190,13 +191,41 @@
     char camera_device_name[10];
     snprintf(camera_device_name, sizeof(camera_device_name), "%d", cameraId);
 
-    hardware = new CameraHardwareInterface(camera_device_name);
-    if (hardware->initialize(&mModule->common) != OK) {
-        hardware.clear();
+    int deviceVersion;
+    if (mModule->common.module_api_version == CAMERA_MODULE_API_VERSION_2_0) {
+        deviceVersion = info.device_version;
+    } else {
+        deviceVersion = CAMERA_DEVICE_API_VERSION_1_0;
+    }
+
+    switch(deviceVersion) {
+    case CAMERA_DEVICE_API_VERSION_1_0: {
+        sp<CameraHardwareInterface> hardware =
+            new CameraHardwareInterface(camera_device_name);
+        if (hardware->initialize(&mModule->common) != OK) {
+            return NULL;
+        }
+
+        client = new CameraClient(this, cameraClient, hardware, cameraId,
+                info.facing, callingPid);
+        break;
+    }
+    case CAMERA_DEVICE_API_VERSION_2_0: {
+        sp<Camera2Device> hardware =
+            new Camera2Device(camera_device_name);
+        if (hardware->initialize(&mModule->common) != OK) {
+            return NULL;
+        }
+
+        client = new Camera2Client(this, cameraClient, hardware, cameraId,
+                info.facing, callingPid);
+        break;
+    }
+    default:
+        ALOGE("Unknown camera device HAL version: %d", deviceVersion);
         return NULL;
     }
 
-    client = new CameraClient(this, cameraClient, hardware, cameraId, info.facing, callingPid);
     mClient[cameraId] = client;
     LOG1("CameraService::connect X (id %d)", cameraId);
     return client;