Camera: Fix onCameraOpened/onCameraClosed callback
Add client package id in the CameraStatus interface, so that
addListener will return the currently opened cameras if the
client has the permission.
Bug: 193475498
Test: testCameraManagerListenerCallbacks
Change-Id: Ic78b80526c3f55a450caa54e27c3d36265b127b9
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index cc01ab2..c42dbc0 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -2375,7 +2375,8 @@
Mutex::Autolock lock(mCameraStatesLock);
for (auto& i : mCameraStates) {
cameraStatuses->emplace_back(i.first,
- mapToInterface(i.second->getStatus()), i.second->getUnavailablePhysicalIds());
+ mapToInterface(i.second->getStatus()), i.second->getUnavailablePhysicalIds(),
+ openCloseCallbackAllowed ? i.second->getClientPackage() : String8::empty());
}
}
// Remove the camera statuses that should be hidden from the client, we do
@@ -3721,6 +3722,16 @@
return count > 0;
}
+void CameraService::CameraState::setClientPackage(const String8& clientPackage) {
+ Mutex::Autolock lock(mStatusLock);
+ mClientPackage = clientPackage;
+}
+
+String8 CameraService::CameraState::getClientPackage() const {
+ Mutex::Autolock lock(mStatusLock);
+ return mClientPackage;
+}
+
// ----------------------------------------------------------------------------
// ClientEventListener
// ----------------------------------------------------------------------------
@@ -4284,6 +4295,18 @@
void CameraService::updateOpenCloseStatus(const String8& cameraId, bool open,
const String16& clientPackageName) {
+ auto state = getCameraState(cameraId);
+ if (state == nullptr) {
+ ALOGW("%s: Could not update the status for %s, no such device exists", __FUNCTION__,
+ cameraId.string());
+ return;
+ }
+ if (open) {
+ state->setClientPackage(String8(clientPackageName));
+ } else {
+ state->setClientPackage(String8::empty());
+ }
+
Mutex::Autolock lock(mStatusListenerLock);
for (const auto& it : mListenerList) {