From 7d859d43560b03ec092d781db9b00bb3eb48d55f Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Tue, 6 Nov 2018 15:33:23 -0800 Subject: [PATCH] CameraService: Fix missing torch state callback In case HAL process crashes, addStates() should still send torch state callback to the app if observer is registered. Test: Kill HAL process and observe Flashlight icon in quicksettings Test: Camera CTS Bug: 117949686 Change-Id: Icee1891ef3993ebb0e7eed2dc281db8cd6106e84 --- .../camera/libcameraservice/CameraService.cpp | 17 +++++++++++------ .../camera/libcameraservice/CameraService.h | 2 ++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 2bf42b6381..0b842b66c7 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -208,6 +208,14 @@ void CameraService::pingCameraServiceProxy() { proxyBinder->pingForUserUpdate(); } +void CameraService::broadcastTorchModeStatus(const String8& cameraId, TorchModeStatus status) { + Mutex::Autolock lock(mStatusListenerLock); + + for (auto& i : mListenerList) { + i->onTorchStatusChanged(mapToInterface(status), String16{cameraId}); + } +} + CameraService::~CameraService() { VendorTagDescriptor::clearGlobalVendorTagDescriptor(); mUidPolicy->unregisterSelf(); @@ -246,6 +254,8 @@ void CameraService::addStates(const String8 id) { if (mFlashlight->hasFlashUnit(id)) { Mutex::Autolock al(mTorchStatusMutex); mTorchStatusMap.add(id, TorchModeStatus::AVAILABLE_OFF); + + broadcastTorchModeStatus(id, TorchModeStatus::AVAILABLE_OFF); } updateCameraNumAndIds(); @@ -398,12 +408,7 @@ void CameraService::onTorchStatusChangedLocked(const String8& cameraId, } } - { - Mutex::Autolock lock(mStatusListenerLock); - for (auto& i : mListenerList) { - i->onTorchStatusChanged(mapToInterface(newStatus), String16{cameraId}); - } - } + broadcastTorchModeStatus(cameraId, newStatus); } Status CameraService::getNumberOfCameras(int32_t type, int32_t* numCameras) { diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 8d4bcdbb0e..624d1ca9d1 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -857,6 +857,8 @@ private: static sp getCameraServiceProxy(); static void pingCameraServiceProxy(); + void broadcastTorchModeStatus(const String8& cameraId, + hardware::camera::common::V1_0::TorchModeStatus status); }; } // namespace android