From 573291c251d9e85f51f7c0fa1cb35baa2969ca17 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Sat, 10 Feb 2018 02:10:56 +0000 Subject: [PATCH] Camera: Add API level to service proxy notification The client API level should be part of the service proxy notifications. Bug: 68653614 Test: Manual using application Change-Id: Id8a9fb51a8ba91795283c846b55a9343cf8505df --- .../android/hardware/ICameraServiceProxy.aidl | 8 +++++++- .../camera/libcameraservice/CameraService.cpp | 16 ++++++++++++---- services/camera/libcameraservice/CameraService.h | 3 ++- .../libcameraservice/api1/CameraClient.cpp | 12 ++++++++---- .../common/Camera2ClientBase.cpp | 8 ++++++-- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/camera/aidl/android/hardware/ICameraServiceProxy.aidl b/camera/aidl/android/hardware/ICameraServiceProxy.aidl index 5dc23eb477..75759489e7 100644 --- a/camera/aidl/android/hardware/ICameraServiceProxy.aidl +++ b/camera/aidl/android/hardware/ICameraServiceProxy.aidl @@ -45,9 +45,15 @@ interface ICameraServiceProxy const int CAMERA_FACING_FRONT = 1; const int CAMERA_FACING_EXTERNAL = 2; + /** + * Values for notifyCameraState api level + */ + const int CAMERA_API_LEVEL_1 = 1; + const int CAMERA_API_LEVEL_2 = 2; + /** * Update the status of a camera device. */ oneway void notifyCameraState(String cameraId, int facing, int newCameraState, - String clientName); + String clientName, int apiLevel); } diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 89ca6bb4dd..1ed66d34f8 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2241,9 +2241,13 @@ status_t CameraService::BasicClient::startCameraOps() { // Transition device availability listeners from PRESENT -> NOT_AVAILABLE sCameraService->updateStatus(StatusInternal::NOT_AVAILABLE, mCameraIdStr); + int apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1; + if (canCastToApiClient(API_2)) { + apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2; + } // Transition device state to OPEN sCameraService->updateProxyDeviceState(ICameraServiceProxy::CAMERA_STATE_OPEN, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, apiLevel); return OK; } @@ -2268,9 +2272,13 @@ status_t CameraService::BasicClient::finishCameraOps() { sCameraService->updateStatus(StatusInternal::PRESENT, mCameraIdStr, rejected); + int apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1; + if (canCastToApiClient(API_2)) { + apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2; + } // Transition device state to CLOSED sCameraService->updateProxyDeviceState(ICameraServiceProxy::CAMERA_STATE_CLOSED, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, apiLevel); } // Always stop watching, even if no camera op is active if (mOpsCallback != NULL) { @@ -2876,11 +2884,11 @@ void CameraService::CameraState::updateStatus(StatusInternal status, } void CameraService::updateProxyDeviceState(int newState, - const String8& cameraId, int facing, const String16& clientName) { + const String8& cameraId, int facing, const String16& clientName, int apiLevel) { sp proxyBinder = getCameraServiceProxy(); if (proxyBinder == nullptr) return; String16 id(cameraId); - proxyBinder->notifyCameraState(id, newState, facing, clientName); + proxyBinder->notifyCameraState(id, newState, facing, clientName, apiLevel); } status_t CameraService::getTorchStatusLocked( diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 81048e696d..3e7b1d4ee9 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -189,7 +189,8 @@ public: int newState, const String8& cameraId, int facing, - const String16& clientName); + const String16& clientName, + int apiLevel); ///////////////////////////////////////////////////////////////////// // CameraDeviceFactory functionality diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index 8c6cd3dfb7..09318654c5 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -262,7 +262,8 @@ binder::Status CameraClient::disconnect() { mHardware->stopPreview(); sCameraService->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_IDLE, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1); mHardware->cancelPicture(); // Release the hardware resources. mHardware->release(); @@ -424,7 +425,8 @@ status_t CameraClient::startPreviewMode() { if (result == NO_ERROR) { sCameraService->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_ACTIVE, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1); } return result; } @@ -467,7 +469,8 @@ void CameraClient::stopPreview() { mHardware->stopPreview(); sCameraService->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_IDLE, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1); mPreviewBuffer.clear(); } @@ -973,7 +976,8 @@ void CameraClient::handleShutter(void) { // idle now, until preview is restarted sCameraService->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_IDLE, - mCameraIdStr, mCameraFacing, mClientPackageName); + mCameraIdStr, mCameraFacing, mClientPackageName, + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1); mLock.unlock(); } diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.cpp b/services/camera/libcameraservice/common/Camera2ClientBase.cpp index db26027534..3266f09cbb 100644 --- a/services/camera/libcameraservice/common/Camera2ClientBase.cpp +++ b/services/camera/libcameraservice/common/Camera2ClientBase.cpp @@ -251,7 +251,9 @@ void Camera2ClientBase::notifyIdle() { if (mDeviceActive) { getCameraService()->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_IDLE, TClientBase::mCameraIdStr, - TClientBase::mCameraFacing, TClientBase::mClientPackageName); + TClientBase::mCameraFacing, TClientBase::mClientPackageName, + ((mApi1CameraId < 0) ? hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2 : + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1)); } mDeviceActive = false; @@ -267,7 +269,9 @@ void Camera2ClientBase::notifyShutter(const CaptureResultExtras& re if (!mDeviceActive) { getCameraService()->updateProxyDeviceState( hardware::ICameraServiceProxy::CAMERA_STATE_ACTIVE, TClientBase::mCameraIdStr, - TClientBase::mCameraFacing, TClientBase::mClientPackageName); + TClientBase::mCameraFacing, TClientBase::mClientPackageName, + ((mApi1CameraId < 0) ? hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2 : + hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1)); } mDeviceActive = true;