Camera: Re-enumarate new providers
Camera service should enumarate newly added
camera providers.
Bug: 37592461
Test: Manual using camera application
Change-Id: I4c886b99127d23148c70ce1e1e773cb8393d91b4
diff --git a/services/camera/libcameraservice/CameraFlashlight.cpp b/services/camera/libcameraservice/CameraFlashlight.cpp
index 836972a..e06a81f 100644
--- a/services/camera/libcameraservice/CameraFlashlight.cpp
+++ b/services/camera/libcameraservice/CameraFlashlight.cpp
@@ -93,10 +93,6 @@
}
if (mFlashControl == NULL) {
- if (enabled == false) {
- return OK;
- }
-
res = createFlashlightControl(cameraId);
if (res) {
return res;
@@ -139,10 +135,14 @@
cameraIds[i] = String8(ids[i].c_str());
}
- mHasFlashlightMap.clear();
- mFlashlightMapInitialized = false;
+ mFlashControl.clear();
for (auto &id : cameraIds) {
+ ssize_t index = mHasFlashlightMap.indexOfKey(id);
+ if (0 <= index) {
+ continue;
+ }
+
bool hasFlash = false;
res = createFlashlightControl(id);
if (res) {
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 0031441..415fdf5 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -198,13 +198,17 @@
}
status_t CameraService::enumerateProviders() {
- mCameraProviderManager = new CameraProviderManager();
status_t res;
- res = mCameraProviderManager->initialize(this);
- if (res != OK) {
- ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
- __FUNCTION__, strerror(-res), res);
- return res;
+ Mutex::Autolock l(mServiceLock);
+
+ if (nullptr == mCameraProviderManager.get()) {
+ mCameraProviderManager = new CameraProviderManager();
+ res = mCameraProviderManager->initialize(this);
+ if (res != OK) {
+ ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
+ __FUNCTION__, strerror(-res), res);
+ return res;
+ }
}
mNumberOfCameras = mCameraProviderManager->getCameraCount();
@@ -216,15 +220,25 @@
// TODO: maybe put this into CameraProviderManager::initialize()?
mCameraProviderManager->setUpVendorTags();
- mFlashlight = new CameraFlashlight(mCameraProviderManager, this);
+ if (nullptr == mFlashlight.get()) {
+ mFlashlight = new CameraFlashlight(mCameraProviderManager, this);
+ }
+
res = mFlashlight->findFlashUnits();
if (res != OK) {
ALOGE("Failed to enumerate flash units: %s (%d)", strerror(-res), res);
}
- // TODO: Verify device versions are in support
-
for (auto& cameraId : mCameraProviderManager->getCameraDeviceIds()) {
+ String8 id8 = String8(cameraId.c_str());
+ {
+ Mutex::Autolock lock(mCameraStatesLock);
+ auto iter = mCameraStates.find(id8);
+ if (iter != mCameraStates.end()) {
+ continue;
+ }
+ }
+
hardware::camera::common::V1_0::CameraResourceCost cost;
res = mCameraProviderManager->getResourceCost(cameraId, &cost);
if (res != OK) {
@@ -235,22 +249,19 @@
for (size_t i = 0; i < cost.conflictingDevices.size(); i++) {
conflicting.emplace(String8(cost.conflictingDevices[i].c_str()));
}
- String8 id8 = String8(cameraId.c_str());
Mutex::Autolock lock(mCameraStatesLock);
mCameraStates.emplace(id8,
std::make_shared<CameraState>(id8, cost.resourceCost, conflicting));
if (mFlashlight->hasFlashUnit(id8)) {
- mTorchStatusMap.add(id8,
- TorchModeStatus::AVAILABLE_OFF);
+ mTorchStatusMap.add(id8, TorchModeStatus::AVAILABLE_OFF);
}
}
return OK;
}
-
sp<ICameraServiceProxy> CameraService::getCameraServiceProxy() {
sp<ICameraServiceProxy> proxyBinder = nullptr;
#ifndef __BRILLO__
@@ -276,6 +287,10 @@
VendorTagDescriptor::clearGlobalVendorTagDescriptor();
}
+void CameraService::onNewProviderRegistered() {
+ enumerateProviders();
+}
+
void CameraService::onDeviceStatusChanged(const String8& id,
CameraDeviceStatus newHalStatus) {
ALOGI("%s: Status changed for cameraId=%s, newStatus=%d", __FUNCTION__,
@@ -407,6 +422,7 @@
Status CameraService::getNumberOfCameras(int32_t type, int32_t* numCameras) {
ATRACE_CALL();
+ Mutex::Autolock l(mServiceLock);
switch (type) {
case CAMERA_TYPE_BACKWARD_COMPATIBLE:
*numCameras = mNumberOfNormalCameras;
@@ -426,6 +442,8 @@
Status CameraService::getCameraInfo(int cameraId,
CameraInfo* cameraInfo) {
ATRACE_CALL();
+ Mutex::Autolock l(mServiceLock);
+
if (!mInitialized) {
return STATUS_ERROR(ERROR_DISCONNECTED,
"Camera subsystem is not available");
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 7d81993..87603a3 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -99,6 +99,7 @@
hardware::camera::common::V1_0::CameraDeviceStatus newHalStatus) override;
virtual void onTorchStatusChanged(const String8& cameraId,
hardware::camera::common::V1_0::TorchModeStatus newStatus) override;
+ virtual void onNewProviderRegistered() override;
/////////////////////////////////////////////////////////////////////
// ICameraService
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 38fe1b6..65633db 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -231,7 +231,6 @@
status_t CameraProviderManager::setUpVendorTags() {
sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
- VendorTagDescriptorCache::clearGlobalVendorTagCache();
for (auto& provider : mProviders) {
hardware::hidl_vec<VendorTagSection> vts;
Status status;
@@ -331,9 +330,17 @@
const hardware::hidl_string& /*fqName*/,
const hardware::hidl_string& name,
bool /*preexisting*/) {
- std::lock_guard<std::mutex> lock(mInterfaceMutex);
+ {
+ std::lock_guard<std::mutex> lock(mInterfaceMutex);
- addProviderLocked(name);
+ addProviderLocked(name);
+ }
+
+ sp<StatusListener> listener = getStatusListener();
+ if (nullptr != listener.get()) {
+ listener->onNewProviderRegistered();
+ }
+
return hardware::Return<void>();
}
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h
index 3afc1d9..9ba7f91 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.h
+++ b/services/camera/libcameraservice/common/CameraProviderManager.h
@@ -106,6 +106,7 @@
hardware::camera::common::V1_0::CameraDeviceStatus newStatus) = 0;
virtual void onTorchStatusChanged(const String8 &cameraId,
hardware::camera::common::V1_0::TorchModeStatus newStatus) = 0;
+ virtual void onNewProviderRegistered() = 0;
};
/**