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