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_service.h"
17 
18 #include <algorithm>
19 #include <memory>
20 #include <mutex>
21 #include <parameter.h>
22 #include <parameters.h>
23 #include <securec.h>
24 #include <string>
25 #include <unordered_set>
26 #include <vector>
27 
28 #include "access_token.h"
29 #include "accesstoken_kit.h"
30 #include "camera_info_dumper.h"
31 #include "camera_log.h"
32 #include "camera_report_uitls.h"
33 #include "camera_util.h"
34 #include "datashare_helper.h"
35 #include "datashare_predicates.h"
36 #include "datashare_result_set.h"
37 #include "deferred_processing_service.h"
38 #include "display_manager.h"
39 #include "hcamera_device_manager.h"
40 #include "hcamera_preconfig.h"
41 #ifdef DEVICE_MANAGER
42 #include "device_manager_impl.h"
43 #endif
44 #include "ipc_skeleton.h"
45 #include "iservice_registry.h"
46 #include "os_account_manager.h"
47 #include "system_ability_definition.h"
48 #include "tokenid_kit.h"
49 #include "uri.h"
50 
51 namespace OHOS {
52 namespace CameraStandard {
53 REGISTER_SYSTEM_ABILITY_BY_ID(HCameraService, CAMERA_SERVICE_ID, true)
54 #ifdef CAMERA_USE_SENSOR
55 constexpr int32_t SENSOR_SUCCESS = 0;
56 constexpr int32_t POSTURE_INTERVAL = 1000000;
57 #endif
58 constexpr uint8_t POSITION_FOLD_INNER = 3;
59 constexpr uint32_t ROOT_UID = 0;
60 constexpr uint32_t FACE_CLIENT_UID = 1088;
61 constexpr uint32_t RSS_UID = 1096;
62 static std::mutex g_cameraServiceInstanceMutex;
63 static HCameraService* g_cameraServiceInstance = nullptr;
64 static sptr<HCameraService> g_cameraServiceHolder = nullptr;
65 static bool g_isFoldScreen = system::GetParameter("const.window.foldscreen.type", "") != "";
66 
67 static const std::string SETTINGS_DATA_BASE_URI =
68     "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
69 static const std::string SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
70 static const std::string SETTINGS_DATA_FIELD_KEYWORD = "KEYWORD";
71 static const std::string SETTINGS_DATA_FIELD_VALUE = "VALUE";
72 static const std::string PREDICATES_STRING = "settings.camera.mute_persist";
73 std::vector<uint32_t> restoreMetadataTag { // item.type is uint8
74     OHOS_CONTROL_VIDEO_STABILIZATION_MODE,
75     OHOS_CONTROL_DEFERRED_IMAGE_DELIVERY,
76     OHOS_CONTROL_SUPPORTED_COLOR_MODES,
77     OHOS_CONTROL_PORTRAIT_EFFECT_TYPE,
78     OHOS_CONTROL_FILTER_TYPE,
79     OHOS_CONTROL_EFFECT_SUGGESTION,
80     OHOS_CONTROL_MOTION_DETECTION,
81     OHOS_CONTROL_HIGH_QUALITY_MODE,
82     OHOS_CONTROL_CAMERA_USED_AS_POSITION,
83     OHOS_CONTROL_MOVING_PHOTO,
84     OHOS_CONTROL_AUTO_CLOUD_IMAGE_ENHANCE,
85     OHOS_CONTROL_BEAUTY_TYPE,
86     OHOS_CONTROL_BEAUTY_AUTO_VALUE,
87 };
88 mutex g_dataShareHelperMutex;
89 mutex g_dmDeviceInfoMutex;
90 thread_local uint32_t g_dumpDepth = 0;
91 
HCameraService(int32_t systemAbilityId,bool runOnCreate)92 HCameraService::HCameraService(int32_t systemAbilityId, bool runOnCreate)
93     : SystemAbility(systemAbilityId, runOnCreate), muteModeStored_(false), isRegisterSensorSuccess(false)
94 {
95     MEDIA_INFO_LOG("HCameraService Construct begin");
96     g_cameraServiceHolder = this;
97     {
98         std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
99         g_cameraServiceInstance = this;
100     }
101     statusCallback_ = std::make_shared<ServiceHostStatus>(this);
102     cameraHostManager_ = new (std::nothrow) HCameraHostManager(statusCallback_);
103     CHECK_AND_RETURN_LOG(
104         cameraHostManager_ != nullptr, "HCameraService OnStart failed to create HCameraHostManager obj");
105     MEDIA_INFO_LOG("HCameraService Construct end");
106     serviceStatus_ = CameraServiceStatus::SERVICE_NOT_READY;
107 }
108 
HCameraService(sptr<HCameraHostManager> cameraHostManager)109 HCameraService::HCameraService(sptr<HCameraHostManager> cameraHostManager)
110     : cameraHostManager_(cameraHostManager), muteModeStored_(false), isRegisterSensorSuccess(false)
111 {}
112 
~HCameraService()113 HCameraService::~HCameraService() {}
114 
115 #ifdef DEVICE_MANAGER
116 class HCameraService::DeviceInitCallBack : public DistributedHardware::DmInitCallback {
117     void OnRemoteDied() override;
118 };
119 
OnRemoteDied()120 void HCameraService::DeviceInitCallBack::OnRemoteDied()
121 {
122     MEDIA_INFO_LOG("CameraManager::DeviceInitCallBack OnRemoteDied");
123 }
124 #endif
125 
OnStart()126 void HCameraService::OnStart()
127 {
128     MEDIA_INFO_LOG("HCameraService OnStart begin");
129     CHECK_ERROR_PRINT_LOG(cameraHostManager_->Init() != CAMERA_OK,
130         "HCameraService OnStart failed to init camera host manager.");
131     // initialize deferred processing service.
132     DeferredProcessing::DeferredProcessingService::GetInstance().Initialize();
133     DeferredProcessing::DeferredProcessingService::GetInstance().Start();
134 
135 #ifdef CAMERA_USE_SENSOR
136     RegisterSensorCallback();
137 #endif
138     AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
139     cameraDataShareHelper_ = std::make_shared<CameraDataShareHelper>();
140     if (Publish(this)) {
141         MEDIA_INFO_LOG("HCameraService publish OnStart sucess");
142     } else {
143         MEDIA_INFO_LOG("HCameraService publish OnStart failed");
144     }
145     MEDIA_INFO_LOG("HCameraService OnStart end");
146 }
147 
OnDump()148 void HCameraService::OnDump()
149 {
150     MEDIA_INFO_LOG("HCameraService::OnDump called");
151 }
152 
OnStop()153 void HCameraService::OnStop()
154 {
155     MEDIA_INFO_LOG("HCameraService::OnStop called");
156     cameraHostManager_->DeInit();
157     UnRegisterFoldStatusListener();
158 #ifdef CAMERA_USE_SENSOR
159     UnRegisterSensorCallback();
160 #endif
161     DeferredProcessing::DeferredProcessingService::GetInstance().Stop();
162 }
163 
GetMuteModeFromDataShareHelper(bool & muteMode)164 int32_t HCameraService::GetMuteModeFromDataShareHelper(bool &muteMode)
165 {
166     lock_guard<mutex> lock(g_dataShareHelperMutex);
167     CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_INVALID_ARG,
168         "GetMuteModeFromDataShareHelper NULL");
169     std::string value = "";
170     auto ret = cameraDataShareHelper_->QueryOnce(PREDICATES_STRING, value);
171     MEDIA_INFO_LOG("GetMuteModeFromDataShareHelper Query ret = %{public}d, value = %{public}s", ret, value.c_str());
172     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_INVALID_ARG, "GetMuteModeFromDataShareHelper QueryOnce fail.");
173     value = (value == "0" || value == "1") ? value : "0";
174     int32_t muteModeVal = std::stoi(value);
175     CHECK_ERROR_RETURN_RET_LOG(muteModeVal != 0 && muteModeVal != 1, CAMERA_INVALID_ARG,
176         "GetMuteModeFromDataShareHelper Query MuteMode invald, value = %{public}d", muteModeVal);
177     muteMode = (muteModeVal == 1) ? true: false;
178     this->muteModeStored_ = muteMode;
179     return CAMERA_OK;
180 }
181 
SetMuteModeByDataShareHelper(bool muteMode)182 int32_t HCameraService::SetMuteModeByDataShareHelper(bool muteMode)
183 {
184     lock_guard<mutex> lock(g_dataShareHelperMutex);
185     CHECK_ERROR_RETURN_RET_LOG(cameraDataShareHelper_ == nullptr, CAMERA_ALLOC_ERROR,
186         "GetMuteModeFromDataShareHelper NULL");
187     std::string unMuteModeStr = "0";
188     std::string muteModeStr = "1";
189     std::string value = muteMode? muteModeStr : unMuteModeStr;
190     auto ret = cameraDataShareHelper_->UpdateOnce(PREDICATES_STRING, value);
191     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, CAMERA_ALLOC_ERROR, "SetMuteModeByDataShareHelper UpdateOnce fail.");
192     return CAMERA_OK;
193 }
194 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)195 void HCameraService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
196 {
197     MEDIA_INFO_LOG("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
198     bool muteMode = false;
199     int32_t ret = -1;
200     int32_t cnt = 0;
201     const int32_t retryCnt = 5;
202     const int32_t retryTimeout = 1;
203     switch (systemAbilityId) {
204         case DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID:
205             MEDIA_INFO_LOG("OnAddSystemAbility RegisterObserver start");
206             while (cnt++ < retryCnt) {
207                 ret = GetMuteModeFromDataShareHelper(muteMode);
208                 MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper, tryCount=%{public}d", cnt);
209                 if (ret == CAMERA_OK) {
210                     break;
211                 }
212                 sleep(retryTimeout);
213             }
214             this->SetServiceStatus(CameraServiceStatus::SERVICE_READY);
215             MuteCameraFunc(muteMode);
216             muteModeStored_ = muteMode;
217             MEDIA_INFO_LOG("OnAddSystemAbility GetMuteModeFromDataShareHelper Success, muteMode = %{public}d, "
218                            "final retryCnt=%{public}d",
219                 muteMode, cnt);
220             break;
221         default:
222             MEDIA_INFO_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
223             break;
224     }
225     MEDIA_INFO_LOG("OnAddSystemAbility done");
226 }
227 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)228 void HCameraService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
229 {
230     MEDIA_DEBUG_LOG("HCameraService::OnRemoveSystemAbility systemAbilityId:%{public}d removed", systemAbilityId);
231 }
232 
GetCameras(vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)233 int32_t HCameraService::GetCameras(
234     vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
235 {
236     CAMERA_SYNC_TRACE;
237     isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
238     isFoldableInit = true;
239     int32_t ret = cameraHostManager_->GetCameras(cameraIds);
240     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameras failed");
241     shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
242     vector<shared_ptr<CameraMetaInfo>> cameraInfos;
243     for (auto id : cameraIds) {
244         ret = cameraHostManager_->GetCameraAbility(id, cameraAbility);
245         CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK || cameraAbility == nullptr, ret,
246             "HCameraService::GetCameraAbility failed");
247         auto cameraMetaInfo = GetCameraMetaInfo(id, cameraAbility);
248         if (cameraMetaInfo == nullptr) {
249             continue;
250         }
251         cameraInfos.emplace_back(cameraMetaInfo);
252     }
253     FillCameras(cameraInfos, cameraIds, cameraAbilityList);
254     return ret;
255 }
256 
GetCameraMetaInfo(std::string & cameraId,shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility)257 shared_ptr<CameraMetaInfo>HCameraService::GetCameraMetaInfo(std::string &cameraId,
258     shared_ptr<OHOS::Camera::CameraMetadata>cameraAbility)
259 {
260     camera_metadata_item_t item;
261     common_metadata_header_t* metadata = cameraAbility->get();
262     int32_t res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_POSITION, &item);
263     uint8_t cameraPosition = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_POSITION_OTHER;
264     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLDSCREEN_TYPE, &item);
265     uint8_t foldType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLDSCREEN_OTHER;
266     if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_FOLDSCREEN_OTHER &&
267         system::GetParameter("const.window.foldscreen.type", "")[0] == '1') {
268         return nullptr;
269     }
270     if (isFoldable && cameraPosition == OHOS_CAMERA_POSITION_FRONT && foldType == OHOS_CAMERA_FOLDSCREEN_INNER) {
271         cameraPosition = POSITION_FOLD_INNER;
272     }
273     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_TYPE, &item);
274     uint8_t cameraType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_TYPE_UNSPECIFIED;
275     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
276     uint8_t connectionType = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_CONNECTION_TYPE_BUILTIN;
277     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, &item);
278     bool isMirrorSupported = (res == CAM_META_SUCCESS) ? (item.count != 0) : false;
279     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_FOLD_STATUS, &item);
280     uint8_t foldStatus = (res == CAM_META_SUCCESS) ? item.data.u8[0] : OHOS_CAMERA_FOLD_STATUS_NONFOLDABLE;
281     res = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_CAMERA_MODES, &item);
282     std::vector<uint8_t> supportModes = {};
283     for (uint32_t i = 0; i < item.count; i++) {
284         supportModes.push_back(item.data.u8[i]);
285     }
286     CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager GetCameras camera ID:%s, Camera position:%d, "
287                                         "Camera Type:%d, Connection Type:%d, Mirror support:%d, Fold status %d",
288         cameraId.c_str(), cameraPosition, cameraType, connectionType, isMirrorSupported, foldStatus));
289     return make_shared<CameraMetaInfo>(cameraId, cameraType, cameraPosition, connectionType,
290         foldStatus, supportModes, cameraAbility);
291 }
292 
FillCameras(vector<shared_ptr<CameraMetaInfo>> & cameraInfos,vector<string> & cameraIds,vector<shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)293 void HCameraService::FillCameras(vector<shared_ptr<CameraMetaInfo>>& cameraInfos,
294     vector<string>& cameraIds, vector<shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
295 {
296     vector<shared_ptr<CameraMetaInfo>> choosedCameras = ChooseDeFaultCameras(cameraInfos);
297     cameraIds.clear();
298     cameraAbilityList.clear();
299     for (const auto& camera: choosedCameras) {
300         cameraIds.emplace_back(camera->cameraId);
301         cameraAbilityList.emplace_back(camera->cameraAbility);
302     }
303     int32_t uid = IPCSkeleton::GetCallingUid();
304     if (uid == ROOT_UID || uid == FACE_CLIENT_UID || uid == RSS_UID ||
305         OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(IPCSkeleton::GetCallingFullTokenID())) {
306         vector<shared_ptr<CameraMetaInfo>> physicalCameras = ChoosePhysicalCameras(cameraInfos, choosedCameras);
307         for (const auto& camera: physicalCameras) {
308             cameraIds.emplace_back(camera->cameraId);
309             cameraAbilityList.emplace_back(camera->cameraAbility);
310         }
311     } else {
312         MEDIA_INFO_LOG("current token id not support physical camera");
313     }
314 }
315 
ChoosePhysicalCameras(const vector<shared_ptr<CameraMetaInfo>> & cameraInfos,const vector<shared_ptr<CameraMetaInfo>> & choosedCameras)316 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChoosePhysicalCameras(
317     const vector<shared_ptr<CameraMetaInfo>>& cameraInfos, const vector<shared_ptr<CameraMetaInfo>>& choosedCameras)
318 {
319     std::vector<OHOS::HDI::Camera::V1_3::OperationMode> supportedPhysicalCamerasModes = {
320         OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_PHOTO,
321         OHOS::HDI::Camera::V1_3::OperationMode::PROFESSIONAL_VIDEO,
322         OHOS::HDI::Camera::V1_3::OperationMode::HIGH_RESOLUTION_PHOTO,
323     };
324     vector<shared_ptr<CameraMetaInfo>> physicalCameraInfos = {};
325     for (auto& camera : cameraInfos) {
326         if (std::any_of(choosedCameras.begin(), choosedCameras.end(), [camera](const auto& defaultCamera) {
327                 return camera->cameraId == defaultCamera->cameraId;
328             })
329         ) {
330             MEDIA_INFO_LOG("ChoosePhysicalCameras alreadly has default camera: %{public}s", camera->cameraId.c_str());
331         } else {
332             physicalCameraInfos.push_back(camera);
333         }
334     }
335     vector<shared_ptr<CameraMetaInfo>> physicalCameras = {};
336     for (auto& camera : physicalCameraInfos) {
337         MEDIA_INFO_LOG("ChoosePhysicalCameras camera ID:%s, CameraType: %{public}d, Camera position:%{public}d, "
338                        "Connection Type:%{public}d",
339                        camera->cameraId.c_str(), camera->cameraType, camera->position, camera->connectionType);
340         bool isSupportPhysicalCamera = std::any_of(camera->supportModes.begin(), camera->supportModes.end(),
341             [&supportedPhysicalCamerasModes](auto mode) -> bool {
342                 return any_of(supportedPhysicalCamerasModes.begin(), supportedPhysicalCamerasModes.end(),
343                     [mode](auto it)-> bool { return it == mode; });
344             });
345         if (camera->cameraType != camera_type_enum_t::OHOS_CAMERA_TYPE_UNSPECIFIED && isSupportPhysicalCamera) {
346             physicalCameras.emplace_back(camera);
347             MEDIA_INFO_LOG("ChoosePhysicalCameras add camera ID:%{public}s", camera->cameraId.c_str());
348         }
349     }
350     return physicalCameras;
351 }
352 
ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)353 vector<shared_ptr<CameraMetaInfo>> HCameraService::ChooseDeFaultCameras(vector<shared_ptr<CameraMetaInfo>> cameraInfos)
354 {
355     vector<shared_ptr<CameraMetaInfo>> choosedCameras;
356     for (auto& camera : cameraInfos) {
357         MEDIA_INFO_LOG("ChooseDeFaultCameras camera ID:%s, Camera position:%{public}d, Connection Type:%{public}d",
358             camera->cameraId.c_str(), camera->position, camera->connectionType);
359         if (any_of(choosedCameras.begin(), choosedCameras.end(),
360             [camera](const auto& defaultCamera) {
361                 return (camera->connectionType != OHOS_CAMERA_CONNECTION_TYPE_USB_PLUGIN &&
362                     defaultCamera->position == camera->position &&
363                     defaultCamera->connectionType == camera->connectionType &&
364                     defaultCamera->foldStatus == camera->foldStatus);
365             })
366         ) {
367             MEDIA_INFO_LOG("ChooseDeFaultCameras alreadly has default camera");
368         } else {
369             choosedCameras.emplace_back(camera);
370             MEDIA_INFO_LOG("add camera ID:%{public}s", camera->cameraId.c_str());
371         }
372     }
373     return choosedCameras;
374 }
375 
GetCameraIds(vector<string> & cameraIds)376 int32_t HCameraService::GetCameraIds(vector<string>& cameraIds)
377 {
378     CAMERA_SYNC_TRACE;
379     int32_t ret = CAMERA_OK;
380     MEDIA_DEBUG_LOG("HCameraService::GetCameraIds");
381     std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
382     ret = GetCameras(cameraIds, cameraAbilityList);
383     CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::GetCameraIds failed");
384     return ret;
385 }
386 
GetCameraAbility(std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & cameraAbility)387 int32_t HCameraService::GetCameraAbility(std::string& cameraId,
388     std::shared_ptr<OHOS::Camera::CameraMetadata>& cameraAbility)
389 {
390     CAMERA_SYNC_TRACE;
391     int32_t ret = CAMERA_OK;
392     MEDIA_DEBUG_LOG("HCameraService::GetCameraAbility");
393 
394     std::vector<std::string> cameraIds;
395     std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
396     ret = GetCameras(cameraIds, cameraAbilityList);
397     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "HCameraService::GetCameraAbility failed");
398 
399     int32_t index = 0;
400     for (auto id : cameraIds) {
401         if (id.compare(cameraId) == 0) {
402             break;
403         }
404         index++;
405     }
406     int32_t abilityIndex = 0;
407     for (auto it : cameraAbilityList) {
408         if (abilityIndex == index) {
409             cameraAbility = it;
410             break;
411         }
412         abilityIndex++;
413     }
414     return ret;
415 }
416 
CreateCameraDevice(string cameraId,sptr<ICameraDeviceService> & device)417 int32_t HCameraService::CreateCameraDevice(string cameraId, sptr<ICameraDeviceService>& device)
418 {
419     CAMERA_SYNC_TRACE;
420     OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
421     MEDIA_INFO_LOG("HCameraService::CreateCameraDevice prepare execute, cameraId:%{public}s", cameraId.c_str());
422 
423     string permissionName = OHOS_PERMISSION_CAMERA;
424     int32_t ret = CheckPermission(permissionName, callerToken);
425     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
426         "HCameraService::CreateCameraDevice Check OHOS_PERMISSION_CAMERA fail %{public}d", ret);
427     // if callerToken is invalid, will not call IsAllowedUsingPermission
428     CHECK_ERROR_RETURN_RET_LOG(!IsInForeGround(callerToken), CAMERA_ALLOC_ERROR,
429         "HCameraService::CreateCameraDevice is not allowed!");
430     sptr<HCameraDevice> cameraDevice = new (nothrow) HCameraDevice(cameraHostManager_, cameraId, callerToken);
431     CHECK_ERROR_RETURN_RET_LOG(cameraDevice == nullptr, CAMERA_ALLOC_ERROR,
432         "HCameraService::CreateCameraDevice HCameraDevice allocation failed");
433     CHECK_ERROR_RETURN_RET_LOG(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE,
434         "HCameraService::CreateCameraDevice CameraService not ready!");
435     {
436         lock_guard<mutex> lock(g_dataShareHelperMutex);
437         // when create camera device, update mute setting truely.
438         if (IsCameraMuteSupported(cameraId)) {
439             if (UpdateMuteSetting(cameraDevice, muteModeStored_) != CAMERA_OK) {
440                 MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
441             }
442         } else {
443             MEDIA_ERR_LOG("HCameraService::CreateCameraDevice MuteCamera not Supported");
444         }
445         device = cameraDevice;
446         cameraDevice->SetDeviceMuteMode(muteModeStored_);
447     }
448 #ifdef CAMERA_USE_SENSOR
449     RegisterSensorCallback();
450 #endif
451     CAMERA_SYSEVENT_STATISTIC(CreateMsg("CameraManager_CreateCameraInput CameraId:%s", cameraId.c_str()));
452     MEDIA_INFO_LOG("HCameraService::CreateCameraDevice execute success");
453     return CAMERA_OK;
454 }
455 
CreateCaptureSession(sptr<ICaptureSession> & session,int32_t opMode)456 int32_t HCameraService::CreateCaptureSession(sptr<ICaptureSession>& session, int32_t opMode)
457 {
458     CAMERA_SYNC_TRACE;
459     std::lock_guard<std::mutex> lock(mutex_);
460     int32_t rc = CAMERA_OK;
461     MEDIA_INFO_LOG("HCameraService::CreateCaptureSession opMode_= %{public}d", opMode);
462 
463     OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
464     sptr<HCaptureSession> captureSession = HCaptureSession::NewInstance(callerToken, opMode);
465     if (captureSession == nullptr) {
466         rc = CAMERA_ALLOC_ERROR;
467         MEDIA_ERR_LOG("HCameraService::CreateCaptureSession allocation failed");
468         CameraReportUtils::ReportCameraError(
469             "HCameraService::CreateCaptureSession", rc, false, CameraReportUtils::GetCallerInfo());
470         return rc;
471     }
472     session = captureSession;
473     pid_t pid = IPCSkeleton::GetCallingPid();
474     captureSessionsManager_.EnsureInsert(pid, captureSession);
475     return rc;
476 }
477 
CreateDeferredPhotoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredPhotoProcessingSession> & session)478 int32_t HCameraService::CreateDeferredPhotoProcessingSession(int32_t userId,
479     sptr<DeferredProcessing::IDeferredPhotoProcessingSessionCallback>& callback,
480     sptr<DeferredProcessing::IDeferredPhotoProcessingSession>& session)
481 {
482     CAMERA_SYNC_TRACE;
483     MEDIA_INFO_LOG("HCameraService::CreateDeferredPhotoProcessingSession enter.");
484     sptr<DeferredProcessing::IDeferredPhotoProcessingSession> photoSession;
485     int32_t uid = IPCSkeleton::GetCallingUid();
486     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
487     MEDIA_INFO_LOG("CreateDeferredPhotoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
488     photoSession =
489         DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredPhotoProcessingSession(userId,
490         callback);
491     session = photoSession;
492     return CAMERA_OK;
493 }
494 
CreateDeferredVideoProcessingSession(int32_t userId,sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback> & callback,sptr<DeferredProcessing::IDeferredVideoProcessingSession> & session)495 int32_t HCameraService::CreateDeferredVideoProcessingSession(int32_t userId,
496     sptr<DeferredProcessing::IDeferredVideoProcessingSessionCallback>& callback,
497     sptr<DeferredProcessing::IDeferredVideoProcessingSession>& session)
498 {
499     CAMERA_SYNC_TRACE;
500     MEDIA_INFO_LOG("HCameraService::CreateDeferredVideoProcessingSession enter.");
501     sptr<DeferredProcessing::IDeferredVideoProcessingSession> videoSession;
502     int32_t uid = IPCSkeleton::GetCallingUid();
503     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid, userId);
504     MEDIA_INFO_LOG("CreateDeferredVideoProcessingSession get uid:%{public}d userId:%{public}d", uid, userId);
505     videoSession =
506         DeferredProcessing::DeferredProcessingService::GetInstance().CreateDeferredVideoProcessingSession(userId,
507         callback);
508     session = videoSession;
509     return CAMERA_OK;
510 }
511 
CreatePhotoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamCapture> & photoOutput)512 int32_t HCameraService::CreatePhotoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
513     int32_t height, sptr<IStreamCapture>& photoOutput)
514 {
515     CAMERA_SYNC_TRACE;
516     int32_t rc = CAMERA_OK;
517     MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput prepare execute");
518     if ((producer == nullptr) || (width == 0) || (height == 0)) {
519         rc = CAMERA_INVALID_ARG;
520         MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput producer is null");
521         CameraReportUtils::ReportCameraError(
522             "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
523         return rc;
524     }
525     sptr<HStreamCapture> streamCapture = new (nothrow) HStreamCapture(producer, format, width, height);
526     if (streamCapture == nullptr) {
527         rc = CAMERA_ALLOC_ERROR;
528         MEDIA_ERR_LOG("HCameraService::CreatePhotoOutput streamCapture is null");
529         CameraReportUtils::ReportCameraError(
530             "HCameraService::CreatePhotoOutput", rc, false, CameraReportUtils::GetCallerInfo());
531         return rc;
532     }
533 
534     stringstream ss;
535     ss << "format=" << format << " width=" << width << " height=" << height;
536     CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
537     photoOutput = streamCapture;
538     MEDIA_INFO_LOG("HCameraService::CreatePhotoOutput execute success");
539     return rc;
540 }
541 
CreateDeferredPreviewOutput(int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)542 int32_t HCameraService::CreateDeferredPreviewOutput(
543     int32_t format, int32_t width, int32_t height, sptr<IStreamRepeat>& previewOutput)
544 {
545     CAMERA_SYNC_TRACE;
546     sptr<HStreamRepeat> streamDeferredPreview;
547     MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput prepare execute");
548     CHECK_ERROR_RETURN_RET_LOG((width == 0) || (height == 0), CAMERA_INVALID_ARG,
549         "HCameraService::CreateDeferredPreviewOutput producer is null!");
550     streamDeferredPreview = new (nothrow) HStreamRepeat(nullptr, format, width, height, RepeatStreamType::PREVIEW);
551     CHECK_ERROR_RETURN_RET_LOG(streamDeferredPreview == nullptr, CAMERA_ALLOC_ERROR,
552         "HCameraService::CreateDeferredPreviewOutput HStreamRepeat allocation failed");
553     previewOutput = streamDeferredPreview;
554     MEDIA_INFO_LOG("HCameraService::CreateDeferredPreviewOutput execute success");
555     return CAMERA_OK;
556 }
557 
CreatePreviewOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & previewOutput)558 int32_t HCameraService::CreatePreviewOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
559     int32_t height, sptr<IStreamRepeat>& previewOutput)
560 {
561     CAMERA_SYNC_TRACE;
562     sptr<HStreamRepeat> streamRepeatPreview;
563     int32_t rc = CAMERA_OK;
564     MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput prepare execute");
565 
566     if ((producer == nullptr) || (width == 0) || (height == 0)) {
567         rc = CAMERA_INVALID_ARG;
568         MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput producer is null");
569         CameraReportUtils::ReportCameraError(
570             "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
571         return rc;
572     }
573     streamRepeatPreview = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::PREVIEW);
574     if (streamRepeatPreview == nullptr) {
575         rc = CAMERA_ALLOC_ERROR;
576         MEDIA_ERR_LOG("HCameraService::CreatePreviewOutput HStreamRepeat allocation failed");
577         CameraReportUtils::ReportCameraError(
578             "HCameraService::CreatePreviewOutput", rc, false, CameraReportUtils::GetCallerInfo());
579         return rc;
580     }
581     previewOutput = streamRepeatPreview;
582     MEDIA_INFO_LOG("HCameraService::CreatePreviewOutput execute success");
583     return rc;
584 }
585 
CreateDepthDataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamDepthData> & depthDataOutput)586 int32_t HCameraService::CreateDepthDataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
587     int32_t width, int32_t height, sptr<IStreamDepthData>& depthDataOutput)
588 {
589     CAMERA_SYNC_TRACE;
590     sptr<HStreamDepthData> streamDepthData;
591     int32_t rc = CAMERA_OK;
592     MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput prepare execute");
593 
594     if ((producer == nullptr) || (width == 0) || (height == 0)) {
595         rc = CAMERA_INVALID_ARG;
596         MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput producer is null");
597         CameraReportUtils::ReportCameraError(
598             "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
599         return rc;
600     }
601     streamDepthData = new (nothrow) HStreamDepthData(producer, format, width, height);
602     if (streamDepthData == nullptr) {
603         rc = CAMERA_ALLOC_ERROR;
604         MEDIA_ERR_LOG("HCameraService::CreateDepthDataOutput HStreamRepeat allocation failed");
605         CameraReportUtils::ReportCameraError(
606             "HCameraService::CreateDepthDataOutput", rc, false, CameraReportUtils::GetCallerInfo());
607         return rc;
608     }
609     depthDataOutput = streamDepthData;
610     MEDIA_INFO_LOG("HCameraService::CreateDepthDataOutput execute success");
611     return rc;
612 }
613 
CreateMetadataOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,std::vector<int32_t> metadataTypes,sptr<IStreamMetadata> & metadataOutput)614 int32_t HCameraService::CreateMetadataOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format,
615     std::vector<int32_t> metadataTypes, sptr<IStreamMetadata>& metadataOutput)
616 {
617     CAMERA_SYNC_TRACE;
618     sptr<HStreamMetadata> streamMetadata;
619     MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput prepare execute");
620 
621     CHECK_ERROR_RETURN_RET_LOG(producer == nullptr, CAMERA_INVALID_ARG,
622         "HCameraService::CreateMetadataOutput producer is null");
623     streamMetadata = new (nothrow) HStreamMetadata(producer, format, metadataTypes);
624     CHECK_ERROR_RETURN_RET_LOG(streamMetadata == nullptr, CAMERA_ALLOC_ERROR,
625         "HCameraService::CreateMetadataOutput HStreamMetadata allocation failed");
626 
627     metadataOutput = streamMetadata;
628     MEDIA_INFO_LOG("HCameraService::CreateMetadataOutput execute success");
629     return CAMERA_OK;
630 }
631 
CreateVideoOutput(const sptr<OHOS::IBufferProducer> & producer,int32_t format,int32_t width,int32_t height,sptr<IStreamRepeat> & videoOutput)632 int32_t HCameraService::CreateVideoOutput(const sptr<OHOS::IBufferProducer>& producer, int32_t format, int32_t width,
633     int32_t height, sptr<IStreamRepeat>& videoOutput)
634 {
635     CAMERA_SYNC_TRACE;
636     sptr<HStreamRepeat> streamRepeatVideo;
637     int32_t rc = CAMERA_OK;
638     MEDIA_INFO_LOG("HCameraService::CreateVideoOutput prepare execute");
639 
640     if ((producer == nullptr) || (width == 0) || (height == 0)) {
641         rc = CAMERA_INVALID_ARG;
642         MEDIA_ERR_LOG("HCameraService::CreateVideoOutput producer is null");
643         CameraReportUtils::ReportCameraError(
644             "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
645         return rc;
646     }
647     streamRepeatVideo = new (nothrow) HStreamRepeat(producer, format, width, height, RepeatStreamType::VIDEO);
648     if (streamRepeatVideo == nullptr) {
649         rc = CAMERA_ALLOC_ERROR;
650         MEDIA_ERR_LOG("HCameraService::CreateVideoOutput HStreamRepeat allocation failed");
651         CameraReportUtils::ReportCameraError(
652             "HCameraService::CreateVideoOutput", rc, false, CameraReportUtils::GetCallerInfo());
653         return rc;
654     }
655     stringstream ss;
656     ss << "format=" << format << " width=" << width << " height=" << height;
657     CameraReportUtils::GetInstance().UpdateProfileInfo(ss.str());
658     videoOutput = streamRepeatVideo;
659     MEDIA_INFO_LOG("HCameraService::CreateVideoOutput execute success");
660     return rc;
661 }
662 
ShouldSkipStatusUpdates(pid_t pid)663 bool HCameraService::ShouldSkipStatusUpdates(pid_t pid)
664 {
665     std::lock_guard<std::mutex> lock(freezedPidListMutex_);
666     CHECK_AND_RETURN_RET(freezedPidList_.count(pid) != 0, false);
667     MEDIA_INFO_LOG("ShouldSkipStatusUpdates pid = %{public}d", pid);
668     return true;
669 }
670 
OnCameraStatus(const string & cameraId,CameraStatus status,CallbackInvoker invoker)671 void HCameraService::OnCameraStatus(const string& cameraId, CameraStatus status, CallbackInvoker invoker)
672 {
673     lock_guard<mutex> lock(cameraCbMutex_);
674     std::string bundleName = "";
675     if (invoker == CallbackInvoker::APPLICATION) {
676         bundleName = GetClientBundle(IPCSkeleton::GetCallingUid());
677     }
678     MEDIA_INFO_LOG("HCameraService::OnCameraStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
679         "status = %{public}d, pid = %{public}d, bundleName = %{public}s", cameraServiceCallbacks_.size(),
680         cameraId.c_str(), status, IPCSkeleton::GetCallingPid(), bundleName.c_str());
681     for (auto it : cameraServiceCallbacks_) {
682         if (it.second == nullptr) {
683             MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
684             continue;
685         }
686         uint32_t pid = it.first;
687         if (ShouldSkipStatusUpdates(pid)) {
688             continue;
689         }
690         it.second->OnCameraStatusChanged(cameraId, status, bundleName);
691         cameraStatusCallbacks_[cameraId] = CameraStatusCallbacksInfo{status, bundleName};
692         CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraStatusChanged! for cameraId:%s, current Camera Status:%d",
693             cameraId.c_str(), status));
694     }
695 }
696 
OnFlashlightStatus(const string & cameraId,FlashStatus status)697 void HCameraService::OnFlashlightStatus(const string& cameraId, FlashStatus status)
698 {
699     lock_guard<mutex> lock(cameraCbMutex_);
700     MEDIA_INFO_LOG("HCameraService::OnFlashlightStatus callbacks.size = %{public}zu, cameraId = %{public}s, "
701         "status = %{public}d, pid = %{public}d", cameraServiceCallbacks_.size(), cameraId.c_str(), status,
702         IPCSkeleton::GetCallingPid());
703     for (auto it : cameraServiceCallbacks_) {
704         if (it.second == nullptr) {
705             MEDIA_ERR_LOG("HCameraService::OnCameraStatus pid:%{public}d cameraServiceCallback is null", it.first);
706             continue;
707         }
708         uint32_t pid = it.first;
709         if (ShouldSkipStatusUpdates(pid)) {
710             continue;
711         }
712         it.second->OnFlashlightStatusChanged(cameraId, status);
713     }
714 }
715 
OnMute(bool muteMode)716 void HCameraService::OnMute(bool muteMode)
717 {
718     lock_guard<mutex> lock(muteCbMutex_);
719     if (!cameraMuteServiceCallbacks_.empty()) {
720         for (auto it : cameraMuteServiceCallbacks_) {
721             if (it.second == nullptr) {
722                 MEDIA_ERR_LOG("HCameraService::OnMute pid:%{public}d cameraMuteServiceCallback is null", it.first);
723                 continue;
724             }
725             uint32_t pid = it.first;
726             if (ShouldSkipStatusUpdates(pid)) {
727                 continue;
728             }
729             it.second->OnCameraMute(muteMode);
730             CAMERA_SYSEVENT_BEHAVIOR(CreateMsg("OnCameraMute! current Camera muteMode:%d", muteMode));
731         }
732     }
733     if (peerCallback_ != nullptr) {
734         MEDIA_INFO_LOG("HCameraService::NotifyMuteCamera peerCallback current camera muteMode:%{public}d", muteMode);
735         peerCallback_->NotifyMuteCamera(muteMode);
736     }
737 }
738 
OnTorchStatus(TorchStatus status)739 void HCameraService::OnTorchStatus(TorchStatus status)
740 {
741     lock_guard<recursive_mutex> lock(torchCbMutex_);
742     torchStatus_ = status;
743     MEDIA_INFO_LOG("HCameraService::OnTorchtStatus callbacks.size = %{public}zu, status = %{public}d, pid = %{public}d",
744         torchServiceCallbacks_.size(), status, IPCSkeleton::GetCallingPid());
745     for (auto it : torchServiceCallbacks_) {
746         if (it.second == nullptr) {
747             MEDIA_ERR_LOG("HCameraService::OnTorchtStatus pid:%{public}d torchServiceCallback is null", it.first);
748             continue;
749         }
750         uint32_t pid = it.first;
751         if (ShouldSkipStatusUpdates(pid)) {
752             continue;
753         }
754         it.second->OnTorchStatusChange(status);
755     }
756 }
757 
OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)758 void HCameraService::OnFoldStatusChanged(OHOS::Rosen::FoldStatus foldStatus)
759 {
760     MEDIA_INFO_LOG("OnFoldStatusChanged preFoldStatus = %{public}d, foldStatus = %{public}d, pid = %{public}d",
761         preFoldStatus_, foldStatus, IPCSkeleton::GetCallingPid());
762     auto curFoldStatus = (FoldStatus)foldStatus;
763     if ((curFoldStatus == FoldStatus::HALF_FOLD && preFoldStatus_ == FoldStatus::EXPAND) ||
764         (curFoldStatus == FoldStatus::EXPAND && preFoldStatus_ == FoldStatus::HALF_FOLD)) {
765         preFoldStatus_ = curFoldStatus;
766         return;
767     }
768     preFoldStatus_ = curFoldStatus;
769     if (curFoldStatus == FoldStatus::HALF_FOLD) {
770         curFoldStatus = FoldStatus::EXPAND;
771     }
772     lock_guard<recursive_mutex> lock(foldCbMutex_);
773     CHECK_EXECUTE(innerFoldCallback_, innerFoldCallback_->OnFoldStatusChanged(curFoldStatus));
774     CHECK_ERROR_RETURN_LOG(foldServiceCallbacks_.empty(), "OnFoldStatusChanged foldServiceCallbacks is empty");
775     MEDIA_INFO_LOG("OnFoldStatusChanged foldStatusCallback size = %{public}zu", foldServiceCallbacks_.size());
776     for (auto it : foldServiceCallbacks_) {
777         if (it.second == nullptr) {
778             MEDIA_ERR_LOG("OnFoldStatusChanged pid:%{public}d foldStatusCallbacks is null", it.first);
779             continue;
780         }
781         uint32_t pid = it.first;
782         if (ShouldSkipStatusUpdates(pid)) {
783             continue;
784         }
785         it.second->OnFoldStatusChanged(curFoldStatus);
786     }
787 }
788 
CloseCameraForDestory(pid_t pid)789 int32_t HCameraService::CloseCameraForDestory(pid_t pid)
790 {
791     MEDIA_INFO_LOG("HCameraService::CloseCameraForDestory enter");
792     sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
793     sptr<HCameraDevice> deviceNeedClose = deviceManager->GetCameraByPid(pid);
794     if (deviceNeedClose != nullptr) {
795         deviceNeedClose->Close();
796     }
797     return CAMERA_OK;
798 }
799 
ExecutePidSetCallback(sptr<ICameraServiceCallback> & callback,std::vector<std::string> & cameraIds)800 void HCameraService::ExecutePidSetCallback(sptr<ICameraServiceCallback>& callback, std::vector<std::string> &cameraIds)
801 {
802     for (const auto& cameraId : cameraIds) {
803         auto it = cameraStatusCallbacks_.find(cameraId);
804         if (it != cameraStatusCallbacks_.end()) {
805             MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = %{public}d, bundleName = %{public}s",
806                 cameraId.c_str(), it->second.status, it->second.bundleName.c_str());
807             callback->OnCameraStatusChanged(cameraId, it->second.status, it->second.bundleName);
808         } else {
809             MEDIA_INFO_LOG("ExecutePidSetCallback cameraId = %{public}s, status = 2", cameraId.c_str());
810             callback->OnCameraStatusChanged(cameraId, CameraStatus::CAMERA_STATUS_AVAILABLE);
811         }
812     }
813 }
814 
SetCameraCallback(sptr<ICameraServiceCallback> & callback)815 int32_t HCameraService::SetCameraCallback(sptr<ICameraServiceCallback>& callback)
816 {
817     std::vector<std::string> cameraIds;
818     GetCameraIds(cameraIds);
819     lock_guard<mutex> lock(cameraCbMutex_);
820     pid_t pid = IPCSkeleton::GetCallingPid();
821     MEDIA_INFO_LOG("HCameraService::SetCameraCallback pid = %{public}d", pid);
822     CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
823         "HCameraService::SetCameraCallback callback is null");
824     auto callbackItem = cameraServiceCallbacks_.find(pid);
825     if (callbackItem != cameraServiceCallbacks_.end()) {
826         callbackItem->second = nullptr;
827         (void)cameraServiceCallbacks_.erase(callbackItem);
828     }
829     cameraServiceCallbacks_.insert(make_pair(pid, callback));
830     ExecutePidSetCallback(callback, cameraIds);
831     return CAMERA_OK;
832 }
833 
SetMuteCallback(sptr<ICameraMuteServiceCallback> & callback)834 int32_t HCameraService::SetMuteCallback(sptr<ICameraMuteServiceCallback>& callback)
835 {
836     lock_guard<mutex> lock(muteCbMutex_);
837     pid_t pid = IPCSkeleton::GetCallingPid();
838     MEDIA_INFO_LOG("HCameraService::SetMuteCallback pid = %{public}d", pid);
839     CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
840         "HCameraService::SetMuteCallback callback is null");
841     // If the callback set by the SA caller is later than the camera service is started,
842     // the callback cannot be triggered to obtain the mute state. Therefore,
843     // when the SA sets the callback, the callback is triggered immediately to return the mute state.
844     constexpr int32_t maxSaUid = 10000;
845     if (IPCSkeleton::GetCallingUid() > 0 && IPCSkeleton::GetCallingUid() < maxSaUid) {
846         callback->OnCameraMute(muteModeStored_);
847     }
848     cameraMuteServiceCallbacks_.insert(make_pair(pid, callback));
849     return CAMERA_OK;
850 }
851 
SetTorchCallback(sptr<ITorchServiceCallback> & callback)852 int32_t HCameraService::SetTorchCallback(sptr<ITorchServiceCallback>& callback)
853 {
854     lock_guard<recursive_mutex> lock(torchCbMutex_);
855     pid_t pid = IPCSkeleton::GetCallingPid();
856     MEDIA_INFO_LOG("HCameraService::SetTorchCallback pid = %{public}d", pid);
857     CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
858         "HCameraService::SetTorchCallback callback is null");
859     torchServiceCallbacks_.insert(make_pair(pid, callback));
860 
861     MEDIA_INFO_LOG("HCameraService::SetTorchCallback notify pid = %{public}d", pid);
862     callback->OnTorchStatusChange(torchStatus_);
863     return CAMERA_OK;
864 }
865 
SetFoldStatusCallback(sptr<IFoldServiceCallback> & callback,bool isInnerCallback)866 int32_t HCameraService::SetFoldStatusCallback(sptr<IFoldServiceCallback>& callback, bool isInnerCallback)
867 {
868     lock_guard<recursive_mutex> lock(foldCbMutex_);
869     isFoldable = isFoldableInit ? isFoldable : g_isFoldScreen;
870     CHECK_EXECUTE((isFoldable && !isFoldRegister), RegisterFoldStatusListener());
871     if (isInnerCallback) {
872         innerFoldCallback_ = callback;
873     } else {
874         pid_t pid = IPCSkeleton::GetCallingPid();
875         MEDIA_INFO_LOG("HCameraService::SetFoldStatusCallback pid = %{public}d", pid);
876         CHECK_ERROR_RETURN_RET_LOG(callback == nullptr, CAMERA_INVALID_ARG,
877             "HCameraService::SetFoldStatusCallback callback is null");
878         foldServiceCallbacks_.insert(make_pair(pid, callback));
879     }
880     return CAMERA_OK;
881 }
882 
UnSetCameraCallback(pid_t pid)883 int32_t HCameraService::UnSetCameraCallback(pid_t pid)
884 {
885     lock_guard<mutex> lock(cameraCbMutex_);
886     MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback pid = %{public}d, size = %{public}zu",
887         pid, cameraServiceCallbacks_.size());
888     if (!cameraServiceCallbacks_.empty()) {
889         MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback cameraServiceCallbacks_ is not empty, reset it");
890         auto it = cameraServiceCallbacks_.find(pid);
891         if ((it != cameraServiceCallbacks_.end()) && (it->second != nullptr)) {
892             it->second = nullptr;
893             cameraServiceCallbacks_.erase(it);
894         }
895     }
896     MEDIA_INFO_LOG("HCameraService::UnSetCameraCallback after erase pid = %{public}d, size = %{public}zu",
897         pid, cameraServiceCallbacks_.size());
898     return CAMERA_OK;
899 }
900 
UnSetMuteCallback(pid_t pid)901 int32_t HCameraService::UnSetMuteCallback(pid_t pid)
902 {
903     lock_guard<mutex> lock(muteCbMutex_);
904     MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback pid = %{public}d, size = %{public}zu",
905         pid, cameraMuteServiceCallbacks_.size());
906     if (!cameraMuteServiceCallbacks_.empty()) {
907         MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback cameraMuteServiceCallbacks_ is not empty, reset it");
908         auto it = cameraMuteServiceCallbacks_.find(pid);
909         if ((it != cameraMuteServiceCallbacks_.end()) && (it->second)) {
910             it->second = nullptr;
911             cameraMuteServiceCallbacks_.erase(it);
912         }
913     }
914 
915     MEDIA_INFO_LOG("HCameraService::UnSetMuteCallback after erase pid = %{public}d, size = %{public}zu",
916         pid, cameraMuteServiceCallbacks_.size());
917     return CAMERA_OK;
918 }
919 
UnSetTorchCallback(pid_t pid)920 int32_t HCameraService::UnSetTorchCallback(pid_t pid)
921 {
922     lock_guard<recursive_mutex> lock(torchCbMutex_);
923     MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback pid = %{public}d, size = %{public}zu",
924         pid, torchServiceCallbacks_.size());
925     if (!torchServiceCallbacks_.empty()) {
926         MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback torchServiceCallbacks_ is not empty, reset it");
927         auto it = torchServiceCallbacks_.find(pid);
928         if ((it != torchServiceCallbacks_.end()) && (it->second)) {
929             it->second = nullptr;
930             torchServiceCallbacks_.erase(it);
931         }
932     }
933 
934     MEDIA_INFO_LOG("HCameraService::UnSetTorchCallback after erase pid = %{public}d, size = %{public}zu",
935         pid, torchServiceCallbacks_.size());
936     return CAMERA_OK;
937 }
938 
UnSetFoldStatusCallback(pid_t pid)939 int32_t HCameraService::UnSetFoldStatusCallback(pid_t pid)
940 {
941     lock_guard<recursive_mutex> lock(foldCbMutex_);
942     MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback pid = %{public}d, size = %{public}zu",
943         pid, foldServiceCallbacks_.size());
944     if (!foldServiceCallbacks_.empty()) {
945         MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback foldServiceCallbacks_ is not empty, reset it");
946         auto it = foldServiceCallbacks_.find(pid);
947         if ((it != foldServiceCallbacks_.end()) && (it->second)) {
948             it->second = nullptr;
949             foldServiceCallbacks_.erase(it);
950         }
951     }
952     MEDIA_INFO_LOG("HCameraService::UnSetFoldStatusCallback after erase pid = %{public}d, size = %{public}zu",
953         pid, foldServiceCallbacks_.size());
954     innerFoldCallback_ = nullptr;
955     return CAMERA_OK;
956 }
957 
RegisterFoldStatusListener()958 void HCameraService::RegisterFoldStatusListener()
959 {
960     MEDIA_INFO_LOG("RegisterFoldStatusListener is called");
961     preFoldStatus_ = (FoldStatus)OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus();
962     auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(this);
963     CHECK_ERROR_RETURN_LOG(ret != OHOS::Rosen::DMError::DM_OK, "RegisterFoldStatusListener failed");
964     isFoldRegister = true;
965 }
966 
UnRegisterFoldStatusListener()967 void HCameraService::UnRegisterFoldStatusListener()
968 {
969     MEDIA_INFO_LOG("UnRegisterFoldStatusListener is called");
970     auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterFoldStatusListener(this);
971     preFoldStatus_ = FoldStatus::UNKNOWN_FOLD;
972     CHECK_ERROR_PRINT_LOG(ret != OHOS::Rosen::DMError::DM_OK, "UnRegisterFoldStatusListener failed");
973     isFoldRegister = false;
974 }
975 
UnSetAllCallback(pid_t pid)976 int32_t HCameraService::UnSetAllCallback(pid_t pid)
977 {
978     MEDIA_INFO_LOG("HCameraService::UnSetAllCallback enter");
979     UnSetCameraCallback(pid);
980     UnSetMuteCallback(pid);
981     UnSetTorchCallback(pid);
982     UnSetFoldStatusCallback(pid);
983     return CAMERA_OK;
984 }
985 
IsCameraMuteSupported(string cameraId)986 bool HCameraService::IsCameraMuteSupported(string cameraId)
987 {
988     bool isMuteSupported = false;
989     shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
990     int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
991     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, false, "HCameraService::IsCameraMuted GetCameraAbility failed");
992     camera_metadata_item_t item;
993     common_metadata_header_t* metadata = cameraAbility->get();
994     ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_MUTE_MODES, &item);
995     if (ret == CAM_META_SUCCESS) {
996         for (uint32_t i = 0; i < item.count; i++) {
997             MEDIA_INFO_LOG("OHOS_ABILITY_MUTE_MODES %{public}d th is %{public}d", i, item.data.u8[i]);
998             if (item.data.u8[i] == OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK) {
999                 isMuteSupported = true;
1000                 break;
1001             }
1002         }
1003     } else {
1004         isMuteSupported = false;
1005         MEDIA_ERR_LOG("HCameraService::IsCameraMuted not find MUTE ability");
1006     }
1007     MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted supported: %{public}d", isMuteSupported);
1008     return isMuteSupported;
1009 }
1010 
UpdateMuteSetting(sptr<HCameraDevice> cameraDevice,bool muteMode)1011 int32_t HCameraService::UpdateMuteSetting(sptr<HCameraDevice> cameraDevice, bool muteMode)
1012 {
1013     constexpr int32_t DEFAULT_ITEMS = 1;
1014     constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1015     shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata =
1016         make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1017     bool status = false;
1018     int32_t ret;
1019     int32_t count = 1;
1020     uint8_t mode = muteMode ? OHOS_CAMERA_MUTE_MODE_SOLID_COLOR_BLACK : OHOS_CAMERA_MUTE_MODE_OFF;
1021     camera_metadata_item_t item;
1022 
1023     MEDIA_DEBUG_LOG("UpdateMuteSetting muteMode: %{public}d", muteMode);
1024 
1025     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_MUTE_MODE, &item);
1026     if (ret == CAM_META_ITEM_NOT_FOUND) {
1027         status = changedMetadata->addEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1028     } else if (ret == CAM_META_SUCCESS) {
1029         status = changedMetadata->updateEntry(OHOS_CONTROL_MUTE_MODE, &mode, count);
1030     }
1031     ret = cameraDevice->UpdateSetting(changedMetadata);
1032     CHECK_ERROR_RETURN_RET_LOG(!status || ret != CAMERA_OK, CAMERA_UNKNOWN_ERROR, "UpdateMuteSetting muteMode Failed");
1033     return CAMERA_OK;
1034 }
1035 
MuteCameraFunc(bool muteMode)1036 int32_t HCameraService::MuteCameraFunc(bool muteMode)
1037 {
1038     {
1039         lock_guard<mutex> lock(g_dataShareHelperMutex);
1040         cameraHostManager_->SetMuteMode(muteMode);
1041     }
1042     int32_t ret = CAMERA_OK;
1043     bool currentMuteMode = muteModeStored_;
1044     sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1045     pid_t activeClient = deviceManager->GetActiveClient();
1046     if (activeClient == -1) {
1047         OnMute(muteMode);
1048         int32_t retCode = SetMuteModeByDataShareHelper(muteMode);
1049         muteModeStored_ = muteMode;
1050         if (retCode != CAMERA_OK) {
1051             MEDIA_ERR_LOG("no activeClient, SetMuteModeByDataShareHelper: ret=%{public}d", retCode);
1052             muteModeStored_ = currentMuteMode;
1053         }
1054         return retCode;
1055     }
1056     sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1057     if (activeDevice != nullptr) {
1058         string cameraId = activeDevice->GetCameraId();
1059         CHECK_ERROR_RETURN_RET_LOG(!IsCameraMuteSupported(cameraId), CAMERA_UNSUPPORTED,
1060             "Not Supported Mute,cameraId: %{public}s", cameraId.c_str());
1061         if (activeDevice != nullptr) {
1062             ret = UpdateMuteSetting(activeDevice, muteMode);
1063         }
1064         if (ret != CAMERA_OK) {
1065             MEDIA_ERR_LOG("UpdateMuteSetting Failed, cameraId: %{public}s", cameraId.c_str());
1066             muteModeStored_ = currentMuteMode;
1067         }
1068     }
1069     if (ret == CAMERA_OK) {
1070         OnMute(muteMode);
1071     }
1072     if (activeDevice != nullptr) {
1073         activeDevice->SetDeviceMuteMode(muteMode);
1074     }
1075     ret = SetMuteModeByDataShareHelper(muteMode);
1076     if (ret == CAMERA_OK) {
1077         muteModeStored_ = muteMode;
1078     }
1079     return ret;
1080 }
1081 
1082 static std::map<PolicyType, Security::AccessToken::PolicyType> g_policyTypeMap_ = {
1083     {PolicyType::EDM, Security::AccessToken::PolicyType::EDM},
1084     {PolicyType::PRIVACY, Security::AccessToken::PolicyType::PRIVACY},
1085 };
1086 
MuteCamera(bool muteMode)1087 int32_t HCameraService::MuteCamera(bool muteMode)
1088 {
1089     int32_t ret = CheckPermission(OHOS_PERMISSION_MANAGE_CAMERA_CONFIG, IPCSkeleton::GetCallingTokenID());
1090     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission argumentis failed!");
1091     CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1092         to_string(muteMode), CameraReportUtils::GetCallerInfo());
1093     return MuteCameraFunc(muteMode);
1094 }
1095 
MuteCameraPersist(PolicyType policyType,bool isMute)1096 int32_t HCameraService::MuteCameraPersist(PolicyType policyType, bool isMute)
1097 {
1098     int32_t ret = CheckPermission(OHOS_PERMISSION_CAMERA_CONTROL, IPCSkeleton::GetCallingTokenID());
1099     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret, "CheckPermission arguments failed!");
1100     CameraReportUtils::GetInstance().ReportUserBehavior(DFX_UB_MUTE_CAMERA,
1101         to_string(isMute), CameraReportUtils::GetCallerInfo());
1102     CHECK_ERROR_RETURN_RET_LOG(g_policyTypeMap_.count(policyType) == 0, CAMERA_INVALID_ARG,
1103         "MuteCameraPersist Failed, invalid param policyType = %{public}d", static_cast<int32_t>(policyType));
1104     bool targetMuteMode = isMute;
1105     const Security::AccessToken::PolicyType secPolicyType = g_policyTypeMap_[policyType];
1106     const Security::AccessToken::CallerType secCaller = Security::AccessToken::CallerType::CAMERA;
1107     ret = Security::AccessToken::PrivacyKit::SetMutePolicy(secPolicyType, secCaller, isMute);
1108     if (ret != Security::AccessToken::RET_SUCCESS) {
1109         MEDIA_ERR_LOG("MuteCameraPersist SetMutePolicy return false, policyType = %{public}d, retCode = %{public}d",
1110             static_cast<int32_t>(policyType), static_cast<int32_t>(ret));
1111         targetMuteMode = muteModeStored_;
1112     }
1113     return MuteCameraFunc(targetMuteMode);
1114 }
1115 
PrelaunchCamera()1116 int32_t HCameraService::PrelaunchCamera()
1117 {
1118     CAMERA_SYNC_TRACE;
1119     MEDIA_INFO_LOG("HCameraService::PrelaunchCamera");
1120     CHECK_ERROR_RETURN_RET_LOG(HCameraDeviceManager::GetInstance()->GetCameraStateOfASide().Size() != 0,
1121         CAMERA_DEVICE_CONFLICT, "HCameraService::PrelaunchCamera there is a device active in A side, abort!");
1122     if (preCameraId_.empty()) {
1123         vector<string> cameraIds_;
1124         cameraHostManager_->GetCameras(cameraIds_);
1125         if (cameraIds_.empty()) {
1126             return CAMERA_OK;
1127         }
1128         preCameraId_ = cameraIds_.front();
1129     }
1130     MEDIA_INFO_LOG("HCameraService::PrelaunchCamera preCameraId_ is: %{public}s", preCameraId_.c_str());
1131     CAMERA_SYSEVENT_STATISTIC(CreateMsg("Camera Prelaunch CameraId:%s", preCameraId_.c_str()));
1132     CameraReportUtils::GetInstance().SetOpenCamPerfPreInfo(preCameraId_.c_str(), CameraReportUtils::GetCallerInfo());
1133     int32_t ret = cameraHostManager_->Prelaunch(preCameraId_, preCameraClient_);
1134     CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1135     return ret;
1136 }
1137 
PreSwitchCamera(const std::string cameraId)1138 int32_t HCameraService::PreSwitchCamera(const std::string cameraId)
1139 {
1140     CAMERA_SYNC_TRACE;
1141     MEDIA_INFO_LOG("HCameraService::PreSwitchCamera");
1142     if (cameraId.empty()) {
1143         return CAMERA_INVALID_ARG;
1144     }
1145     std::vector<std::string> cameraIds_;
1146     cameraHostManager_->GetCameras(cameraIds_);
1147     CHECK_AND_RETURN_RET(!cameraIds_.empty(), CAMERA_INVALID_STATE);
1148     auto it = std::find(cameraIds_.begin(), cameraIds_.end(), cameraId);
1149     CHECK_AND_RETURN_RET(it != cameraIds_.end(), CAMERA_INVALID_ARG);
1150     MEDIA_INFO_LOG("HCameraService::PreSwitchCamera cameraId is: %{public}s", cameraId.c_str());
1151     CameraReportUtils::GetInstance().SetSwitchCamPerfStartInfo(CameraReportUtils::GetCallerInfo());
1152     int32_t ret = cameraHostManager_->PreSwitchCamera(cameraId);
1153     CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "HCameraService::Prelaunch failed");
1154     return ret;
1155 }
1156 
SetPrelaunchConfig(string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam)1157 int32_t HCameraService::SetPrelaunchConfig(string cameraId, RestoreParamTypeOhos restoreParamType, int activeTime,
1158     EffectParam effectParam)
1159 {
1160     CAMERA_SYNC_TRACE;
1161     OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1162     string permissionName = OHOS_PERMISSION_CAMERA;
1163     int32_t ret = CheckPermission(permissionName, callerToken);
1164     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, ret,
1165         "HCameraService::SetPrelaunchConfig failed permission is: %{public}s", permissionName.c_str());
1166 
1167     MEDIA_INFO_LOG("HCameraService::SetPrelaunchConfig cameraId %{public}s", (cameraId).c_str());
1168     vector<string> cameraIds_;
1169     cameraHostManager_->GetCameras(cameraIds_);
1170     if ((find(cameraIds_.begin(), cameraIds_.end(), cameraId) != cameraIds_.end()) && IsPrelaunchSupported(cameraId)) {
1171         preCameraId_ = cameraId;
1172         MEDIA_INFO_LOG("CameraHostInfo::prelaunch 111 for cameraId %{public}s", (cameraId).c_str());
1173         sptr<HCaptureSession> captureSession_ = nullptr;
1174         pid_t pid = IPCSkeleton::GetCallingPid();
1175         captureSessionsManager_.Find(pid, captureSession_);
1176         SaveCurrentParamForRestore(cameraId, static_cast<RestoreParamTypeOhos>(restoreParamType), activeTime,
1177             effectParam, captureSession_);
1178         captureSessionsManager_.Clear();
1179         captureSessionsManager_.EnsureInsert(pid, captureSession_);
1180     } else {
1181         MEDIA_ERR_LOG("HCameraService::SetPrelaunchConfig illegal");
1182         ret = CAMERA_INVALID_ARG;
1183     }
1184     return ret;
1185 }
1186 
SetTorchLevel(float level)1187 int32_t HCameraService::SetTorchLevel(float level)
1188 {
1189     int32_t ret = cameraHostManager_->SetTorchLevel(level);
1190     CHECK_ERROR_PRINT_LOG(ret != CAMERA_OK, "Failed to SetTorchLevel");
1191     return ret;
1192 }
1193 
AllowOpenByOHSide(std::string cameraId,int32_t state,bool & canOpenCamera)1194 int32_t HCameraService::AllowOpenByOHSide(std::string cameraId, int32_t state, bool& canOpenCamera)
1195 {
1196     MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide start");
1197     pid_t activePid = HCameraDeviceManager::GetInstance()->GetActiveClient();
1198     if (activePid == -1) {
1199         MEDIA_INFO_LOG("AllowOpenByOHSide::Open allow open camera");
1200         NotifyCameraState(cameraId, 0);
1201         canOpenCamera = true;
1202         return CAMERA_OK;
1203     }
1204     sptr<HCameraDevice> cameraNeedEvict = HCameraDeviceManager::GetInstance()->GetCameraByPid(activePid);
1205     if (cameraNeedEvict != nullptr) {
1206         cameraNeedEvict->OnError(DEVICE_PREEMPT, 0);
1207         cameraNeedEvict->Close();
1208         NotifyCameraState(cameraId, 0);
1209         canOpenCamera = true;
1210     }
1211     MEDIA_INFO_LOG("HCameraService::AllowOpenByOHSide end");
1212     return CAMERA_OK;
1213 }
1214 
NotifyCameraState(std::string cameraId,int32_t state)1215 int32_t HCameraService::NotifyCameraState(std::string cameraId, int32_t state)
1216 {
1217     // 把cameraId和前后台状态刷新给device manager
1218     MEDIA_INFO_LOG(
1219         "HCameraService::NotifyCameraState SetStateOfACamera %{public}s:%{public}d", cameraId.c_str(), state);
1220     HCameraDeviceManager::GetInstance()->SetStateOfACamera(cameraId, state);
1221     return CAMERA_OK;
1222 }
1223 
SetPeerCallback(sptr<ICameraBroker> & callback)1224 int32_t HCameraService::SetPeerCallback(sptr<ICameraBroker>& callback)
1225 {
1226     MEDIA_INFO_LOG("SetPeerCallback get callback");
1227     CHECK_ERROR_RETURN_RET(callback == nullptr, CAMERA_INVALID_ARG);
1228     peerCallback_ = callback;
1229     MEDIA_INFO_LOG("HCameraService::SetPeerCallback current muteMode:%{public}d", muteModeStored_);
1230     callback->NotifyMuteCamera(muteModeStored_);
1231     HCameraDeviceManager::GetInstance()->SetPeerCallback(callback);
1232     return CAMERA_OK;
1233 }
1234 
UnsetPeerCallback()1235 int32_t HCameraService::UnsetPeerCallback()
1236 {
1237     MEDIA_INFO_LOG("UnsetPeerCallback callback");
1238     peerCallback_ = nullptr;
1239     HCameraDeviceManager::GetInstance()->UnsetPeerCallback();
1240     return CAMERA_OK;
1241 }
1242 
IsPrelaunchSupported(string cameraId)1243 bool HCameraService::IsPrelaunchSupported(string cameraId)
1244 {
1245     bool isPrelaunchSupported = false;
1246     shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility;
1247     int32_t ret = cameraHostManager_->GetCameraAbility(cameraId, cameraAbility);
1248     CHECK_ERROR_RETURN_RET_LOG(ret != CAMERA_OK, isPrelaunchSupported,
1249         "HCameraService::IsCameraMuted GetCameraAbility failed");
1250     camera_metadata_item_t item;
1251     common_metadata_header_t* metadata = cameraAbility->get();
1252     ret = OHOS::Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1253     if (ret == 0) {
1254         MEDIA_INFO_LOG(
1255             "CameraManager::IsPrelaunchSupported() OHOS_ABILITY_PRELAUNCH_AVAILABLE is %{public}d", item.data.u8[0]);
1256         isPrelaunchSupported = (item.data.u8[0] == 1);
1257     } else {
1258         MEDIA_ERR_LOG("Failed to get OHOS_ABILITY_PRELAUNCH_AVAILABLE ret = %{public}d", ret);
1259     }
1260     return isPrelaunchSupported;
1261 }
1262 
GetServiceStatus()1263 CameraServiceStatus HCameraService::GetServiceStatus()
1264 {
1265     lock_guard<mutex> lock(serviceStatusMutex_);
1266     return serviceStatus_;
1267 }
1268 
SetServiceStatus(CameraServiceStatus serviceStatus)1269 void HCameraService::SetServiceStatus(CameraServiceStatus serviceStatus)
1270 {
1271     lock_guard<mutex> lock(serviceStatusMutex_);
1272     serviceStatus_ = serviceStatus;
1273     MEDIA_DEBUG_LOG("HCameraService::SetServiceStatus success. serviceStatus: %{public}d", serviceStatus);
1274 }
1275 
IsCameraMuted(bool & muteMode)1276 int32_t HCameraService::IsCameraMuted(bool& muteMode)
1277 {
1278     lock_guard<mutex> lock(g_dataShareHelperMutex);
1279     CHECK_ERROR_RETURN_RET(GetServiceStatus() != CameraServiceStatus::SERVICE_READY, CAMERA_INVALID_STATE);
1280     muteMode = muteModeStored_;
1281 
1282     MEDIA_DEBUG_LOG("HCameraService::IsCameraMuted success. isMuted: %{public}d", muteMode);
1283     return CAMERA_OK;
1284 }
1285 
DumpCameraSummary(vector<string> cameraIds,CameraInfoDumper & infoDumper)1286 void HCameraService::DumpCameraSummary(vector<string> cameraIds, CameraInfoDumper& infoDumper)
1287 {
1288     infoDumper.Tip("--------Dump Summary Begin-------");
1289     infoDumper.Title("Number of Cameras:[" + to_string(cameraIds.size()) + "]");
1290     infoDumper.Title("Number of Active Cameras:[" + to_string(1) + "]");
1291     infoDumper.Title("Current session summary:");
1292     HCaptureSession::DumpCameraSessionSummary(infoDumper);
1293 }
1294 
DumpCameraInfo(CameraInfoDumper & infoDumper,std::vector<std::string> & cameraIds,std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> & cameraAbilityList)1295 void HCameraService::DumpCameraInfo(CameraInfoDumper& infoDumper, std::vector<std::string>& cameraIds,
1296     std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>>& cameraAbilityList)
1297 {
1298     infoDumper.Tip("--------Dump CameraDevice Begin-------");
1299     int32_t capIdx = 0;
1300     for (auto& it : cameraIds) {
1301         auto metadata = cameraAbilityList[capIdx++];
1302         common_metadata_header_t* metadataEntry = metadata->get();
1303         infoDumper.Title("Camera ID:[" + it + "]:");
1304         infoDumper.Push();
1305         DumpCameraAbility(metadataEntry, infoDumper);
1306         DumpCameraStreamInfo(metadataEntry, infoDumper);
1307         DumpCameraZoom(metadataEntry, infoDumper);
1308         DumpCameraFlash(metadataEntry, infoDumper);
1309         DumpCameraAF(metadataEntry, infoDumper);
1310         DumpCameraAE(metadataEntry, infoDumper);
1311         DumpCameraSensorInfo(metadataEntry, infoDumper);
1312         DumpCameraVideoStabilization(metadataEntry, infoDumper);
1313         DumpCameraVideoFrameRateRange(metadataEntry, infoDumper);
1314         DumpCameraPrelaunch(metadataEntry, infoDumper);
1315         DumpCameraThumbnail(metadataEntry, infoDumper);
1316         infoDumper.Pop();
1317     }
1318 }
1319 
DumpCameraAbility(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1320 void HCameraService::DumpCameraAbility(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1321 {
1322     camera_metadata_item_t item;
1323     int ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_POSITION, &item);
1324     if (ret == CAM_META_SUCCESS) {
1325         map<int, string>::const_iterator iter = g_cameraPos.find(item.data.u8[0]);
1326         if (iter != g_cameraPos.end()) {
1327             infoDumper.Title("Camera Position:[" + iter->second + "]");
1328         }
1329     }
1330 
1331     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_TYPE, &item);
1332     if (ret == CAM_META_SUCCESS) {
1333         map<int, string>::const_iterator iter = g_cameraType.find(item.data.u8[0]);
1334         if (iter != g_cameraType.end()) {
1335             infoDumper.Title("Camera Type:[" + iter->second + "]");
1336         }
1337     }
1338 
1339     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
1340     if (ret == CAM_META_SUCCESS) {
1341         map<int, string>::const_iterator iter = g_cameraConType.find(item.data.u8[0]);
1342         if (iter != g_cameraConType.end()) {
1343             infoDumper.Title("Camera Connection Type:[" + iter->second + "]");
1344         }
1345     }
1346 }
1347 
DumpCameraStreamInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1348 void HCameraService::DumpCameraStreamInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1349 {
1350     camera_metadata_item_t item;
1351     int ret;
1352     constexpr uint32_t unitLen = 3;
1353     uint32_t widthOffset = 1;
1354     uint32_t heightOffset = 2;
1355     infoDumper.Title("Camera Available stream configuration List:");
1356     infoDumper.Push();
1357     ret =
1358         OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, &item);
1359     if (ret == CAM_META_SUCCESS) {
1360         infoDumper.Title("Basic Stream Info Size: " + to_string(item.count / unitLen));
1361         for (uint32_t index = 0; index < item.count; index += unitLen) {
1362             map<int, string>::const_iterator iter = g_cameraFormat.find(item.data.i32[index]);
1363             if (iter != g_cameraFormat.end()) {
1364                 infoDumper.Msg("Format:[" + iter->second + "]    " +
1365                                "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1366                                " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1367             } else {
1368                 infoDumper.Msg("Format:[" + to_string(item.data.i32[index]) + "]    " +
1369                                "Size:[Width:" + to_string(item.data.i32[index + widthOffset]) +
1370                                " Height:" + to_string(item.data.i32[index + heightOffset]) + "]");
1371             }
1372         }
1373     }
1374 
1375     infoDumper.Pop();
1376 }
1377 
DumpCameraZoom(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1378 void HCameraService::DumpCameraZoom(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1379 {
1380     camera_metadata_item_t item;
1381     int ret;
1382     int32_t minIndex = 0;
1383     int32_t maxIndex = 1;
1384     uint32_t zoomRangeCount = 2;
1385     infoDumper.Title("Zoom Related Info:");
1386 
1387     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_CAP, &item);
1388     if (ret == CAM_META_SUCCESS) {
1389         infoDumper.Msg("OHOS_ABILITY_ZOOM_CAP data size:" + to_string(item.count));
1390         if (item.count == zoomRangeCount) {
1391             infoDumper.Msg("Available Zoom Capability:[" + to_string(item.data.i32[minIndex]) + "  " +
1392                            to_string(item.data.i32[maxIndex]) + "]");
1393         }
1394     }
1395 
1396     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_SCENE_ZOOM_CAP, &item);
1397     if (ret == CAM_META_SUCCESS) {
1398         infoDumper.Msg("OHOS_ABILITY_SCENE_ZOOM_CAP data size:" + to_string(item.count));
1399         if (item.count == zoomRangeCount) {
1400             infoDumper.Msg("Available scene Zoom Capability:[" + to_string(item.data.i32[minIndex]) + "  " +
1401                            to_string(item.data.i32[maxIndex]) + "]");
1402         }
1403     }
1404 
1405     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_ZOOM_RATIO_RANGE, &item);
1406     if (ret == CAM_META_SUCCESS) {
1407         infoDumper.Msg("OHOS_ABILITY_ZOOM_RATIO_RANGE data size:" + to_string(item.count));
1408         if (item.count == zoomRangeCount) {
1409             infoDumper.Msg("Available Zoom Ratio Range:[" + to_string(item.data.f[minIndex]) +
1410                            to_string(item.data.f[maxIndex]) + "]");
1411         }
1412     }
1413 }
1414 
DumpCameraFlash(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1415 void HCameraService::DumpCameraFlash(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1416 {
1417     camera_metadata_item_t item;
1418     int ret;
1419     infoDumper.Title("Flash Related Info:");
1420     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FLASH_MODES, &item);
1421     if (ret == CAM_META_SUCCESS) {
1422         string flashAbilityString = "Available Flash Modes:[ ";
1423         for (uint32_t i = 0; i < item.count; i++) {
1424             map<int, string>::const_iterator iter = g_cameraFlashMode.find(item.data.u8[i]);
1425             if (iter != g_cameraFlashMode.end()) {
1426                 flashAbilityString.append(iter->second + " ");
1427             }
1428         }
1429         flashAbilityString.append("]");
1430         infoDumper.Msg(flashAbilityString);
1431     }
1432 }
1433 
DumpCameraAF(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1434 void HCameraService::DumpCameraAF(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1435 {
1436     camera_metadata_item_t item;
1437     int ret;
1438     infoDumper.Title("AF Related Info:");
1439     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FOCUS_MODES, &item);
1440     if (ret == CAM_META_SUCCESS) {
1441         string afAbilityString = "Available Focus Modes:[ ";
1442         for (uint32_t i = 0; i < item.count; i++) {
1443             map<int, string>::const_iterator iter = g_cameraFocusMode.find(item.data.u8[i]);
1444             if (iter != g_cameraFocusMode.end()) {
1445                 afAbilityString.append(iter->second + " ");
1446             }
1447         }
1448         afAbilityString.append("]");
1449         infoDumper.Msg(afAbilityString);
1450     }
1451 }
1452 
DumpCameraAE(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1453 void HCameraService::DumpCameraAE(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1454 {
1455     camera_metadata_item_t item;
1456     int ret;
1457     infoDumper.Title("AE Related Info:");
1458     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_EXPOSURE_MODES, &item);
1459     if (ret == CAM_META_SUCCESS) {
1460         string aeAbilityString = "Available Exposure Modes:[ ";
1461         for (uint32_t i = 0; i < item.count; i++) {
1462             map<int, string>::const_iterator iter = g_cameraExposureMode.find(item.data.u8[i]);
1463             if (iter != g_cameraExposureMode.end()) {
1464                 aeAbilityString.append(iter->second + " ");
1465             }
1466         }
1467         aeAbilityString.append("]");
1468         infoDumper.Msg(aeAbilityString);
1469     }
1470 }
1471 
DumpCameraSensorInfo(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1472 void HCameraService::DumpCameraSensorInfo(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1473 {
1474     camera_metadata_item_t item;
1475     int ret;
1476     int32_t leftIndex = 0;
1477     int32_t topIndex = 1;
1478     int32_t rightIndex = 2;
1479     int32_t bottomIndex = 3;
1480     infoDumper.Title("Sensor Related Info:");
1481     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_SENSOR_INFO_ACTIVE_ARRAY_SIZE, &item);
1482     if (ret == CAM_META_SUCCESS) {
1483         infoDumper.Msg("Array:[" +
1484             to_string(item.data.i32[leftIndex]) + " " +
1485             to_string(item.data.i32[topIndex]) + " " +
1486             to_string(item.data.i32[rightIndex]) + " " +
1487             to_string(item.data.i32[bottomIndex]) + "]:\n");
1488     }
1489 }
1490 
DumpCameraVideoStabilization(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1491 void HCameraService::DumpCameraVideoStabilization(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1492 {
1493     camera_metadata_item_t item;
1494     int ret;
1495     infoDumper.Title("Video Stabilization Related Info:");
1496     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_VIDEO_STABILIZATION_MODES, &item);
1497     if (ret == CAM_META_SUCCESS) {
1498         std::string infoString = "Available Video Stabilization Modes:[ ";
1499         for (uint32_t i = 0; i < item.count; i++) {
1500             map<int, string>::const_iterator iter = g_cameraVideoStabilizationMode.find(item.data.u8[i]);
1501             if (iter != g_cameraVideoStabilizationMode.end()) {
1502                 infoString.append(iter->second + " ");
1503             }
1504         }
1505         infoString.append("]:");
1506         infoDumper.Msg(infoString);
1507     }
1508 }
1509 
DumpCameraVideoFrameRateRange(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1510 void HCameraService::DumpCameraVideoFrameRateRange(
1511     common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1512 {
1513     camera_metadata_item_t item;
1514     const int32_t FRAME_RATE_RANGE_STEP = 2;
1515     int ret;
1516     infoDumper.Title("Video FrameRateRange Related Info:");
1517     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_FPS_RANGES, &item);
1518     if (ret == CAM_META_SUCCESS && item.count > 0) {
1519         infoDumper.Msg("Available FrameRateRange:");
1520         for (uint32_t i = 0; i < (item.count - 1); i += FRAME_RATE_RANGE_STEP) {
1521             infoDumper.Msg("[ " + to_string(item.data.i32[i]) + ", " + to_string(item.data.i32[i + 1]) + " ]");
1522         }
1523     }
1524 }
1525 
DumpCameraPrelaunch(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1526 void HCameraService::DumpCameraPrelaunch(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1527 {
1528     camera_metadata_item_t item;
1529     int ret;
1530     infoDumper.Title("Camera Prelaunch Related Info:");
1531     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_PRELAUNCH_AVAILABLE, &item);
1532     if (ret == CAM_META_SUCCESS) {
1533         map<int, string>::const_iterator iter = g_cameraPrelaunchAvailable.find(item.data.u8[0]);
1534         bool isSupport = false;
1535         if (iter != g_cameraPrelaunchAvailable.end()) {
1536             isSupport = true;
1537         }
1538         std::string infoString = "Available Prelaunch Info:[";
1539         infoString.append(isSupport ? "True" : "False");
1540         infoString.append("]");
1541         infoDumper.Msg(infoString);
1542     }
1543 }
1544 
DumpCameraThumbnail(common_metadata_header_t * metadataEntry,CameraInfoDumper & infoDumper)1545 void HCameraService::DumpCameraThumbnail(common_metadata_header_t* metadataEntry, CameraInfoDumper& infoDumper)
1546 {
1547     camera_metadata_item_t item;
1548     int ret;
1549     infoDumper.Title("Camera Thumbnail Related Info:");
1550     ret = OHOS::Camera::FindCameraMetadataItem(metadataEntry, OHOS_ABILITY_STREAM_QUICK_THUMBNAIL_AVAILABLE, &item);
1551     if (ret == CAM_META_SUCCESS) {
1552         map<int, string>::const_iterator iter = g_cameraQuickThumbnailAvailable.find(item.data.u8[0]);
1553         bool isSupport = false;
1554         if (iter != g_cameraQuickThumbnailAvailable.end()) {
1555             isSupport = true;
1556         }
1557         std::string infoString = "Available Thumbnail Info:[";
1558         infoString.append(isSupport ? "True" : "False");
1559         infoString.append("]");
1560         infoDumper.Msg(infoString);
1561     }
1562 }
1563 
Dump(int fd,const vector<u16string> & args)1564 int32_t HCameraService::Dump(int fd, const vector<u16string>& args)
1565 {
1566     unordered_set<u16string> argSets;
1567     for (decltype(args.size()) index = 0; index < args.size(); ++index) {
1568         argSets.insert(args[index]);
1569     }
1570     std::string dumpString;
1571     std::vector<std::string> cameraIds;
1572     std::vector<std::shared_ptr<OHOS::Camera::CameraMetadata>> cameraAbilityList;
1573     int ret = GetCameras(cameraIds, cameraAbilityList);
1574     CHECK_ERROR_RETURN_RET((ret != CAMERA_OK) || cameraIds.empty() || cameraAbilityList.empty(), OHOS::UNKNOWN_ERROR);
1575     CameraInfoDumper infoDumper(fd);
1576     if (args.empty() || argSets.count(u16string(u"summary"))) {
1577         DumpCameraSummary(cameraIds, infoDumper);
1578     }
1579     if (args.empty() || argSets.count(u16string(u"ability"))) {
1580         DumpCameraInfo(infoDumper, cameraIds, cameraAbilityList);
1581     }
1582     if (args.empty() || argSets.count(u16string(u"preconfig"))) {
1583         infoDumper.Tip("--------Dump PreconfigInfo Begin-------");
1584         DumpPreconfigInfo(infoDumper, cameraHostManager_);
1585     }
1586     if (args.empty() || argSets.count(u16string(u"clientwiseinfo"))) {
1587         infoDumper.Tip("--------Dump Clientwise Info Begin-------");
1588         HCaptureSession::DumpSessions(infoDumper);
1589     }
1590     if (argSets.count(std::u16string(u"debugOn"))) {
1591         SetCameraDebugValue(true);
1592     }
1593     infoDumper.Print();
1594     return OHOS::NO_ERROR;
1595 }
1596 
1597 #ifdef CAMERA_USE_SENSOR
RegisterSensorCallback()1598 void HCameraService::RegisterSensorCallback()
1599 {
1600     if (isRegisterSensorSuccess) {
1601         MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback isRegisterSensorSuccess return");
1602         return;
1603     }
1604     MEDIA_INFO_LOG("HCameraService::RegisterSensorCallback start");
1605     user.callback = DropDetectionDataCallbackImpl;
1606     int32_t subscribeRet = SubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1607     MEDIA_INFO_LOG("RegisterSensorCallback, subscribeRet: %{public}d", subscribeRet);
1608     int32_t setBatchRet = SetBatch(SENSOR_TYPE_ID_DROP_DETECTION, &user, POSTURE_INTERVAL, POSTURE_INTERVAL);
1609     MEDIA_INFO_LOG("RegisterSensorCallback, setBatchRet: %{public}d", setBatchRet);
1610     int32_t activateRet = ActivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1611     MEDIA_INFO_LOG("RegisterSensorCallback, activateRet: %{public}d", activateRet);
1612     if (subscribeRet != SENSOR_SUCCESS || setBatchRet != SENSOR_SUCCESS || activateRet != SENSOR_SUCCESS) {
1613         isRegisterSensorSuccess = false;
1614         MEDIA_INFO_LOG("RegisterSensorCallback failed.");
1615     }  else {
1616         isRegisterSensorSuccess = true;
1617     }
1618 }
1619 
UnRegisterSensorCallback()1620 void HCameraService::UnRegisterSensorCallback()
1621 {
1622     int32_t deactivateRet = DeactivateSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1623     int32_t unsubscribeRet = UnsubscribeSensor(SENSOR_TYPE_ID_DROP_DETECTION, &user);
1624     if (deactivateRet == SENSOR_SUCCESS && unsubscribeRet == SENSOR_SUCCESS) {
1625         MEDIA_INFO_LOG("HCameraService.UnRegisterSensorCallback success.");
1626     }
1627 }
1628 
DropDetectionDataCallbackImpl(SensorEvent * event)1629 void HCameraService::DropDetectionDataCallbackImpl(SensorEvent* event)
1630 {
1631     MEDIA_INFO_LOG("HCameraService::DropDetectionDataCallbackImpl prepare execute");
1632     CHECK_ERROR_RETURN_LOG(event == nullptr, "SensorEvent is nullptr.");
1633     CHECK_ERROR_RETURN_LOG(event[0].data == nullptr, "SensorEvent[0].data is nullptr.");
1634     CHECK_ERROR_RETURN_LOG(event[0].dataLen < sizeof(DropDetectionData),
1635         "less than drop detection data size, event.dataLen:%{public}u", event[0].dataLen);
1636     {
1637         std::lock_guard<std::mutex> lock(g_cameraServiceInstanceMutex);
1638         g_cameraServiceInstance->cameraHostManager_->NotifyDeviceStateChangeInfo(
1639             DeviceType::FALLING_TYPE, FallingState::FALLING_STATE);
1640     }
1641 }
1642 #endif
1643 
SaveCurrentParamForRestore(std::string cameraId,RestoreParamTypeOhos restoreParamType,int activeTime,EffectParam effectParam,sptr<HCaptureSession> captureSession)1644 int32_t HCameraService::SaveCurrentParamForRestore(std::string cameraId, RestoreParamTypeOhos restoreParamType,
1645     int activeTime, EffectParam effectParam, sptr<HCaptureSession> captureSession)
1646 {
1647     MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore enter");
1648     int32_t rc = CAMERA_OK;
1649     preCameraClient_ = GetClientBundle(IPCSkeleton::GetCallingUid());
1650     sptr<HCameraRestoreParam> cameraRestoreParam = new HCameraRestoreParam(
1651         preCameraClient_, cameraId);
1652     cameraRestoreParam->SetRestoreParamType(restoreParamType);
1653     cameraRestoreParam->SetStartActiveTime(activeTime);
1654     int foldStatus = static_cast<int>(OHOS::Rosen::DisplayManager::GetInstance().GetFoldStatus());
1655     cameraRestoreParam->SetFoldStatus(foldStatus);
1656     if (captureSession == nullptr || restoreParamType == NO_NEED_RESTORE_PARAM_OHOS) {
1657         cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1658         return rc;
1659     }
1660 
1661     sptr<HCameraDeviceManager> deviceManager = HCameraDeviceManager::GetInstance();
1662     pid_t activeClient = deviceManager->GetActiveClient();
1663     CHECK_ERROR_RETURN_RET_LOG(activeClient == -1, CAMERA_OPERATION_NOT_ALLOWED,
1664         "HCaptureSession::SaveCurrentParamForRestore() Failed to save param");
1665     sptr<HCameraDevice> activeDevice = deviceManager->GetCameraByPid(activeClient);
1666     CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_OK);
1667     std::vector<StreamInfo_V1_1> allStreamInfos;
1668 
1669     if (activeDevice != nullptr) {
1670         std::shared_ptr<OHOS::Camera::CameraMetadata> defaultSettings = CreateDefaultSettingForRestore(activeDevice);
1671         UpdateSkinSmoothSetting(defaultSettings, effectParam.skinSmoothLevel);
1672         UpdateFaceSlenderSetting(defaultSettings, effectParam.faceSlender);
1673         UpdateSkinToneSetting(defaultSettings, effectParam.skinTone);
1674         cameraRestoreParam->SetSetting(defaultSettings);
1675     }
1676     CHECK_AND_RETURN_RET(activeDevice != nullptr, CAMERA_UNKNOWN_ERROR);
1677     MEDIA_DEBUG_LOG("HCameraService::SaveCurrentParamForRestore param %{public}d", effectParam.skinSmoothLevel);
1678     rc = captureSession->GetCurrentStreamInfos(allStreamInfos);
1679     CHECK_ERROR_RETURN_RET_LOG(rc != CAMERA_OK, rc,
1680         "HCaptureSession::SaveCurrentParamForRestore() Failed to get streams info, %{public}d", rc);
1681     for (auto& info : allStreamInfos) {
1682         MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore: streamId is:%{public}d", info.v1_0.streamId_);
1683     }
1684     cameraRestoreParam->SetStreamInfo(allStreamInfos);
1685     cameraRestoreParam->SetCameraOpMode(captureSession->GetopMode());
1686     cameraHostManager_->SaveRestoreParam(cameraRestoreParam);
1687     MEDIA_INFO_LOG("HCameraService::SaveCurrentParamForRestore end");
1688     return rc;
1689 }
1690 
CreateDefaultSettingForRestore(sptr<HCameraDevice> activeDevice)1691 std::shared_ptr<OHOS::Camera::CameraMetadata> HCameraService::CreateDefaultSettingForRestore(
1692     sptr<HCameraDevice> activeDevice)
1693 {
1694     constexpr int32_t DEFAULT_ITEMS = 1;
1695     constexpr int32_t DEFAULT_DATA_LENGTH = 1;
1696     auto defaultSettings = std::make_shared<OHOS::Camera::CameraMetadata>(DEFAULT_ITEMS, DEFAULT_DATA_LENGTH);
1697     float zoomRatio = 1.0f;
1698     int32_t count = 1;
1699     int32_t ret = 0;
1700     camera_metadata_item_t item;
1701     defaultSettings->addEntry(OHOS_CONTROL_ZOOM_RATIO, &zoomRatio, count);
1702     defaultSettings->addEntry(OHOS_CONTROL_TIME_LAPSE_RECORD_STATE, &ret, count);
1703     std::shared_ptr<OHOS::Camera::CameraMetadata> currentSetting = activeDevice->CloneCachedSettings();
1704     CHECK_ERROR_RETURN_RET_LOG(currentSetting == nullptr, defaultSettings,
1705         "HCameraService::CreateDefaultSettingForRestore:currentSetting is null");
1706     ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CONTROL_FPS_RANGES, &item);
1707     if (ret == CAM_META_SUCCESS) {
1708         uint32_t fpscount = item.count;
1709         std::vector<int32_t> fpsRange;
1710         for (uint32_t i = 0; i < fpscount; i++) {
1711             fpsRange.push_back(*(item.data.i32 + i));
1712         }
1713         defaultSettings->addEntry(OHOS_CONTROL_FPS_RANGES, fpsRange.data(), fpscount);
1714     }
1715 
1716     ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), OHOS_CAMERA_USER_ID, &item);
1717     if (ret == CAM_META_SUCCESS) {
1718         int32_t userId = item.data.i32[0];
1719         defaultSettings->addEntry(OHOS_CAMERA_USER_ID, &userId, count);
1720     }
1721 
1722     uint8_t enableValue = true;
1723     defaultSettings->addEntry(OHOS_CONTROL_VIDEO_DEBUG_SWITCH, &enableValue, 1);
1724 
1725     for (uint32_t metadataTag : restoreMetadataTag) { // item.type is uint8
1726         ret = OHOS::Camera::FindCameraMetadataItem(currentSetting->get(), metadataTag, &item);
1727         if (ret == 0 && item.count != 0) {
1728             defaultSettings->addEntry(item.item, item.data.u8, item.count);
1729         }
1730     }
1731     return defaultSettings;
1732 }
1733 
UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinSmoothValue)1734 int32_t HCameraService::UpdateSkinSmoothSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1735                                                 int skinSmoothValue)
1736 {
1737     if (skinSmoothValue <= 0 || changedMetadata == nullptr) {
1738         return CAMERA_OK;
1739     }
1740     bool status = false;
1741     int32_t count = 1;
1742     int ret;
1743     camera_metadata_item_t item;
1744 
1745     MEDIA_DEBUG_LOG("UpdateBeautySetting skinsmooth: %{public}d", skinSmoothValue);
1746     uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_SMOOTH;
1747     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1748     if (ret == CAM_META_ITEM_NOT_FOUND) {
1749         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1750     } else if (ret == CAM_META_SUCCESS) {
1751         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1752     }
1753 
1754     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &item);
1755     if (ret == CAM_META_ITEM_NOT_FOUND) {
1756         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1757     } else if (ret == CAM_META_SUCCESS) {
1758         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE, &skinSmoothValue, count);
1759     }
1760     if (status) {
1761         MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1762     }
1763 
1764     return CAMERA_OK;
1765 }
1766 
UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int faceSlenderValue)1767 int32_t HCameraService::UpdateFaceSlenderSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1768                                                  int faceSlenderValue)
1769 {
1770     if (faceSlenderValue <= 0 || changedMetadata == nullptr) {
1771         return CAMERA_OK;
1772     }
1773     bool status = false;
1774     int32_t count = 1;
1775     int ret;
1776     camera_metadata_item_t item;
1777 
1778     MEDIA_DEBUG_LOG("UpdateBeautySetting faceSlender: %{public}d", faceSlenderValue);
1779     uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_FACE_SLENDER;
1780     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1781     if (ret == CAM_META_ITEM_NOT_FOUND) {
1782         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1783     } else if (ret == CAM_META_SUCCESS) {
1784         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1785     }
1786 
1787     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &item);
1788     if (ret == CAM_META_ITEM_NOT_FOUND) {
1789         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1790     } else if (ret == CAM_META_SUCCESS) {
1791         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE, &faceSlenderValue, count);
1792     }
1793     if (status) {
1794         MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1795     }
1796 
1797     return CAMERA_OK;
1798 }
1799 
UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,int skinToneValue)1800 int32_t HCameraService::UpdateSkinToneSetting(std::shared_ptr<OHOS::Camera::CameraMetadata> changedMetadata,
1801     int skinToneValue)
1802 {
1803     if (skinToneValue <= 0 || changedMetadata == nullptr) {
1804         return CAMERA_OK;
1805     }
1806     bool status = false;
1807     int32_t count = 1;
1808     int ret;
1809     camera_metadata_item_t item;
1810 
1811     MEDIA_DEBUG_LOG("UpdateBeautySetting skinTone: %{public}d", skinToneValue);
1812     uint8_t beauty = OHOS_CAMERA_BEAUTY_TYPE_SKIN_TONE;
1813     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_TYPE, &item);
1814     if (ret == CAM_META_ITEM_NOT_FOUND) {
1815         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1816     } else if (ret == CAM_META_SUCCESS) {
1817         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_TYPE, &beauty, count);
1818     }
1819 
1820     ret = OHOS::Camera::FindCameraMetadataItem(changedMetadata->get(), OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &item);
1821     if (ret == CAM_META_ITEM_NOT_FOUND) {
1822         status = changedMetadata->addEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1823     } else if (ret == CAM_META_SUCCESS) {
1824         status = changedMetadata->updateEntry(OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE, &skinToneValue, count);
1825     }
1826     if (status) {
1827         MEDIA_INFO_LOG("UpdateBeautySetting status: %{public}d", status);
1828     }
1829 
1830     return CAMERA_OK;
1831 }
1832 
g_toString(std::set<int32_t> & pidList)1833 std::string g_toString(std::set<int32_t>& pidList)
1834 {
1835     std::string ret = "[";
1836     for (const auto& pid : pidList) {
1837         ret += std::to_string(pid) + ",";
1838     }
1839     ret += "]";
1840     return ret;
1841 }
1842 
ProxyForFreeze(const std::set<int32_t> & pidList,bool isProxy)1843 int32_t HCameraService::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
1844 {
1845     constexpr int32_t maxSaUid = 10000;
1846     CHECK_ERROR_RETURN_RET_LOG(IPCSkeleton::GetCallingUid() >= maxSaUid, CAMERA_OPERATION_NOT_ALLOWED, "not allow");
1847     MEDIA_INFO_LOG("isProxy value: %{public}d", isProxy);
1848     {
1849         std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1850         if (isProxy) {
1851             freezedPidList_.insert(pidList.begin(), pidList.end());
1852             MEDIA_DEBUG_LOG("after freeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1853             return CAMERA_OK;
1854         } else {
1855             for (auto pid : pidList) {
1856                 freezedPidList_.erase(pid);
1857             }
1858             MEDIA_DEBUG_LOG("after unfreeze freezedPidList_:%{public}s", g_toString(freezedPidList_).c_str());
1859         }
1860     }
1861 
1862     {
1863         std::lock_guard<std::mutex> lock(cameraCbMutex_);
1864         for (auto pid : pidList) {
1865             auto it = delayCbtaskMap.find(pid);
1866             if (it != delayCbtaskMap.end()) {
1867                 it->second();
1868                 delayCbtaskMap.erase(it);
1869             }
1870         }
1871     }
1872     return CAMERA_OK;
1873 }
1874 
ResetAllFreezeStatus()1875 int32_t HCameraService::ResetAllFreezeStatus()
1876 {
1877     if (IPCSkeleton::GetCallingUid() != 0) {
1878         return CAMERA_OPERATION_NOT_ALLOWED;
1879     }
1880     std::lock_guard<std::mutex> lock(freezedPidListMutex_);
1881     freezedPidList_.clear();
1882     MEDIA_INFO_LOG("freezedPidList_ has been clear");
1883     return CAMERA_OK;
1884 }
1885 
GetDmDeviceInfo(std::vector<std::string> & deviceInfos)1886 int32_t HCameraService::GetDmDeviceInfo(std::vector<std::string> &deviceInfos)
1887 {
1888 #ifdef DEVICE_MANAGER
1889     lock_guard<mutex> lock(g_dmDeviceInfoMutex);
1890     std::vector <DistributedHardware::DmDeviceInfo> deviceInfoList;
1891     auto &deviceManager = DistributedHardware::DeviceManager::GetInstance();
1892     std::shared_ptr<DistributedHardware::DmInitCallback> initCallback = std::make_shared<DeviceInitCallBack>();
1893     std::string pkgName = std::to_string(IPCSkeleton::GetCallingTokenID());
1894     const string extraInfo = "";
1895     deviceManager.InitDeviceManager(pkgName, initCallback);
1896     deviceManager.RegisterDevStateCallback(pkgName, extraInfo, NULL);
1897     deviceManager.GetTrustedDeviceList(pkgName, extraInfo, deviceInfoList);
1898     deviceManager.UnInitDeviceManager(pkgName);
1899     int size = static_cast<int>(deviceInfoList.size());
1900     MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo size=%{public}d", size);
1901     if (size > 0) {
1902         for (int i = 0; i < size; i++) {
1903             nlohmann::json deviceInfo;
1904             deviceInfo["deviceName"] = deviceInfoList[i].deviceName;
1905             deviceInfo["deviceTypeId"] = deviceInfoList[i].deviceTypeId;
1906             deviceInfo["networkId"] = deviceInfoList[i].networkId;
1907             std::string deviceInfoStr = deviceInfo.dump();
1908             MEDIA_INFO_LOG("HCameraService::GetDmDeviceInfo deviceInfo:%{public}s", deviceInfoStr.c_str());
1909             deviceInfos.emplace_back(deviceInfoStr);
1910         }
1911     }
1912 #endif
1913     return CAMERA_OK;
1914 }
1915 
GetCameraOutputStatus(int32_t pid,int32_t & status)1916 int32_t HCameraService::GetCameraOutputStatus(int32_t pid, int32_t &status)
1917 {
1918     sptr<HCaptureSession> captureSession = nullptr;
1919     captureSessionsManager_.Find(pid,  captureSession);
1920     if (captureSession) {
1921         captureSession->GetOutputStatus(status);
1922     } else {
1923         status = 0;
1924     }
1925     return CAMERA_OK;
1926 }
1927 
CreateCameraDataShareHelper()1928 std::shared_ptr<DataShare::DataShareHelper> HCameraService::CameraDataShareHelper::CreateCameraDataShareHelper()
1929 {
1930     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1931     CHECK_ERROR_RETURN_RET_LOG(samgr == nullptr, nullptr, "CameraDataShareHelper GetSystemAbilityManager failed.");
1932     sptr<IRemoteObject> remoteObj = samgr->GetSystemAbility(CAMERA_SERVICE_ID);
1933     CHECK_ERROR_RETURN_RET_LOG(remoteObj == nullptr, nullptr, "CameraDataShareHelper GetSystemAbility Service Failed.");
1934     return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATA_BASE_URI, SETTINGS_DATA_EXT_URI);
1935 }
1936 
QueryOnce(const std::string key,std::string & value)1937 int32_t HCameraService::CameraDataShareHelper::QueryOnce(const std::string key, std::string &value)
1938 {
1939     auto dataShareHelper = CreateCameraDataShareHelper();
1940     CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
1941     Uri uri(SETTINGS_DATA_BASE_URI);
1942     DataShare::DataSharePredicates predicates;
1943     predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
1944     std::vector<std::string> columns;
1945     columns.emplace_back(SETTINGS_DATA_FIELD_VALUE);
1946 
1947     auto resultSet = dataShareHelper->Query(uri, predicates, columns);
1948     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, CAMERA_INVALID_ARG, "CameraDataShareHelper query fail");
1949 
1950     int32_t numRows = 0;
1951     resultSet->GetRowCount(numRows);
1952     CHECK_AND_RETURN_RET_LOG(numRows > 0, CAMERA_INVALID_ARG, "CameraDataShareHelper query failed, row is zero.");
1953 
1954     if (resultSet->GoToFirstRow() != DataShare::E_OK) {
1955         MEDIA_INFO_LOG("CameraDataShareHelper Query failed,go to first row error");
1956         resultSet->Close();
1957         return CAMERA_INVALID_ARG;
1958     }
1959 
1960     int columnIndex;
1961     resultSet->GetColumnIndex(SETTINGS_DATA_FIELD_VALUE, columnIndex);
1962     resultSet->GetString(columnIndex, value);
1963     resultSet->Close();
1964     dataShareHelper->Release();
1965     MEDIA_INFO_LOG("CameraDataShareHelper query success,value=%{public}s", value.c_str());
1966     return CAMERA_OK;
1967 }
1968 
UpdateOnce(const std::string key,std::string value)1969 int32_t HCameraService::CameraDataShareHelper::UpdateOnce(const std::string key, std::string value)
1970 {
1971     auto dataShareHelper = CreateCameraDataShareHelper();
1972     CHECK_ERROR_RETURN_RET_LOG(dataShareHelper == nullptr, CAMERA_INVALID_ARG, "dataShareHelper_ is nullptr");
1973     Uri uri(SETTINGS_DATA_BASE_URI);
1974     DataShare::DataSharePredicates predicates;
1975     predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
1976 
1977     DataShare::DataShareValuesBucket bucket;
1978     DataShare::DataShareValueObject keywordObj(key);
1979     DataShare::DataShareValueObject valueObj(value);
1980     bucket.Put(SETTINGS_DATA_FIELD_KEYWORD, keywordObj);
1981     bucket.Put(SETTINGS_DATA_FIELD_VALUE, valueObj);
1982 
1983     if (dataShareHelper->Update(uri, predicates, bucket) <= 0) {
1984         dataShareHelper->Insert(uri, bucket);
1985         MEDIA_ERR_LOG("CameraDataShareHelper Update:%{public}s failed", key.c_str());
1986         return CAMERA_INVALID_ARG;
1987     }
1988     MEDIA_INFO_LOG("CameraDataShareHelper Update:%{public}s success", key.c_str());
1989     dataShareHelper->Release();
1990     return CAMERA_OK;
1991 }
1992 
RequireMemorySize(int32_t requiredMemSizeKB)1993 int32_t HCameraService::RequireMemorySize(int32_t requiredMemSizeKB)
1994 {
1995     #ifdef MEMMGR_OVERRID
1996     int32_t pid = getpid();
1997     const std::string reason = "HW_CAMERA_TO_PHOTO";
1998     std::string clientName = SYSTEM_CAMERA;
1999     int32_t ret = Memory::MemMgrClient::GetInstance().RequireBigMem(pid, reason, requiredMemSizeKB, clientName);
2000     MEDIA_INFO_LOG("HCameraDevice::RequireMemory reason:%{public}s, clientName:%{public}s, ret:%{public}d",
2001         reason.c_str(), clientName.c_str(), ret);
2002     if (ret == 0) {
2003         return CAMERA_OK;
2004     }
2005     #endif
2006     return CAMERA_UNKNOWN_ERROR;
2007 }
2008 } // namespace CameraStandard
2009 } // namespace OHOS
2010