Camera: Switch camera2 to auto-gen C++ binder interfaces

 - Move camera service AIDL files to frameworks/av
 - Build C++ interface stubs with AIDL tools
 - Add necessary native-side parcelables and update existing ones
 - Remove manually-written stubs, rearrange remaining manual stubs
 - Adjust implementations to work with auto-generated stubs
   - Adjust method signatures for auto-gen differences
   - Add rich error messages using binder::Status

Bug: 25091611
Change-Id: I6f69f34b9d1a3f8d1fb7db87357363f8fa8483ff
diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp
index ed5c3ba..6fa0864 100644
--- a/camera/ndk/impl/ACameraManager.cpp
+++ b/camera/ndk/impl/ACameraManager.cpp
@@ -71,7 +71,7 @@
     mCameraService.clear();
 }
 
-sp<ICameraService> CameraManagerGlobal::getCameraService() {
+sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
     Mutex::Autolock _l(mLock);
     if (mCameraService.get() == nullptr) {
         sp<IServiceManager> sm = defaultServiceManager();
@@ -88,7 +88,7 @@
             mDeathNotifier = new DeathNotifier(this);
         }
         binder->linkToDeath(mDeathNotifier);
-        mCameraService = interface_cast<ICameraService>(binder);
+        mCameraService = interface_cast<hardware::ICameraService>(binder);
 
         // Setup looper thread to perfrom availiability callbacks
         if (mCbLooper == nullptr) {
@@ -111,22 +111,23 @@
         mCameraService->addListener(mCameraServiceListener);
 
         // setup vendor tags
-        sp<VendorTagDescriptor> desc;
-        status_t ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc);
+        sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
+        binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
 
-        if (ret == OK) {
-            ret = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
-            if (ret != OK) {
+        if (ret.isOk()) {
+            status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
+            if (err != OK) {
                 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
-                        __FUNCTION__, strerror(-ret), ret);
+                        __FUNCTION__, strerror(-err), err);
             }
-        } else if (ret == -EOPNOTSUPP) {
+        } else if (ret.serviceSpecificErrorCode() ==
+                hardware::ICameraService::ERROR_DEPRECATED_HAL) {
             ALOGW("%s: Camera HAL too old; does not support vendor tags",
                     __FUNCTION__);
             VendorTagDescriptor::clearGlobalVendorTagDescriptor();
         } else {
-            ALOGE("%s: Failed to get vendor tag descriptors, received error %s (%d)",
-                    __FUNCTION__, strerror(-ret), ret);
+            ALOGE("%s: Failed to get vendor tag descriptors: %s",
+                    __FUNCTION__, ret.toString8().string());
         }
     }
     ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
@@ -142,7 +143,7 @@
         for (auto pair : cm->mDeviceStatusMap) {
             int32_t cameraId = pair.first;
             cm->onStatusChangedLocked(
-                    ICameraServiceListener::STATUS_NOT_PRESENT, cameraId);
+                    CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
         }
         cm->mCameraService.clear();
         // TODO: consider adding re-connect call here?
@@ -158,7 +159,7 @@
     if (pair.second) {
         for (auto pair : mDeviceStatusMap) {
             int32_t cameraId = pair.first;
-            Status status = pair.second;
+            int32_t status = pair.second;
 
             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
             ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
@@ -178,21 +179,21 @@
     mCallbacks.erase(cb);
 }
 
-bool CameraManagerGlobal::validStatus(Status status) {
+bool CameraManagerGlobal::validStatus(int32_t status) {
     switch (status) {
-        case ICameraServiceListener::STATUS_NOT_PRESENT:
-        case ICameraServiceListener::STATUS_PRESENT:
-        case ICameraServiceListener::STATUS_ENUMERATING:
-        case ICameraServiceListener::STATUS_NOT_AVAILABLE:
+        case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
+        case hardware::ICameraServiceListener::STATUS_PRESENT:
+        case hardware::ICameraServiceListener::STATUS_ENUMERATING:
+        case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
             return true;
         default:
             return false;
     }
 }
 
-bool CameraManagerGlobal::isStatusAvailable(Status status) {
+bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
     switch (status) {
-        case ICameraServiceListener::STATUS_PRESENT:
+        case hardware::ICameraServiceListener::STATUS_PRESENT:
             return true;
         default:
             return false;
@@ -239,31 +240,32 @@
     }
 }
 
-void CameraManagerGlobal::CameraServiceListener::onStatusChanged(
-        Status status, int32_t cameraId) {
+binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
+        int32_t status, int32_t cameraId) {
     sp<CameraManagerGlobal> cm = mCameraManager.promote();
-    if (cm == nullptr) {
+    if (cm != nullptr) {
+        cm->onStatusChanged(status, cameraId);
+    } else {
         ALOGE("Cannot deliver status change. Global camera manager died");
-        return;
     }
-    cm->onStatusChanged(status, cameraId);
+    return binder::Status::ok();
 }
 
 void CameraManagerGlobal::onStatusChanged(
-        Status status, int32_t cameraId) {
+        int32_t status, int32_t cameraId) {
     Mutex::Autolock _l(mLock);
     onStatusChangedLocked(status, cameraId);
 }
 
 void CameraManagerGlobal::onStatusChangedLocked(
-        Status status, int32_t cameraId) {
+        int32_t status, int32_t cameraId) {
         if (!validStatus(status)) {
             ALOGE("%s: Invalid status %d", __FUNCTION__, status);
             return;
         }
 
         bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
-        Status oldStatus = firstStatus ?
+        int32_t oldStatus = firstStatus ?
                 status : // first status
                 mDeviceStatusMap[cameraId];
 
@@ -296,19 +298,28 @@
     if (mCachedCameraIdList.numCameras == kCameraIdListNotInit) {
         int numCameras = 0;
         Vector<char *> cameraIds;
-        sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+        sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
         if (cs == nullptr) {
             ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
             return ACAMERA_ERROR_CAMERA_DISCONNECTED;
         }
         // Get number of cameras
-        int numAllCameras = cs->getNumberOfCameras(ICameraService::CAMERA_TYPE_ALL);
+        int numAllCameras = 0;
+        binder::Status serviceRet = cs->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL,
+                &numAllCameras);
+        if (!serviceRet.isOk()) {
+            ALOGE("%s: Error getting camera count: %s", __FUNCTION__,
+                    serviceRet.toString8().string());
+            numAllCameras = 0;
+        }
         // Filter API2 compatible cameras and push to cameraIds
         for (int i = 0; i < numAllCameras; i++) {
             // TODO: Only suppot HALs that supports API2 directly now
-            status_t camera2Support = cs->supportsCameraApi(i, ICameraService::API_VERSION_2);
+            bool camera2Support = false;
+            serviceRet = cs->supportsCameraApi(i, hardware::ICameraService::API_VERSION_2,
+                    &camera2Support);
             char buf[kMaxCameraIdLen];
-            if (camera2Support == OK) {
+            if (camera2Support) {
                 numCameras++;
                 mCameraIds.insert(i);
                 snprintf(buf, sizeof(buf), "%d", i);
@@ -401,15 +412,16 @@
         ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
         return ACAMERA_ERROR_INVALID_PARAMETER;
     }
-    sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+    sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
     if (cs == nullptr) {
         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
     }
     CameraMetadata rawMetadata;
-    status_t serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata);
-    if (serviceRet != OK) {
-        ALOGE("Get camera characteristics from camera service failed! Err %d", ret);
+    binder::Status serviceRet = cs->getCameraCharacteristics(cameraId, &rawMetadata);
+    if (!serviceRet.isOk()) {
+        ALOGE("Get camera characteristics from camera service failed: %s",
+                serviceRet.toString8().string());
         return ACAMERA_ERROR_UNKNOWN; // should not reach here
     }
 
@@ -436,24 +448,23 @@
 
     ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars));
 
-    sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+    sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
     if (cs == nullptr) {
         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
     }
 
     int id = atoi(cameraId);
-    sp<ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
-    sp<ICameraDeviceUser> deviceRemote;
+    sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
+    sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
     // No way to get package name from native.
     // Send a zero length package name and let camera service figure it out from UID
-    status_t serviceRet = cs->connectDevice(
+    binder::Status serviceRet = cs->connectDevice(
             callbacks, id, String16(""),
-            ICameraService::USE_CALLING_UID, /*out*/deviceRemote);
+            hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote);
 
-    if (serviceRet != OK) {
-        ALOGE("%s: connect camera device failed! err %d", __FUNCTION__, serviceRet);
-        // TODO: generate better error message here
+    if (!serviceRet.isOk()) {
+        ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
         delete device;
         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
     }
@@ -476,4 +487,3 @@
         delete[] mCachedCameraIdList.cameraIds;
     }
 }
-