Merge "CameraService: fix camera removal paths" am: 930c980043 am: 1f1584afba
am: 714d292393
Change-Id: I2f4b53bbcc9d8f3a6865405a6ac764f2f50a9395
diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp
index 3f64bcc..a1a8cd6 100644
--- a/camera/ndk/impl/ACameraManager.cpp
+++ b/camera/ndk/impl/ACameraManager.cpp
@@ -340,6 +340,9 @@
msg->setString(kCameraIdKey, AString(cameraId));
msg->post();
}
+ if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
+ mDeviceStatusMap.erase(cameraId);
+ }
}
} // namespace android
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 5fc1fa3..536b54d 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -316,6 +316,17 @@
logDeviceAdded(id, "Device added");
}
+void CameraService::removeStates(const String8 id) {
+ if (mFlashlight->hasFlashUnit(id)) {
+ mTorchStatusMap.removeItem(id);
+ }
+
+ {
+ Mutex::Autolock lock(mCameraStatesLock);
+ mCameraStates.erase(id);
+ }
+}
+
void CameraService::onDeviceStatusChanged(const String8& id,
CameraDeviceStatus newHalStatus) {
ALOGI("%s: Status changed for cameraId=%s, newStatus=%d", __FUNCTION__,
@@ -380,6 +391,7 @@
clientToDisconnect->disconnect();
}
+ removeStates(id);
} else {
if (oldStatus == StatusInternal::NOT_PRESENT) {
logDeviceAdded(id, String8::format("Device status changed from %d to %d", oldStatus,
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 575cebf..67db7ec 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -551,8 +551,9 @@
// Eumerate all camera providers in the system
status_t enumerateProviders();
- // Add a new camera to camera and torch state lists
+ // Add a new camera to camera and torch state lists or remove an unplugged one
void addStates(const String8 id);
+ void removeStates(const String8 id);
// Check if we can connect, before we acquire the service lock.
// The returned originalClientPid is the PID of the original process that wants to connect to
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index f2da232..70e7761 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -603,6 +603,15 @@
return OK;
}
+void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
+ for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
+ if ((*it)->mId == id) {
+ mDevices.erase(it);
+ break;
+ }
+ }
+}
+
status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n",
mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough",
@@ -684,6 +693,8 @@
return hardware::Void();
}
addDevice(cameraDeviceName, newStatus, &id);
+ } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
+ removeDevice(id);
}
listener = mManager->getStatusListener();
}
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h
index 0f1f07b..d02abb0 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.h
+++ b/services/camera/libcameraservice/common/CameraProviderManager.h
@@ -387,6 +387,8 @@
// Generate vendor tag id
static metadata_vendor_id_t generateVendorTagId(const std::string &name);
+
+ void removeDevice(std::string id);
};
// Utility to find a DeviceInfo by ID; pointer is only valid while mInterfaceMutex is held