1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "hcamera_host_manager.h"
17 
18 #include "camera_report_uitls.h"
19 #include "camera_util.h"
20 #include "display_manager.h"
21 #include "hcamera_device.h"
22 #include "icamera_service_callback.h"
23 #include "ipc_skeleton.h"
24 #include "iproxy_broker.h"
25 #include "metadata_utils.h"
26 #include "os_account_manager.h"
27 #include "v1_2/icamera_host_callback.h"
28 
29 namespace OHOS {
30 namespace CameraStandard {
31 
32 const std::string HCameraHostManager::LOCAL_SERVICE_NAME = "camera_service";
33 const std::string HCameraHostManager::DISTRIBUTED_SERVICE_NAME = "distributed_camera_provider_service";
34 
35 using namespace OHOS::HDI::Camera::V1_0;
36 struct HCameraHostManager::CameraDeviceInfo {
37     std::string cameraId;
38     std::shared_ptr<OHOS::Camera::CameraMetadata> ability;
39     std::mutex mutex;
40 
CameraDeviceInfoOHOS::CameraStandard::HCameraHostManager::CameraDeviceInfo41     explicit CameraDeviceInfo(const std::string& cameraId, sptr<ICameraDevice> device = nullptr)
42         : cameraId(cameraId), ability(nullptr)
43     {
44     }
45 
46     ~CameraDeviceInfo() = default;
47 };
48 
49 class HCameraHostManager::CameraHostInfo : public OHOS::HDI::Camera::V1_2::ICameraHostCallback {
50 public:
51     class CameraHostDeathRecipient : public IRemoteObject::DeathRecipient {
52     public:
CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> &hostInfo)53         explicit CameraHostDeathRecipient(const sptr<HCameraHostManager::CameraHostInfo> &hostInfo)
54             : cameraHostInfo_(hostInfo)
55         {
56         }
57         virtual ~CameraHostDeathRecipient() = default;
58         void OnRemoteDied(const wptr<IRemoteObject> &remote) override
59         {
60             MEDIA_ERR_LOG("Remote died, do clean works.");
61             auto cameraHostInfo = cameraHostInfo_.promote();
62             if (cameraHostInfo == nullptr) {
63                 return;
64             }
65             cameraHostInfo->NotifyCameraHostDied();
66             cameraHostInfo->CameraHostDied();
67         }
68 
69     private:
70         wptr<HCameraHostManager::CameraHostInfo> cameraHostInfo_;
71     };
72 
CameraHostInfo(std::shared_ptr<StatusCallback> statusCallback, std::shared_ptr<CameraHostDeadCallback> cameraHostDeadCallback, std::string name)73     explicit CameraHostInfo(std::shared_ptr<StatusCallback> statusCallback,
74         std::shared_ptr<CameraHostDeadCallback> cameraHostDeadCallback, std::string name)
75         : statusCallback_(statusCallback), cameraHostDeadCallback_(cameraHostDeadCallback), name_(std::move(name)),
76           majorVer_(0), minorVer_(0), cameraHostProxy_(nullptr) {};
77     ~CameraHostInfo();
78     bool Init();
79     void CameraHostDied();
80     bool IsCameraSupported(const std::string& cameraId);
81     const std::string& GetName();
82     int32_t GetCameraHostVersion();
83     int32_t GetCameras(std::vector<std::string>& cameraIds);
84     int32_t GetCameraAbility(std::string& cameraId, std::shared_ptr<OHOS::Camera::CameraMetadata>& ability);
85     int32_t OpenCamera(std::string& cameraId, const sptr<ICameraDeviceCallback>& callback,
86                        sptr<OHOS::HDI::Camera::V1_0::ICameraDevice>& pDevice, bool isEnableSecCam = false);
87     int32_t SetFlashlight(const std::string& cameraId, bool isEnable);
88     int32_t SetTorchLevel(float level);
89     int32_t Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam, bool muteMode);
90     int32_t PreCameraSwitch(const std::string& cameraId);
91     bool IsNeedRestore(int32_t opMode,
92         std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings, std::string& cameraId);
93     void NotifyDeviceStateChangeInfo(int notifyType, int deviceState);
94     bool CheckUserHasChanged(std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings);
95 
96     int32_t GetCameraResourceCost(const std::string& cameraId,
97         OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost);
98 
99     // CameraHostCallbackStub
100     int32_t OnCameraStatus(const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status) override;
101     int32_t OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status) override;
102     int32_t OnFlashlightStatus_V1_2(FlashlightStatus status) override;
103     int32_t OnCameraEvent(const std::string &cameraId, CameraEvent event) override;
104 
105 private:
106     std::shared_ptr<CameraDeviceInfo> FindCameraDeviceInfo(const std::string& cameraId);
107     void NotifyCameraHostDied();
108     void AddDevice(const std::string& cameraId);
109     void RemoveDevice(const std::string& cameraId);
110     void Cast2MultiVersionCameraHost();
111     void UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting);
112 
113     std::weak_ptr<StatusCallback> statusCallback_;
114     std::weak_ptr<CameraHostDeadCallback> cameraHostDeadCallback_;
115     std::string name_;
116     uint32_t majorVer_;
117     uint32_t minorVer_;
118     sptr<OHOS::HDI::Camera::V1_0::ICameraHost> cameraHostProxy_;
119     sptr<OHOS::HDI::Camera::V1_1::ICameraHost> cameraHostProxyV1_1_;
120     sptr<OHOS::HDI::Camera::V1_2::ICameraHost> cameraHostProxyV1_2_;
121     sptr<OHOS::HDI::Camera::V1_3::ICameraHost> cameraHostProxyV1_3_;
122 
123     sptr<CameraHostDeathRecipient> cameraHostDeathRecipient_ = nullptr;
124 
125     std::mutex mutex_;
126     std::vector<std::string> cameraIds_;
127     std::vector<std::shared_ptr<CameraDeviceInfo>> devices_;
128 };
129 
~CameraHostInfo()130 HCameraHostManager::CameraHostInfo::~CameraHostInfo()
131 {
132     std::lock_guard<std::mutex> lock(mutex_);
133     MEDIA_INFO_LOG("CameraHostInfo ~CameraHostInfo");
134     if (cameraHostProxy_ && cameraHostDeathRecipient_) {
135         const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<ICameraHost>(cameraHostProxy_);
136         remote->RemoveDeathRecipient(cameraHostDeathRecipient_);
137         cameraHostDeathRecipient_ = nullptr;
138     }
139     cameraHostProxy_ = nullptr;
140     cameraHostProxyV1_1_ = nullptr;
141     cameraHostProxyV1_2_ = nullptr;
142     cameraHostProxyV1_3_ = nullptr;
143     for (unsigned i = 0; i < devices_.size(); i++) {
144         devices_.at(i) = nullptr;
145     }
146     cameraIds_.clear();
147     devices_.clear();
148 }
149 
Cast2MultiVersionCameraHost()150 void HCameraHostManager::CameraHostInfo::Cast2MultiVersionCameraHost()
151 {
152     cameraHostProxy_->GetVersion(majorVer_, minorVer_);
153     MEDIA_INFO_LOG("CameraHostInfo::Init cameraHostProxy_version %{public}u _ %{public}u", majorVer_, minorVer_);
154     if (GetCameraHostVersion() > GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
155         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_3");
156         auto castResult_V1_3 = OHOS::HDI::Camera::V1_3::ICameraHost::CastFrom(cameraHostProxy_);
157         if (castResult_V1_3 != nullptr) {
158             cameraHostProxyV1_3_ = castResult_V1_3;
159         }
160     }
161     if (GetCameraHostVersion() > GetVersionId(1, 1)) {
162         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_2");
163         auto castResult_V1_2 = OHOS::HDI::Camera::V1_2::ICameraHost::CastFrom(cameraHostProxy_);
164         if (castResult_V1_2 != nullptr) {
165             cameraHostProxyV1_2_ = castResult_V1_2;
166         }
167     }
168     if (GetCameraHostVersion() > GetVersionId(1, 0)) {
169         MEDIA_DEBUG_LOG("CameraHostInfo::Init ICameraHost cast to V1_1");
170         auto castResult_V1_1 = OHOS::HDI::Camera::V1_1::ICameraHost::CastFrom(cameraHostProxy_);
171         if (castResult_V1_1 != nullptr) {
172             cameraHostProxyV1_1_ = castResult_V1_1;
173         }
174     }
175 }
176 
Init()177 bool HCameraHostManager::CameraHostInfo::Init()
178 {
179     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ != nullptr, true, "CameraHostInfo::Init, no camera host proxy");
180     cameraHostProxy_ = OHOS::HDI::Camera::V1_0::ICameraHost::Get(name_.c_str(), false);
181     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, false, "Failed to get ICameraHost");
182     Cast2MultiVersionCameraHost();
183 
184     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
185         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_3");
186         cameraHostProxyV1_3_->SetCallback_V1_2(this);
187     } else if (cameraHostProxyV1_2_ != nullptr &&
188         GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
189         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_2");
190         cameraHostProxyV1_2_->SetCallback_V1_2(this);
191     } else {
192         MEDIA_DEBUG_LOG("CameraHostInfo::Init SetCallback ICameraHost V1_0");
193         cameraHostProxy_->SetCallback(this);
194     }
195     cameraHostDeathRecipient_ = new CameraHostDeathRecipient(this);
196     const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ICameraHost>(cameraHostProxy_);
197     if (!remote->AddDeathRecipient(cameraHostDeathRecipient_)) {
198         MEDIA_ERR_LOG("AddDeathRecipient for CameraHost failed.");
199     }
200     std::lock_guard<std::mutex> lock(mutex_);
201     CamRetCode ret = (CamRetCode)(cameraHostProxy_->GetCameraIds(cameraIds_));
202     if (ret != HDI::Camera::V1_0::NO_ERROR) {
203         MEDIA_ERR_LOG("Init, GetCameraIds failed, ret = %{public}d", ret);
204         CameraReportUtils::ReportCameraError(
205             "CameraHostInfo::Init", ret, true, CameraReportUtils::GetCallerInfo());
206         return false;
207     }
208     for (const auto& cameraId : cameraIds_) {
209         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
210     }
211     return true;
212 }
213 
CameraHostDied()214 void HCameraHostManager::CameraHostInfo::CameraHostDied()
215 {
216     auto hostDeadCallback = cameraHostDeadCallback_.lock();
217     CHECK_ERROR_RETURN_LOG(hostDeadCallback == nullptr,
218         "%{public}s CameraHostDied but hostDeadCallback is null.", name_.c_str());
219     hostDeadCallback->OnCameraHostDied(name_);
220 }
221 
IsCameraSupported(const std::string& cameraId)222 bool HCameraHostManager::CameraHostInfo::IsCameraSupported(const std::string& cameraId)
223 {
224     std::lock_guard<std::mutex> lock(mutex_);
225     return std::any_of(cameraIds_.begin(), cameraIds_.end(),
226                        [&cameraId](const auto& camId) { return camId == cameraId; });
227 }
228 
GetName()229 const std::string& HCameraHostManager::CameraHostInfo::GetName()
230 {
231     return name_;
232 }
233 
GetCameraHostVersion()234 int32_t HCameraHostManager::CameraHostInfo::GetCameraHostVersion()
235 {
236     MEDIA_INFO_LOG("cameraHostProxy_ GetVersion majorVer_: %{public}u, minorVers_: %{public}u", majorVer_, minorVer_);
237     return GetVersionId(majorVer_, minorVer_);
238 }
239 
GetCameras(std::vector<std::string>& cameraIds)240 int32_t HCameraHostManager::CameraHostInfo::GetCameras(std::vector<std::string>& cameraIds)
241 {
242     std::lock_guard<std::mutex> lock(mutex_);
243     cameraIds.insert(cameraIds.end(), cameraIds_.begin(), cameraIds_.end());
244     return CAMERA_OK;
245 }
246 
GetCameraAbility(std::string& cameraId, std::shared_ptr<OHOS::Camera::CameraMetadata>& ability)247 int32_t HCameraHostManager::CameraHostInfo::GetCameraAbility(std::string& cameraId,
248     std::shared_ptr<OHOS::Camera::CameraMetadata>& ability)
249 {
250     auto deviceInfo = FindCameraDeviceInfo(cameraId);
251     CHECK_ERROR_RETURN_RET_LOG(deviceInfo == nullptr, CAMERA_UNKNOWN_ERROR,
252         "CameraHostInfo::GetCameraAbility deviceInfo is null");
253     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
254     if (deviceInfo->ability) {
255         ability = deviceInfo->ability;
256     } else {
257         CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
258             "CameraHostInfo::GetCameraAbility cameraHostProxy_ is null");
259         if (!deviceInfo->ability) {
260             std::vector<uint8_t> cameraAbility;
261             CamRetCode rc = (CamRetCode)(cameraHostProxy_->GetCameraAbility(cameraId, cameraAbility));
262             if (rc != HDI::Camera::V1_0::NO_ERROR) {
263                 MEDIA_ERR_LOG("CameraHostInfo::GetCameraAbility failed with error Code:%{public}d", rc);
264                 CameraReportUtils::ReportCameraError(
265                     "CameraHostInfo::GetCameraAbility", rc, true, CameraReportUtils::GetCallerInfo());
266                 return HdiToServiceError(rc);
267             }
268             OHOS::Camera::MetadataUtils::ConvertVecToMetadata(cameraAbility, ability);
269             deviceInfo->ability = ability;
270         }
271     }
272     return CAMERA_OK;
273 }
274 
OpenCamera(std::string& cameraId, const sptr<ICameraDeviceCallback>& callback, sptr<OHOS::HDI::Camera::V1_0::ICameraDevice>& pDevice, bool isEnableSecCam)275 int32_t HCameraHostManager::CameraHostInfo::OpenCamera(std::string& cameraId,
276     const sptr<ICameraDeviceCallback>& callback,
277     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice>& pDevice,
278     bool isEnableSecCam)
279 {
280     MEDIA_INFO_LOG("CameraHostInfo::OpenCamera %{public}s", cameraId.c_str());
281     auto deviceInfo = FindCameraDeviceInfo(cameraId);
282     CHECK_ERROR_RETURN_RET_LOG(deviceInfo == nullptr, CAMERA_UNKNOWN_ERROR,
283         "CameraHostInfo::GetCameraAbility deviceInfo is null");
284     std::lock_guard<std::mutex> lock(deviceInfo->mutex);
285     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
286         "CameraHostInfo::OpenCamera cameraHostProxy_ is null");
287     CamRetCode rc;
288     // try to get higher version
289     sptr<OHOS::HDI::Camera::V1_1::ICameraDevice> hdiDevice_v1_1;
290     sptr<OHOS::HDI::Camera::V1_2::ICameraDevice> hdiDevice_v1_2;
291     sptr<OHOS::HDI::Camera::V1_3::ICameraDevice> hdiDevice_v1_3;
292     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() >= GetVersionId(HDI_VERSION_1, HDI_VERSION_3)) {
293         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_3");
294         if (isEnableSecCam) {
295             MEDIA_INFO_LOG("CameraHostInfo::OpenCamera OpenSecureCamera");
296             rc = (CamRetCode)(cameraHostProxyV1_3_->OpenSecureCamera(cameraId, callback, hdiDevice_v1_3));
297         } else {
298             rc = (CamRetCode)(cameraHostProxyV1_3_->OpenCamera_V1_3(cameraId, callback, hdiDevice_v1_3));
299         }
300         pDevice = hdiDevice_v1_3.GetRefPtr();
301     } else if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() >=
302         GetVersionId(HDI_VERSION_1, HDI_VERSION_2)) {
303         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_2");
304         rc = (CamRetCode)(cameraHostProxyV1_2_->OpenCamera_V1_2(cameraId, callback, hdiDevice_v1_2));
305         pDevice = hdiDevice_v1_2.GetRefPtr();
306     } else if (cameraHostProxyV1_1_ != nullptr
307         && GetCameraHostVersion() == GetVersionId(HDI_VERSION_1, HDI_VERSION_1)) {
308         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_1");
309         rc = (CamRetCode)(cameraHostProxyV1_1_->OpenCamera_V1_1(cameraId, callback, hdiDevice_v1_1));
310         pDevice = hdiDevice_v1_1.GetRefPtr();
311     } else {
312         MEDIA_DEBUG_LOG("CameraHostInfo::OpenCamera ICameraDevice V1_0");
313         rc = (CamRetCode)(cameraHostProxy_->OpenCamera(cameraId, callback, pDevice));
314     }
315     if (rc != HDI::Camera::V1_0::NO_ERROR) {
316         MEDIA_ERR_LOG("CameraHostInfo::OpenCamera failed with error Code:%{public}d", rc);
317         CameraReportUtils::ReportCameraError(
318             "CameraHostInfo::OpenCamera", rc, true, CameraReportUtils::GetCallerInfo());
319         pDevice = nullptr;
320         return HdiToServiceError(rc);
321     }
322     return CAMERA_OK;
323 }
324 
SetFlashlight(const std::string& cameraId, bool isEnable)325 int32_t HCameraHostManager::CameraHostInfo::SetFlashlight(const std::string& cameraId, bool isEnable)
326 {
327     std::lock_guard<std::mutex> lock(mutex_);
328     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
329         "CameraHostInfo::SetFlashlight cameraHostProxy_ is null");
330     CamRetCode rc = (CamRetCode)(cameraHostProxy_->SetFlashlight(cameraId, isEnable));
331     if (rc != HDI::Camera::V1_0::NO_ERROR) {
332         MEDIA_ERR_LOG("CameraHostInfo::SetFlashlight failed with error Code:%{public}d", rc);
333         CameraReportUtils::ReportCameraError(
334             "CameraHostInfo::SetFlashlight", rc, true, CameraReportUtils::GetCallerInfo());
335         return HdiToServiceError(rc);
336     }
337     return CAMERA_OK;
338 }
339 
SetTorchLevel(float level)340 int32_t HCameraHostManager::CameraHostInfo::SetTorchLevel(float level)
341 {
342     std::lock_guard<std::mutex> lock(mutex_);
343     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxyV1_2_ == nullptr, CAMERA_UNKNOWN_ERROR,
344         "CameraHostInfo::SetTorchLevel cameraHostProxyV1_2_ is null");
345     HDI::Camera::V1_2::CamRetCode rc = (HDI::Camera::V1_2::CamRetCode)(cameraHostProxyV1_2_->SetFlashlight_V1_2(level));
346     if (rc != HDI::Camera::V1_2::NO_ERROR) {
347         MEDIA_ERR_LOG("CameraHostInfo::SetTorchLevel failed with error Code:%{public}d", rc);
348         CameraReportUtils::ReportCameraError(
349             "CameraHostInfo::SetTorchLevel", rc, true, CameraReportUtils::GetCallerInfo());
350         return HdiToServiceErrorV1_2(rc);
351     }
352     return CAMERA_OK;
353 }
354 
UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting)355 void HCameraHostManager::CameraHostInfo::UpdateMuteSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> setting)
356 {
357     MEDIA_DEBUG_LOG("CameraHostInfo::UpdateMuteSetting enter");
358     int32_t count = 1;
359     uint8_t mode = OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK;
360     if (setting == nullptr) {
361         MEDIA_DEBUG_LOG("CameraHostInfo::UpdateMuteSetting setting is null");
362         constexpr int32_t DEFAULT_ITEMS = 1;
363         constexpr int32_t DEFAULT_DATA_LENGTH = 1;
364         setting = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
365     }
366     setting->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
367 }
368 
Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam, bool muteMode)369 int32_t HCameraHostManager::CameraHostInfo::Prelaunch(sptr<HCameraRestoreParam> cameraRestoreParam, bool muteMode)
370 {
371     CHECK_ERROR_RETURN_RET(CheckUserHasChanged(cameraRestoreParam->GetSetting()), CAMERA_UNKNOWN_ERROR);
372     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
373         "CameraHostInfo::Prelaunch cameraHostProxy_ is null");
374     CHECK_ERROR_RETURN_RET_LOG(GetCameraHostVersion() < GetVersionId(1, 1), CAMERA_UNKNOWN_ERROR,
375         "CameraHostInfo::Prelaunch not support host V1_0!");
376     MEDIA_INFO_LOG("CameraHostInfo::prelaunch for cameraId %{public}s", (cameraRestoreParam->GetCameraId()).c_str());
377     for (auto& streamInfo : cameraRestoreParam->GetStreamInfo()) {
378         MEDIA_DEBUG_LOG("CameraHostInfo::prelaunch for stream id is:%{public}d", streamInfo.v1_0.streamId_);
379     }
380     OHOS::HDI::Camera::V1_1::PrelaunchConfig prelaunchConfig;
381     std::vector<uint8_t> settings;
382     prelaunchConfig.cameraId = cameraRestoreParam->GetCameraId();
383     prelaunchConfig.streamInfos_V1_1 = cameraRestoreParam->GetStreamInfo();
384     DumpMetadata(cameraRestoreParam->GetSetting());
385     if (muteMode) {
386         UpdateMuteSetting(cameraRestoreParam->GetSetting());
387     }
388     OHOS::Camera::MetadataUtils::ConvertMetadataToVec(cameraRestoreParam->GetSetting(), settings);
389     prelaunchConfig.setting = settings;
390     int32_t opMode = cameraRestoreParam->GetCameraOpMode();
391     bool isNeedRestore = IsNeedRestore(opMode, cameraRestoreParam->GetSetting(), prelaunchConfig.cameraId);
392     CamRetCode rc;
393     if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
394         if (isNeedRestore) {
395             MEDIA_INFO_LOG("CameraHostInfo::PrelaunchWithOpMode ICameraHost V1_2 %{public}d", opMode);
396             rc = (CamRetCode)(cameraHostProxyV1_2_->PrelaunchWithOpMode(prelaunchConfig, opMode));
397         } else {
398             MEDIA_INFO_LOG("CameraHostInfo::Prelaunch ICameraHost V1_2 %{public}d", opMode);
399             rc = (CamRetCode)(cameraHostProxyV1_2_->Prelaunch(prelaunchConfig));
400         }
401     } else if (cameraHostProxyV1_1_ != nullptr && GetCameraHostVersion() == GetVersionId(1, 1)) {
402         MEDIA_DEBUG_LOG("CameraHostInfo::Prelaunch ICameraHost V1_1");
403         rc = (CamRetCode)(cameraHostProxyV1_1_->Prelaunch(prelaunchConfig));
404     } else {
405         rc = HDI::Camera::V1_0::NO_ERROR;
406     }
407     if (rc != HDI::Camera::V1_0::NO_ERROR) {
408         MEDIA_ERR_LOG("CameraHostInfo::Prelaunch failed with error Code:%{public}d", rc);
409         return HdiToServiceError(rc);
410     }
411     return CAMERA_OK;
412 }
413 
IsNeedRestore(int32_t opMode, std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings, std::string& cameraId)414 bool HCameraHostManager::CameraHostInfo::IsNeedRestore(int32_t opMode,
415     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings, std::string& cameraId)
416 {
417     if (cameraSettings == nullptr) {
418         return false;
419     }
420     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
421     int32_t ret = GetCameraAbility(cameraId, cameraAbility);
422     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || cameraAbility == nullptr, false,
423         "CameraHostInfo::IsNeedRestore failed");
424     if (opMode == 0) { // 0 is normal mode
425         MEDIA_INFO_LOG("operationMode:%{public}d", opMode);
426         return true;
427     }
428     camera_metadata_item_t item;
429     ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility->get(), OHOS_ABILITY_CAMERA_MODES, &item);
430     if (ret != CAM_META_SUCCESS || item.count == 0) {
431         MEDIA_ERR_LOG("Failed to find stream extend configuration return code %{public}d", ret);
432         ret = OHOS::Camera::FindCameraMetadataItem(cameraAbility->get(),
433             OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
434         if (ret == CAM_META_SUCCESS && item.count != 0) {
435             MEDIA_INFO_LOG("basic config no need valid mode");
436             return true;
437         }
438         return false;
439     }
440 
441     for (uint32_t i = 0; i < item.count; i++) {
442         if (opMode == item.data.u8[i]) {
443             MEDIA_DEBUG_LOG("operationMode:%{public}d found in supported streams", opMode);
444             return true;
445         }
446     }
447     MEDIA_ERR_LOG("operationMode:%{public}d not found in supported streams", opMode);
448     return false;
449 }
PreCameraSwitch(const std::string& cameraId)450 int32_t HCameraHostManager::CameraHostInfo::PreCameraSwitch(const std::string& cameraId)
451 {
452     std::lock_guard<std::mutex> lock(mutex_);
453     CHECK_ERROR_RETURN_RET_LOG(cameraHostProxy_ == nullptr, CAMERA_UNKNOWN_ERROR,
454         "CameraHostInfo::PreCameraSwitch cameraHostProxy_ is null");
455     CHECK_ERROR_RETURN_RET_LOG(GetCameraHostVersion() <= GetVersionId(1, 1), CAMERA_UNKNOWN_ERROR,
456         "CameraHostInfo::PreCameraSwitch not support host V1_0 and V1_1!");
457     if (cameraHostProxyV1_2_ != nullptr) {
458         MEDIA_DEBUG_LOG("CameraHostInfo::PreCameraSwitch ICameraHost V1_2");
459         CamRetCode rc = (CamRetCode)(cameraHostProxyV1_2_->PreCameraSwitch(cameraId));
460         if (rc != HDI::Camera::V1_0::NO_ERROR) {
461             MEDIA_ERR_LOG("CameraHostInfo::PreCameraSwitch failed with error Code:%{public}d", rc);
462             return HdiToServiceError(rc);
463         }
464     }
465     return CAMERA_OK;
466 }
467 
NotifyDeviceStateChangeInfo(int notifyType, int deviceState)468 void HCameraHostManager::CameraHostInfo::NotifyDeviceStateChangeInfo(int notifyType, int deviceState)
469 {
470     std::lock_guard<std::mutex> lock(mutex_);
471     CHECK_ERROR_RETURN_LOG(cameraHostProxy_ == nullptr, "CameraHostInfo::Prelaunch cameraHostProxy_ is null");
472     MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo notifyType = %{public}d, deviceState = %{public}d",
473         notifyType, deviceState);
474     if (cameraHostProxyV1_3_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
475         MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo ICameraHost V1_2");
476         cameraHostProxyV1_3_->NotifyDeviceStateChangeInfo(notifyType, deviceState);
477     } else if (cameraHostProxyV1_2_ != nullptr && GetCameraHostVersion() > GetVersionId(1, 1)) {
478         MEDIA_DEBUG_LOG("CameraHostInfo::NotifyDeviceStateChangeInfo ICameraHost V1_2");
479         cameraHostProxyV1_2_->NotifyDeviceStateChangeInfo(notifyType, deviceState);
480     }
481 }
482 
CheckUserHasChanged( std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings)483 bool HCameraHostManager::CameraHostInfo::CheckUserHasChanged(
484     std::shared_ptr<OHOS::Camera::CameraMetadata> cameraSettings)
485 {
486     CHECK_ERROR_RETURN_RET_LOG(cameraSettings == nullptr, false, "camera settings is nullptr.");
487     int32_t userId;
488     int32_t uid = IPCSkeleton::GetCallingUid();
489     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
490     camera_metadata_item_t item;
491     int32_t ret = OHOS::Camera::FindCameraMetadataItem(cameraSettings->get(), OHOS_CAMERA_USER_ID, &item);
492     if (ret == CAM_META_SUCCESS && userId != item.data.i32[0]) {
493         MEDIA_INFO_LOG("userId changed from %{public}d to %{public}d", item.data.i32[0], userId);
494         return true;
495     }
496     return false;
497 }
498 
GetCameraResourceCost(const std::string& cameraId, OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)499 int32_t HCameraHostManager::CameraHostInfo::GetCameraResourceCost(const std::string& cameraId,
500     OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)
501 {
502     std::lock_guard<std::mutex> lock(mutex_);
503     if (cameraHostProxyV1_3_ != nullptr &&
504         cameraHostProxyV1_3_->GetResourceCost(cameraId, resourceCost) ==
505         HDI::Camera::V1_0::CamRetCode::NO_ERROR) {
506         return CAMERA_OK;
507     }
508     return CAMERA_UNSUPPORTED;
509 }
510 
OnCameraStatus( const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status)511 int32_t HCameraHostManager::CameraHostInfo::OnCameraStatus(
512     const std::string& cameraId, HDI::Camera::V1_0::CameraStatus status)
513 {
514     auto statusCallback = statusCallback_.lock();
515     if (statusCallback == nullptr) {
516         MEDIA_WARNING_LOG("CameraHostInfo::OnCameraStatus for %{public}s with status %{public}d "
517                           "failed due to no callback",
518             cameraId.c_str(), status);
519         return CAMERA_UNKNOWN_ERROR;
520     }
521     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
522     switch (status) {
523         case UN_AVAILABLE: {
524             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s unavailable", cameraId.c_str());
525             svcStatus = CAMERA_STATUS_UNAVAILABLE;
526             break;
527         }
528         case AVAILABLE: {
529             MEDIA_INFO_LOG("CameraHostInfo::OnCameraStatus, camera %{public}s available", cameraId.c_str());
530             svcStatus = CAMERA_STATUS_AVAILABLE;
531             AddDevice(cameraId);
532             break;
533         }
534         default:
535             MEDIA_ERR_LOG("Unknown camera status: %{public}d", status);
536             return CAMERA_UNKNOWN_ERROR;
537     }
538     statusCallback->OnCameraStatus(cameraId, svcStatus);
539     return CAMERA_OK;
540 }
541 
NotifyCameraHostDied()542 void HCameraHostManager::CameraHostInfo::NotifyCameraHostDied()
543 {
544     auto statusCallback = statusCallback_.lock();
545     if (statusCallback == nullptr) {
546         MEDIA_WARNING_LOG("CameraHostInfo::NotifyCameraHostDied failed due to no callback!");
547         return;
548     }
549     std::vector<std::string> cameraIds;
550     if (statusCallback && this->GetCameras(cameraIds) == CAMERA_OK) {
551         for (const auto& cameraId : cameraIds) {
552             statusCallback->OnCameraStatus(cameraId, CAMERA_SERVER_UNAVAILABLE);
553         }
554     }
555 }
556 
OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)557 int32_t HCameraHostManager::CameraHostInfo::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
558 {
559     auto statusCallback = statusCallback_.lock();
560     if (statusCallback == nullptr) {
561         MEDIA_WARNING_LOG("CameraHostInfo::OnFlashlightStatus for %{public}s with status %{public}d "
562                           "failed due to no callback",
563             cameraId.c_str(), status);
564         return CAMERA_UNKNOWN_ERROR;
565     }
566     FlashStatus flashStatus = FLASH_STATUS_OFF;
567     switch (status) {
568         case FLASHLIGHT_OFF:
569             flashStatus = FLASH_STATUS_OFF;
570             MEDIA_INFO_LOG(
571                 "CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is off", cameraId.c_str());
572             break;
573 
574         case FLASHLIGHT_ON:
575             flashStatus = FLASH_STATUS_ON;
576             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is on", cameraId.c_str());
577             break;
578 
579         case FLASHLIGHT_UNAVAILABLE:
580             flashStatus = FLASH_STATUS_UNAVAILABLE;
581             MEDIA_INFO_LOG(
582                 "CameraHostInfo::OnFlashlightStatus, camera %{public}s flash light is unavailable", cameraId.c_str());
583             break;
584 
585         default:
586             MEDIA_ERR_LOG("Unknown flashlight status: %{public}d for camera %{public}s", status, cameraId.c_str());
587             return CAMERA_UNKNOWN_ERROR;
588     }
589     statusCallback->OnFlashlightStatus(cameraId, flashStatus);
590     return CAMERA_OK;
591 }
592 
OnFlashlightStatus_V1_2(FlashlightStatus status)593 int32_t HCameraHostManager::CameraHostInfo::OnFlashlightStatus_V1_2(FlashlightStatus status)
594 {
595     auto statusCallback = statusCallback_.lock();
596     if (statusCallback == nullptr) {
597         MEDIA_WARNING_LOG(
598             "CameraHostInfo::OnFlashlightStatus_V1_2 with status %{public}d failed due to no callback", status);
599         return CAMERA_UNKNOWN_ERROR;
600     }
601     TorchStatus torchStatus = TORCH_STATUS_OFF;
602     switch (status) {
603         case FLASHLIGHT_OFF:
604             torchStatus = TORCH_STATUS_OFF;
605             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is off");
606             break;
607 
608         case FLASHLIGHT_ON:
609             torchStatus = TORCH_STATUS_ON;
610             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is on");
611             break;
612 
613         case FLASHLIGHT_UNAVAILABLE:
614             torchStatus = TORCH_STATUS_UNAVAILABLE;
615             MEDIA_INFO_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, torch status is unavailable");
616             break;
617 
618         default:
619             MEDIA_ERR_LOG("CameraHostInfo::OnFlashlightStatus_V1_2, Unknown flashlight status: %{public}d", status);
620             return CAMERA_UNKNOWN_ERROR;
621     }
622     statusCallback->OnTorchStatus(torchStatus);
623     return CAMERA_OK;
624 }
625 
OnCameraEvent(const std::string& cameraId, CameraEvent event)626 int32_t HCameraHostManager::CameraHostInfo::OnCameraEvent(const std::string& cameraId, CameraEvent event)
627 {
628     auto statusCallback = statusCallback_.lock();
629     if (statusCallback == nullptr) {
630         MEDIA_WARNING_LOG(
631             "CameraHostInfo::OnCameraEvent for %{public}s with status %{public}d failed due to no callback",
632             cameraId.c_str(), event);
633         return CAMERA_UNKNOWN_ERROR;
634     }
635     CameraStatus svcStatus = CAMERA_STATUS_UNAVAILABLE;
636     switch (event) {
637         case CAMERA_EVENT_DEVICE_RMV: {
638             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent, camera %{public}s unavailable", cameraId.c_str());
639             svcStatus = CAMERA_STATUS_DISAPPEAR;
640             RemoveDevice(cameraId);
641             break;
642         }
643         case CAMERA_EVENT_DEVICE_ADD: {
644             MEDIA_INFO_LOG("CameraHostInfo::OnCameraEvent camera %{public}s available", cameraId.c_str());
645             svcStatus = CAMERA_STATUS_APPEAR;
646             AddDevice(cameraId);
647             break;
648         }
649         default:
650             MEDIA_ERR_LOG("Unknown camera event: %{public}d", event);
651             return CAMERA_UNKNOWN_ERROR;
652     }
653     statusCallback->OnCameraStatus(cameraId, svcStatus);
654     return CAMERA_OK;
655 }
656 
FindCameraDeviceInfo(const std::string& cameraId)657 std::shared_ptr<HCameraHostManager::CameraDeviceInfo> HCameraHostManager::CameraHostInfo::FindCameraDeviceInfo
658    (const std::string& cameraId)
659 {
660     std::lock_guard<std::mutex> lock(mutex_);
661     std::vector<std::shared_ptr<CameraDeviceInfo>>::iterator it = std::find_if(devices_.begin(), devices_.end(),
662         [cameraId](const auto& deviceInfo) { return deviceInfo->cameraId == cameraId; });
663     if (it != devices_.end()) {
664         MEDIA_INFO_LOG("CameraHostInfo::FindCameraDeviceInfo succeed for %{public}s", cameraId.c_str());
665         return (*it);
666     }
667     MEDIA_WARNING_LOG("CameraHostInfo::FindCameraDeviceInfo failed for %{public}s", cameraId.c_str());
668     return nullptr;
669 }
670 
AddDevice(const std::string& cameraId)671 void HCameraHostManager::CameraHostInfo::AddDevice(const std::string& cameraId)
672 {
673     std::lock_guard<std::mutex> lock(mutex_);
674     if (std::none_of(devices_.begin(), devices_.end(),
675                      [&cameraId](auto& devInfo) { return devInfo->cameraId == cameraId; })) {
676         cameraIds_.push_back(cameraId);
677         devices_.push_back(std::make_shared<HCameraHostManager::CameraDeviceInfo>(cameraId));
678         MEDIA_INFO_LOG("CameraHostInfo::AddDevice, camera %{public}s added", cameraId.c_str());
679     } else {
680         MEDIA_WARNING_LOG("CameraHostInfo::AddDevice, camera %{public}s already exists", cameraId.c_str());
681     }
682 }
683 
RemoveDevice(const std::string& cameraId)684 void HCameraHostManager::CameraHostInfo::RemoveDevice(const std::string& cameraId)
685 {
686     std::lock_guard<std::mutex> lock(mutex_);
687     cameraIds_.erase(std::remove(cameraIds_.begin(), cameraIds_.end(), cameraId), cameraIds_.end());
688     devices_.erase(std::remove_if(devices_.begin(), devices_.end(),
689         [&cameraId](const auto& devInfo) { return devInfo->cameraId == cameraId; }),
690         devices_.end());
691 }
692 
HCameraHostManager(std::shared_ptr<StatusCallback> statusCallback)693 HCameraHostManager::HCameraHostManager(std::shared_ptr<StatusCallback> statusCallback)
694     : statusCallback_(statusCallback), cameraHostInfos_(), muteMode_(false)
695 {
696     MEDIA_INFO_LOG("HCameraHostManager construct called");
697 }
698 
~HCameraHostManager()699 HCameraHostManager::~HCameraHostManager()
700 {
701     MEDIA_INFO_LOG("HCameraHostManager deconstruct called");
702     std::lock_guard<std::mutex> lock(deviceMutex_);
703     for (auto it = cameraDevices_.begin(); it != cameraDevices_.end(); it++) {
704         if (it->second) {
705             it->second = nullptr;
706         }
707     }
708     cameraDevices_.clear();
709 
710     for (unsigned i = 0; i < cameraHostInfos_.size(); i++) {
711         cameraHostInfos_[i] = nullptr;
712     }
713     cameraHostInfos_.clear();
714 }
715 
Init()716 int32_t HCameraHostManager::Init()
717 {
718     MEDIA_INFO_LOG("HCameraHostManager::Init");
719     using namespace OHOS::HDI::ServiceManager::V1_0;
720     auto svcMgr = IServiceManager::Get();
721     CHECK_ERROR_RETURN_RET_LOG(svcMgr == nullptr, CAMERA_UNKNOWN_ERROR,
722         "HCameraHostManager::Init IServiceManager failed!");
723 
724     ::OHOS::sptr<IServStatListener> listener(
725         new RegisterServStatListener(RegisterServStatListener::StatusCallback([&](const ServiceStatus& status) {
726             using namespace OHOS::HDI::ServiceManager::V1_0;
727 
728             switch (status.status) {
729                 case SERVIE_STATUS_START:
730                     if (status.serviceName == DISTRIBUTED_SERVICE_NAME) {
731                         MEDIA_ERR_LOG("HCameraHostManager::service no need to add");
732                         return;
733                     }
734                     AddCameraHost(status.serviceName);
735                     break;
736                 case SERVIE_STATUS_STOP:
737                     RemoveCameraHost(status.serviceName);
738                     break;
739                 default:
740                     MEDIA_ERR_LOG("HCameraHostManager::OnReceive unexpected service status %{public}d", status.status);
741             }
742         })
743     ));
744 
745     auto rt = svcMgr->RegisterServiceStatusListener(listener, DEVICE_CLASS_CAMERA);
746     CHECK_ERROR_RETURN_RET_LOG(rt != 0, CAMERA_UNKNOWN_ERROR,
747         "HCameraHostManager::Init RegisterServiceStatusListener failed!");
748     registerServStatListener_ = listener;
749 
750     return CAMERA_OK;
751 }
752 
DeInit()753 void HCameraHostManager::DeInit()
754 {
755     using namespace OHOS::HDI::ServiceManager::V1_0;
756     auto svcMgr = IServiceManager::Get();
757     CHECK_ERROR_RETURN_LOG(svcMgr == nullptr, "HCameraHostManager::DeInit(): IServiceManager failed");
758     auto rt = svcMgr->UnregisterServiceStatusListener(registerServStatListener_);
759     CHECK_ERROR_PRINT_LOG(rt != 0, "HCameraHostManager::DeInit(): UnregisterServiceStatusListener failed!");
760     registerServStatListener_ = nullptr;
761 }
762 
AddCameraDevice(const std::string& cameraId, sptr<ICameraDeviceService> cameraDevice)763 void HCameraHostManager::AddCameraDevice(const std::string& cameraId, sptr<ICameraDeviceService> cameraDevice)
764 {
765     std::lock_guard<std::mutex> lock(deviceMutex_);
766     auto it = cameraDevices_.find(cameraId);
767     if (it != cameraDevices_.end()) {
768         it->second = nullptr;
769         cameraDevices_.erase(cameraId);
770     }
771     cameraDevices_[cameraId] = cameraDevice;
772     auto statusCallback = statusCallback_.lock();
773     if (statusCallback != nullptr) {
774         statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_UNAVAILABLE, CallbackInvoker::APPLICATION);
775     }
776 }
777 
RemoveCameraDevice(const std::string& cameraId)778 void HCameraHostManager::RemoveCameraDevice(const std::string& cameraId)
779 {
780     MEDIA_DEBUG_LOG("HCameraHostManager::RemoveCameraDevice start");
781     std::lock_guard<std::mutex> lock(deviceMutex_);
782     auto it = cameraDevices_.find(cameraId);
783     if (it != cameraDevices_.end()) {
784         it->second = nullptr;
785     }
786     cameraDevices_.erase(cameraId);
787     auto statusCallback = statusCallback_.lock();
788     if (statusCallback) {
789         statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_AVAILABLE, CallbackInvoker::APPLICATION);
790     }
791     MEDIA_DEBUG_LOG("HCameraHostManager::RemoveCameraDevice end");
792 }
793 
CloseCameraDevice(const std::string& cameraId)794 void HCameraHostManager::CloseCameraDevice(const std::string& cameraId)
795 {
796     sptr<ICameraDeviceService> deviceToDisconnect = nullptr;
797     {
798         std::lock_guard<std::mutex> lock(deviceMutex_);
799         auto iter = cameraDevices_.find(cameraId);
800         if (iter != cameraDevices_.end()) {
801             deviceToDisconnect = iter->second;
802         }
803     }
804     if (deviceToDisconnect) {
805         MEDIA_DEBUG_LOG("HCameraDevice::CloseCameraDevice should clean %{public}s device", cameraId.c_str());
806         HCameraDevice* devicePtr = static_cast<HCameraDevice*>(deviceToDisconnect.GetRefPtr());
807         devicePtr->RemoveResourceWhenHostDied();
808     }
809 }
810 
GetCameras(std::vector<std::string>& cameraIds)811 int32_t HCameraHostManager::GetCameras(std::vector<std::string>& cameraIds)
812 {
813     CAMERA_SYNC_TRACE;
814     MEDIA_INFO_LOG("HCameraHostManager::GetCameras");
815     if (!IsCameraHostInfoAdded(LOCAL_SERVICE_NAME)) {
816         AddCameraHost(LOCAL_SERVICE_NAME);
817     }
818     std::lock_guard<std::mutex> lock(mutex_);
819     cameraIds.clear();
820     for (const auto& cameraHost : cameraHostInfos_) {
821         cameraHost->GetCameras(cameraIds);
822     }
823     return CAMERA_OK;
824 }
825 
GetCameraAbility(std::string &cameraId, std::shared_ptr<OHOS::Camera::CameraMetadata> &ability)826 int32_t HCameraHostManager::GetCameraAbility(std::string &cameraId,
827                                              std::shared_ptr<OHOS::Camera::CameraMetadata> &ability)
828 {
829     auto cameraHostInfo = FindCameraHostInfo(cameraId);
830     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
831         "HCameraHostManager::GetCameraAbility failed with invalid device info.");
832     return cameraHostInfo->GetCameraAbility(cameraId, ability);
833 }
834 
GetVersionByCamera(const std::string& cameraId)835 int32_t HCameraHostManager::GetVersionByCamera(const std::string& cameraId)
836 {
837     MEDIA_INFO_LOG("GetVersionByCamera camera = %{public}s", cameraId.c_str());
838     auto cameraHostInfo = FindCameraHostInfo(cameraId);
839     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, 0, "GetVersionByCamera failed with invalid device info");
840     return cameraHostInfo->GetCameraHostVersion();
841 }
842 
OpenCameraDevice(std::string &cameraId, const sptr<ICameraDeviceCallback> &callback, sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> &pDevice, bool isEnableSecCam)843 int32_t HCameraHostManager::OpenCameraDevice(std::string &cameraId,
844     const sptr<ICameraDeviceCallback> &callback,
845     sptr<OHOS::HDI::Camera::V1_0::ICameraDevice> &pDevice,
846     bool isEnableSecCam)
847 {
848     MEDIA_INFO_LOG("HCameraHostManager::OpenCameraDevice try to open camera = %{public}s", cameraId.c_str());
849     auto cameraHostInfo = FindCameraHostInfo(cameraId);
850     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
851         "HCameraHostManager::OpenCameraDevice failed with invalid device info.");
852     return cameraHostInfo->OpenCamera(cameraId, callback, pDevice, isEnableSecCam);
853 }
854 
SetTorchLevel(float level)855 int32_t HCameraHostManager::SetTorchLevel(float level)
856 {
857     if (!IsCameraHostInfoAdded(LOCAL_SERVICE_NAME)) {
858         AddCameraHost(LOCAL_SERVICE_NAME);
859     }
860     auto cameraHostInfo = FindLocalCameraHostInfo();
861     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
862         "HCameraHostManager::SetTorchLevel failed with not exist support device info");
863     return cameraHostInfo->SetTorchLevel(level);
864 }
865 
SetFlashlight(const std::string& cameraId, bool isEnable)866 int32_t HCameraHostManager::SetFlashlight(const std::string& cameraId, bool isEnable)
867 {
868     auto cameraHostInfo = FindCameraHostInfo(cameraId);
869     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
870         "HCameraHostManager::SetFlashlight failed with invalid device info");
871     return cameraHostInfo->SetFlashlight(cameraId, isEnable);
872 }
873 
Prelaunch(const std::string& cameraId, std::string clientName)874 int32_t HCameraHostManager::Prelaunch(const std::string& cameraId, std::string clientName)
875 {
876     auto cameraHostInfo = FindCameraHostInfo(cameraId);
877     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
878         "HCameraHostManager::Prelaunch failed with invalid device info");
879     sptr<HCameraRestoreParam> cameraRestoreParam = GetRestoreParam(clientName, cameraId);
880     int foldStatus = static_cast<int>(OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus());
881     if (foldStatus != cameraRestoreParam->GetFlodStatus()) {
882         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam %d", foldStatus);
883         return 0;
884     }
885     int32_t res = cameraHostInfo->Prelaunch(cameraRestoreParam, muteMode_);
886     if (res == 0 && cameraRestoreParam->GetRestoreParamType() ==
887         RestoreParamTypeOhos::PERSISTENT_DEFAULT_PARAM_OHOS) {
888         return CAMERA_OK;
889     }
890     // 使用后删除存储的动态数据
891     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
892     auto it = transitentParamMap_.find(clientName);
893     if (it != transitentParamMap_.end() && CheckCameraId(it->second, cameraId)) {
894         transitentParamMap_.erase(clientName);
895     }
896     return 0;
897 }
898 
PreSwitchCamera(const std::string& cameraId)899 int32_t HCameraHostManager::PreSwitchCamera(const std::string& cameraId)
900 {
901     auto cameraHostInfo = FindCameraHostInfo(cameraId);
902     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
903         "HCameraHostManager::PreSwitchCamera failed with invalid device info");
904     return cameraHostInfo->PreCameraSwitch(cameraId);
905 }
906 
NotifyDeviceStateChangeInfo(int notifyType, int deviceState)907 void HCameraHostManager::NotifyDeviceStateChangeInfo(int notifyType, int deviceState)
908 {
909     auto cameraHostInfo = FindLocalCameraHostInfo();
910     if (cameraHostInfo == nullptr) {
911         MEDIA_ERR_LOG("HCameraHostManager::NotifyDeviceStateChangeInfo failed with not exist support device info");
912         return;
913     }
914 
915     cameraHostInfo->NotifyDeviceStateChangeInfo(notifyType, deviceState);
916 }
917 
SaveRestoreParam(sptr<HCameraRestoreParam> cameraRestoreParam)918 void HCameraHostManager::SaveRestoreParam(sptr<HCameraRestoreParam> cameraRestoreParam)
919 {
920     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
921     CHECK_ERROR_RETURN_LOG(cameraRestoreParam == nullptr, "HCameraRestoreParam is nullptr");
922     std::string clientName = cameraRestoreParam->GetClientName();
923     if (cameraRestoreParam->GetRestoreParamType() == RestoreParamTypeOhos::PERSISTENT_DEFAULT_PARAM_OHOS) {
924         DeleteRestoreParam(clientName, cameraRestoreParam->GetCameraId());
925         (persistentParamMap_[clientName])[cameraRestoreParam->GetCameraId()] = cameraRestoreParam;
926         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam save persistent param");
927     } else if (cameraRestoreParam->GetRestoreParamType() == RestoreParamTypeOhos::TRANSIENT_ACTIVE_PARAM_OHOS) {
928         auto itTransitent = transitentParamMap_.find(clientName);
929         if (itTransitent != transitentParamMap_.end()) {
930             transitentParamMap_.erase(clientName);
931         }
932         transitentParamMap_[clientName] = cameraRestoreParam;
933         MEDIA_DEBUG_LOG("HCameraHostManager::SaveRestoreParam save transist param");
934     } else {
935         MEDIA_DEBUG_LOG("No need save param");
936     }
937 }
938 
UpdateRestoreParamCloseTime(const std::string& clientName, const std::string& cameraId)939 void HCameraHostManager::UpdateRestoreParamCloseTime(const std::string& clientName, const std::string& cameraId)
940 {
941     MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParamCloseTime enter");
942     timeval closeTime;
943     gettimeofday(&closeTime, nullptr);
944     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
945     auto itPersistent = persistentParamMap_.find(clientName);
946     if (itPersistent != persistentParamMap_.end()) {
947         MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParamCloseTime find persistentParam");
948         std::map<std::string, sptr<HCameraRestoreParam>>::iterator iter = (persistentParamMap_[clientName]).begin();
949         while (iter != (persistentParamMap_[clientName]).end()) {
950             auto cameraRestoreParam = iter->second;
951             if (cameraId == cameraRestoreParam->GetCameraId()) {
952                 cameraRestoreParam->SetCloseCameraTime(closeTime);
953                 MEDIA_DEBUG_LOG("HCameraHostManager::Update persistent closeTime");
954             } else {
955                 cameraRestoreParam->SetCloseCameraTime({0, 0});
956             }
957             ++iter;
958         }
959     }
960 
961     auto itTransitent = transitentParamMap_.find(clientName);
962     if (itTransitent != transitentParamMap_.end()) {
963         MEDIA_INFO_LOG("HCameraHostManager::Update transient CloseTime ");
964         transitentParamMap_[clientName]->SetCloseCameraTime(closeTime);
965     }
966 }
967 
DeleteRestoreParam(const std::string& clientName, const std::string& cameraId)968 void HCameraHostManager::DeleteRestoreParam(const std::string& clientName, const std::string& cameraId)
969 {
970     MEDIA_DEBUG_LOG("HCameraHostManager::DeleteRestoreParam enter");
971     auto itPersistent = persistentParamMap_.find(clientName);
972     if (itPersistent != persistentParamMap_.end()) {
973         auto iterParamMap = (itPersistent->second).find(cameraId);
974         if (iterParamMap != (itPersistent->second).end()) {
975             iterParamMap->second = nullptr;
976             (itPersistent->second).erase(cameraId);
977         }
978     }
979 }
980 
GetRestoreParam(const std::string& clientName, const std::string& cameraId)981 sptr<HCameraRestoreParam> HCameraHostManager::GetRestoreParam(const std::string& clientName,
982     const std::string& cameraId)
983 {
984     MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam enter");
985     std::lock_guard<std::mutex> lock(saveRestoreMutex_);
986     std::vector<StreamInfo_V1_1> streamInfos;
987     RestoreParamTypeOhos restoreParamType = RestoreParamTypeOhos::NO_NEED_RESTORE_PARAM_OHOS;
988     sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(clientName, cameraId,
989         streamInfos, nullptr, restoreParamType, 0);
990     auto it = persistentParamMap_.find(clientName);
991     if (it != persistentParamMap_.end()) {
992         MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam find persistent param");
993         UpdateRestoreParam(cameraRestoreParam);
994     } else {
995         cameraRestoreParam = GetTransitentParam(clientName, cameraId);
996         MEDIA_DEBUG_LOG("HCameraHostManager::GetRestoreParam find transist param");
997     }
998     return cameraRestoreParam;
999 }
1000 
UpdateRestoreParam(sptr<HCameraRestoreParam> &cameraRestoreParam)1001 void HCameraHostManager::UpdateRestoreParam(sptr<HCameraRestoreParam> &cameraRestoreParam)
1002 {
1003     CHECK_ERROR_RETURN_LOG(cameraRestoreParam == nullptr, "HCameraHostManager::UpdateRestoreParam is nullptr");
1004     std::string clientName = cameraRestoreParam->GetClientName();
1005     std::string cameraId = cameraRestoreParam->GetCameraId();
1006     std::map<std::string, sptr<HCameraRestoreParam>>::iterator iter = (persistentParamMap_[clientName]).begin();
1007     while (iter != (persistentParamMap_[clientName]).end()) {
1008         auto restoreParam = iter->second;
1009         timeval closeTime = restoreParam->GetCloseCameraTime();
1010         MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam closeTime.tv_sec");
1011         if (closeTime.tv_sec != 0 && CheckCameraId(restoreParam, cameraId)) {
1012             timeval openTime;
1013             gettimeofday(&openTime, nullptr);
1014             long timeInterval = (openTime.tv_sec - closeTime.tv_sec)+
1015                 (openTime.tv_usec - closeTime.tv_usec) / 1000; // 1000 is Convert milliseconds to seconds
1016             if ((long)(restoreParam->GetStartActiveTime() * 60) < timeInterval) { // 60 is 60 Seconds
1017                 MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam get persistent");
1018                 cameraRestoreParam = restoreParam;
1019             } else {
1020                 MEDIA_DEBUG_LOG("HCameraHostManager::UpdateRestoreParam get transistent ");
1021                 cameraRestoreParam = GetTransitentParam(clientName, cameraId);
1022             }
1023             break;
1024         }
1025         ++iter;
1026     }
1027 }
1028 
GetTransitentParam(const std::string& clientName, const std::string& cameraId)1029 sptr<HCameraRestoreParam> HCameraHostManager::GetTransitentParam(const std::string& clientName,
1030     const std::string& cameraId)
1031 {
1032     std::vector<StreamInfo_V1_1> streamInfos;
1033     RestoreParamTypeOhos restoreParamType = RestoreParamTypeOhos::NO_NEED_RESTORE_PARAM_OHOS;
1034     sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(clientName, cameraId,
1035         streamInfos, nullptr, restoreParamType, 0);
1036     auto iter = transitentParamMap_.find(clientName);
1037     if (iter != transitentParamMap_.end() && (CheckCameraId(transitentParamMap_[clientName], cameraId))) {
1038         cameraRestoreParam = transitentParamMap_[clientName];
1039         MEDIA_DEBUG_LOG("HCameraHostManager::GetTransitentParam end");
1040     }
1041     return cameraRestoreParam;
1042 }
1043 
CheckCameraId(sptr<HCameraRestoreParam> cameraRestoreParam, const std::string& cameraId)1044 bool HCameraHostManager::CheckCameraId(sptr<HCameraRestoreParam> cameraRestoreParam, const std::string& cameraId)
1045 {
1046     CHECK_ERROR_RETURN_RET(cameraRestoreParam == nullptr, false);
1047     CHECK_ERROR_RETURN_RET(cameraRestoreParam->GetCameraId() == cameraId, true);
1048     return false;
1049 }
1050 
1051 
AddCameraHost(const std::string& svcName)1052 void HCameraHostManager::AddCameraHost(const std::string& svcName)
1053 {
1054     MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host %{public}s added", svcName.c_str());
1055     std::lock_guard<std::mutex> lock(mutex_);
1056     if (std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1057                     [&svcName](const auto& camHost) { return camHost->GetName() == svcName; })) {
1058         MEDIA_INFO_LOG("HCameraHostManager::AddCameraHost camera host  %{public}s already exists", svcName.c_str());
1059         return;
1060     }
1061     if (cameraHostDeadCallback_ == nullptr) {
1062         cameraHostDeadCallback_ = std::make_shared<CameraHostDeadCallback>(this);
1063     }
1064     auto statusCallback = statusCallback_.lock();
1065     sptr<HCameraHostManager::CameraHostInfo> cameraHost =
1066         new (std::nothrow) HCameraHostManager::CameraHostInfo(statusCallback, cameraHostDeadCallback_, svcName);
1067     CHECK_ERROR_RETURN_LOG(cameraHost == nullptr, "failed to new cameraHost!");
1068     CHECK_ERROR_RETURN_LOG(!cameraHost->Init(), "HCameraHostManager::AddCameraHost failed due to init failure");
1069     cameraHostInfos_.push_back(cameraHost);
1070     std::vector<std::string> cameraIds;
1071     if (statusCallback && cameraHost->GetCameras(cameraIds) == CAMERA_OK) {
1072         for (const auto& cameraId : cameraIds) {
1073             statusCallback->OnCameraStatus(cameraId, CAMERA_STATUS_AVAILABLE);
1074         }
1075     }
1076     if (statusCallback && svcName == LOCAL_SERVICE_NAME) {
1077         statusCallback->OnTorchStatus(TORCH_STATUS_OFF);
1078     }
1079 }
1080 
RemoveCameraHost(const std::string& svcName)1081 void HCameraHostManager::RemoveCameraHost(const std::string& svcName)
1082 {
1083     std::lock_guard<std::mutex> lock(mutex_);
1084     MEDIA_INFO_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s removed", svcName.c_str());
1085     std::vector<sptr<CameraHostInfo>>::iterator it = std::find_if(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1086         [&svcName](const auto& camHost) { return camHost->GetName() == svcName; });
1087     if (it == cameraHostInfos_.end()) {
1088         MEDIA_WARNING_LOG("HCameraHostManager::RemoveCameraHost camera host %{public}s doesn't exist",
1089             svcName.c_str());
1090         return;
1091     }
1092     std::vector<std::string> cameraIds;
1093     if ((*it)->GetCameras(cameraIds) == CAMERA_OK) {
1094         for (const auto& cameraId : cameraIds) {
1095             (*it)->OnCameraStatus(cameraId, UN_AVAILABLE);
1096             CloseCameraDevice(cameraId);
1097         }
1098     }
1099     *it = nullptr;
1100     cameraHostInfos_.erase(it);
1101     auto statusCallback = statusCallback_.lock();
1102     if (statusCallback && svcName == LOCAL_SERVICE_NAME) {
1103         statusCallback->OnTorchStatus(TORCH_STATUS_UNAVAILABLE);
1104     }
1105 }
1106 
FindCameraHostInfo(const std::string& cameraId)1107 sptr<HCameraHostManager::CameraHostInfo> HCameraHostManager::FindCameraHostInfo(const std::string& cameraId)
1108 {
1109     std::lock_guard<std::mutex> lock(mutex_);
1110     for (const auto& cameraHostInfo : cameraHostInfos_) {
1111         if (cameraHostInfo->IsCameraSupported(cameraId)) {
1112             return cameraHostInfo;
1113         }
1114     }
1115     return nullptr;
1116 }
1117 
FindLocalCameraHostInfo()1118 sptr<HCameraHostManager::CameraHostInfo> HCameraHostManager::FindLocalCameraHostInfo()
1119 {
1120     std::lock_guard<std::mutex> lock(mutex_);
1121     std::vector<sptr<CameraHostInfo>>::iterator it = std::find_if(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1122         [](const auto& cameraHostInfo) { return cameraHostInfo->GetName() == LOCAL_SERVICE_NAME; });
1123     if (it != cameraHostInfos_.end()) {
1124         return (*it);
1125     }
1126     return nullptr;
1127 }
1128 
IsCameraHostInfoAdded(const std::string& svcName)1129 bool HCameraHostManager::IsCameraHostInfoAdded(const std::string& svcName)
1130 {
1131     std::lock_guard<std::mutex> lock(mutex_);
1132     return std::any_of(cameraHostInfos_.begin(), cameraHostInfos_.end(),
1133                        [&svcName](const auto& camHost) {return camHost->GetName() == svcName; });
1134 }
1135 
GetRegisterServStatListener()1136 ::OHOS::sptr<HDI::ServiceManager::V1_0::IServStatListener> HCameraHostManager::GetRegisterServStatListener()
1137 {
1138     return registerServStatListener_;
1139 }
1140 
SetMuteMode(bool muteMode)1141 void HCameraHostManager::SetMuteMode(bool muteMode)
1142 {
1143     muteMode_ = muteMode;
1144 }
1145 
GetCameraResourceCost(const std::string& cameraId, OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)1146 int32_t HCameraHostManager::GetCameraResourceCost(const std::string& cameraId,
1147     OHOS::HDI::Camera::V1_3::CameraDeviceResourceCost& resourceCost)
1148 {
1149     auto cameraHostInfo = FindCameraHostInfo(cameraId);
1150     CHECK_ERROR_RETURN_RET_LOG(cameraHostInfo == nullptr, CAMERA_INVALID_ARG,
1151         "HCameraHostManager::GetCameraResourceCost failed with invalid device info");
1152     return cameraHostInfo->GetCameraResourceCost(cameraId, resourceCost);
1153 }
1154 
OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status)1155 void RegisterServStatListener::OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status)
1156 {
1157     MEDIA_INFO_LOG("HCameraHostManager::OnReceive for camerahost %{public}s, status %{public}d, deviceClass %{public}d",
1158         status.serviceName.c_str(), status.status, status.deviceClass);
1159 
1160     if (status.deviceClass != DEVICE_CLASS_CAMERA) {
1161         MEDIA_ERR_LOG("HCameraHostManager::OnReceive invalid device class %{public}d", status.deviceClass);
1162         return;
1163     }
1164     callback_(status);
1165 }
1166 } // namespace CameraStandard
1167 } // namespace OHOS
1168