• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "input/camera_manager_napi.h"
17 
18 #include <cstddef>
19 #include <cstdint>
20 #include <mutex>
21 #include <string>
22 #include <unordered_map>
23 #include <utility>
24 #include <uv.h>
25 
26 #include "camera_device.h"
27 #include "camera_error_code.h"
28 #include "camera_log.h"
29 #include "camera_manager.h"
30 #include "camera_napi_const.h"
31 #include "camera_napi_event_emitter.h"
32 #include "camera_napi_object_types.h"
33 #include "camera_napi_param_parser.h"
34 #include "camera_napi_security_utils.h"
35 #include "camera_napi_template_utils.h"
36 #include "camera_napi_utils.h"
37 #include "camera_output_capability.h"
38 #include "camera_xcollie.h"
39 #include "capture_scene_const.h"
40 #include "dynamic_loader/camera_napi_ex_manager.h"
41 #include "input/camera_napi.h"
42 #include "input/prelaunch_config.h"
43 #include "ipc_skeleton.h"
44 #include "js_native_api.h"
45 #include "js_native_api_types.h"
46 #include "mode/photo_session_napi.h"
47 #include "mode/secure_camera_session_napi.h"
48 #include "mode/video_session_napi.h"
49 #include "napi/native_common.h"
50 #include "refbase.h"
51 #include "napi/native_node_api.h"
52 #include "session/control_center_session_napi.h"
53 #include "camera_security_utils.h"
54 
55 namespace OHOS {
56 namespace CameraStandard {
57 namespace {
58 thread_local std::unordered_map<std::string, napi_ref> g_napiValueCacheMap {};
CacheNapiValue(napi_env env,const std::string & key,napi_value value)59 void CacheNapiValue(napi_env env, const std::string& key, napi_value value)
60 {
61     napi_ref ref;
62     napi_status status = napi_create_reference(env, value, 0, &ref); // 0 is weakref.
63     if (status == napi_ok) {
64         g_napiValueCacheMap[key] = ref;
65         MEDIA_DEBUG_LOG("CacheNapiValue cache->%{public}s", key.c_str());
66     }
67 }
68 
GetCacheNapiValue(napi_env env,const std::string & key)69 napi_value GetCacheNapiValue(napi_env env, const std::string& key)
70 {
71     napi_ref ref;
72     auto it = g_napiValueCacheMap.find(key);
73     CHECK_RETURN_RET(it == g_napiValueCacheMap.end(), nullptr);
74     ref = it->second;
75     napi_value result;
76     napi_status status = napi_get_reference_value(env, ref, &result);
77     if (status == napi_ok) {
78         MEDIA_DEBUG_LOG("GetCacheNapiValue hit cache->%{public}s", key.c_str());
79         return result;
80     }
81     return nullptr;
82 }
83 
CacheSupportedOutputCapability(napi_env env,const std::string & cameraId,int32_t mode,napi_value value)84 void CacheSupportedOutputCapability(napi_env env, const std::string& cameraId, int32_t mode, napi_value value)
85 {
86     std::string key = "OutputCapability:" + cameraId + ":\t" + to_string(mode);
87     CacheNapiValue(env, key, value);
88     MEDIA_DEBUG_LOG("CacheSupportedOutputCapability cache->%{public}s:%{public}d", key.c_str(), mode);
89 }
90 
GetCachedSupportedOutputCapability(napi_env env,const std::string & cameraId,int32_t mode)91 napi_value GetCachedSupportedOutputCapability(napi_env env, const std::string& cameraId, int32_t mode)
92 {
93     std::string key = "OutputCapability:" + cameraId + ":\t" + to_string(mode);
94     napi_value result = GetCacheNapiValue(env, key);
95     if (result != nullptr) {
96         MEDIA_DEBUG_LOG("GetCachedSupportedOutputCapability hit cache->%{public}s:%{public}d", key.c_str(), mode);
97     }
98     return result;
99 }
100 
CacheSupportedCameras(napi_env env,const std::vector<sptr<CameraDevice>> & cameras,napi_value value)101 void CacheSupportedCameras(napi_env env, const std::vector<sptr<CameraDevice>>& cameras, napi_value value)
102 {
103     std::string key = "SupportedCameras:";
104     for (auto& camera : cameras) {
105         if (camera->GetConnectionType() != CAMERA_CONNECTION_BUILT_IN) {
106             // Exist none built_in camera. Give up cache.
107             MEDIA_DEBUG_LOG("CacheSupportedCameras exist none built_in camera. Give up cache");
108             return;
109         }
110         key.append("\t:");
111         key.append(camera->GetID());
112     }
113     CacheNapiValue(env, key, value);
114     MEDIA_DEBUG_LOG("CacheSupportedCameras cache->%{public}s", key.c_str());
115 }
116 
GetCachedSupportedCameras(napi_env env,const std::vector<sptr<CameraDevice>> & cameras)117 napi_value GetCachedSupportedCameras(napi_env env, const std::vector<sptr<CameraDevice>>& cameras)
118 {
119     std::string key = "SupportedCameras:";
120     for (auto& camera : cameras) {
121         if (camera->GetConnectionType() != CAMERA_CONNECTION_BUILT_IN) {
122             // Exist none built_in camera. Give up cache.
123             MEDIA_DEBUG_LOG("GetCachedSupportedCameras exist none built_in camera. Give up cache");
124             return nullptr;
125         }
126         key.append("\t:");
127         key.append(camera->GetID());
128     }
129     napi_value result = GetCacheNapiValue(env, key);
130     if (result != nullptr) {
131         MEDIA_DEBUG_LOG("GetCachedSupportedCameras hit cache->%{public}s", key.c_str());
132     }
133     return result;
134 }
135 } // namespace
136 
137 namespace {
AsyncCompleteCallback(napi_env env,napi_status status,void * data)138 void AsyncCompleteCallback(napi_env env, napi_status status, void* data)
139 {
140     auto context = static_cast<CameraManagerAsyncContext*>(data);
141     CHECK_RETURN_ELOG(context == nullptr, "CameraManagerNapi AsyncCompleteCallback context is null");
142     MEDIA_INFO_LOG("CameraManagerNapi AsyncCompleteCallback %{public}s, status = %{public}d", context->funcName.c_str(),
143         context->status);
144     std::unique_ptr<JSAsyncContextOutput> jsContext = std::make_unique<JSAsyncContextOutput>();
145     jsContext->status = context->status;
146     if (!context->status) {
147         CameraNapiUtils::CreateNapiErrorObject(env, context->errorCode, context->errorMsg.c_str(), jsContext);
148     } else {
149         napi_create_int64(env, context->storageSize, &jsContext->data);
150     }
151     if (!context->funcName.empty() && context->taskId > 0) {
152         // Finish async trace
153         CAMERA_FINISH_ASYNC_TRACE(context->funcName, context->taskId);
154         jsContext->funcName = context->funcName.c_str();
155     }
156     if (context->work != nullptr) {
157         CameraNapiUtils::InvokeJSAsyncMethod(env, context->deferred, context->callbackRef, context->work, *jsContext);
158     }
159     context->FreeHeldNapiValue(env);
160     delete context;
161 }
162 } // namespace
163 
164 using namespace std;
165 using namespace CameraNapiSecurity;
166 thread_local napi_ref CameraManagerNapi::sConstructor_ = nullptr;
167 thread_local uint32_t CameraManagerNapi::cameraManagerTaskId = CAMERA_MANAGER_TASKID;
168 
169 const std::unordered_map<SceneMode, JsSceneMode> g_nativeToNapiSupportedModeForSystem_ = {
170     {SceneMode::CAPTURE,  JsSceneMode::JS_CAPTURE},
171     {SceneMode::VIDEO,  JsSceneMode::JS_VIDEO},
172     {SceneMode::PORTRAIT,  JsSceneMode::JS_PORTRAIT},
173     {SceneMode::NIGHT,  JsSceneMode::JS_NIGHT},
174     {SceneMode::CAPTURE_MACRO, JsSceneMode::JS_CAPTURE_MARCO},
175     {SceneMode::VIDEO_MACRO, JsSceneMode::JS_VIDEO_MARCO},
176     {SceneMode::SLOW_MOTION,  JsSceneMode::JS_SLOW_MOTION},
177     {SceneMode::PROFESSIONAL_PHOTO,  JsSceneMode::JS_PROFESSIONAL_PHOTO},
178     {SceneMode::PROFESSIONAL_VIDEO,  JsSceneMode::JS_PROFESSIONAL_VIDEO},
179     {SceneMode::HIGH_RES_PHOTO, JsSceneMode::JS_HIGH_RES_PHOTO},
180     {SceneMode::SECURE, JsSceneMode::JS_SECURE_CAMERA},
181     {SceneMode::QUICK_SHOT_PHOTO, JsSceneMode::JS_QUICK_SHOT_PHOTO},
182     {SceneMode::APERTURE_VIDEO, JsSceneMode::JS_APERTURE_VIDEO},
183     {SceneMode::PANORAMA_PHOTO, JsSceneMode::JS_PANORAMA_PHOTO},
184     {SceneMode::LIGHT_PAINTING, JsSceneMode::JS_LIGHT_PAINTING},
185     {SceneMode::TIMELAPSE_PHOTO, JsSceneMode::JS_TIMELAPSE_PHOTO},
186     {SceneMode::FLUORESCENCE_PHOTO, JsSceneMode::JS_FLUORESCENCE_PHOTO},
187 };
188 
189 const std::unordered_map<SceneMode, JsSceneMode> g_nativeToNapiSupportedMode_ = {
190     {SceneMode::CAPTURE,  JsSceneMode::JS_CAPTURE},
191     {SceneMode::VIDEO,  JsSceneMode::JS_VIDEO},
192     {SceneMode::SECURE,  JsSceneMode::JS_SECURE_CAMERA},
193 };
194 
CameraManagerCallbackNapi(napi_env env)195 CameraManagerCallbackNapi::CameraManagerCallbackNapi(napi_env env): ListenerBase(env)
196 {}
197 
~CameraManagerCallbackNapi()198 CameraManagerCallbackNapi::~CameraManagerCallbackNapi()
199 {
200 }
201 
OnCameraStatusCallbackAsync(const CameraStatusInfo & cameraStatusInfo) const202 void CameraManagerCallbackNapi::OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const
203 {
204     MEDIA_DEBUG_LOG("OnCameraStatusCallbackAsync is called");
205     std::unique_ptr<CameraStatusCallbackInfo> callbackInfo =
206         std::make_unique<CameraStatusCallbackInfo>(cameraStatusInfo, shared_from_this());
207     CameraStatusCallbackInfo *event = callbackInfo.get();
208     auto task = [event]() {
209         CameraStatusCallbackInfo* callbackInfo = reinterpret_cast<CameraStatusCallbackInfo *>(event);
210         if (callbackInfo) {
211             auto listener = callbackInfo->listener_.lock();
212             CHECK_EXECUTE(listener, listener->OnCameraStatusCallback(callbackInfo->info_));
213             delete callbackInfo;
214         }
215     };
216     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
217         MEDIA_ERR_LOG("failed to execute work");
218     } else {
219         callbackInfo.release();
220     }
221 }
222 
OnCameraStatusCallback(const CameraStatusInfo & cameraStatusInfo) const223 void CameraManagerCallbackNapi::OnCameraStatusCallback(const CameraStatusInfo& cameraStatusInfo) const
224 {
225     MEDIA_DEBUG_LOG("OnCameraStatusCallback is called");
226     CAMERA_NAPI_CHECK_NULL_PTR_RETURN_VOID(cameraStatusInfo.cameraDevice, "callback cameraDevice is null");
227     ExecuteCallbackScopeSafe("cameraStatus", [&]() {
228         napi_value callbackObj;
229         napi_create_object(env_, &callbackObj);
230         napi_value cameraDeviceNapi = CameraNapiObjCameraDevice(*cameraStatusInfo.cameraDevice).GenerateNapiValue(env_);
231         napi_set_named_property(env_, callbackObj, "camera", cameraDeviceNapi);
232         int32_t jsCameraStatus = cameraStatusInfo.cameraStatus;
233         napi_value propValue;
234         napi_create_int64(env_, jsCameraStatus, &propValue);
235         napi_set_named_property(env_, callbackObj, "status", propValue);
236         MEDIA_INFO_LOG("CameraId: %{public}s, CameraStatus: %{public}d",
237             cameraStatusInfo.cameraDevice->GetID().c_str(),
238             cameraStatusInfo.cameraStatus);
239         napi_value errCode = CameraNapiUtils::GetUndefinedValue(env_);
240         return ExecuteCallbackData(env_, errCode, callbackObj);
241     });
242 }
243 
OnCameraStatusChanged(const CameraStatusInfo & cameraStatusInfo) const244 void CameraManagerCallbackNapi::OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const
245 {
246     MEDIA_DEBUG_LOG("OnCameraStatusChanged is called, CameraStatus: %{public}d", cameraStatusInfo.cameraStatus);
247     OnCameraStatusCallbackAsync(cameraStatusInfo);
248 }
249 
OnFlashlightStatusChanged(const std::string & cameraID,const FlashStatus flashStatus) const250 void CameraManagerCallbackNapi::OnFlashlightStatusChanged(const std::string &cameraID,
251     const FlashStatus flashStatus) const
252 {
253     (void)cameraID;
254     (void)flashStatus;
255 }
256 
CameraMuteListenerNapi(napi_env env)257 CameraMuteListenerNapi::CameraMuteListenerNapi(napi_env env): ListenerBase(env)
258 {
259     MEDIA_DEBUG_LOG("CameraMuteListenerNapi is called.");
260 }
261 
~CameraMuteListenerNapi()262 CameraMuteListenerNapi::~CameraMuteListenerNapi()
263 {
264     MEDIA_DEBUG_LOG("~CameraMuteListenerNapi is called.");
265 }
266 
OnCameraMuteCallbackAsync(bool muteMode) const267 void CameraMuteListenerNapi::OnCameraMuteCallbackAsync(bool muteMode) const
268 {
269     std::unique_ptr<CameraMuteCallbackInfo> callbackInfo =
270         std::make_unique<CameraMuteCallbackInfo>(muteMode, shared_from_this());
271     CameraMuteCallbackInfo *event = callbackInfo.get();
272     auto task = [event]() {
273         CameraMuteCallbackInfo* callbackInfo = reinterpret_cast<CameraMuteCallbackInfo *>(event);
274         if (callbackInfo) {
275             auto listener = callbackInfo->listener_.lock();
276             CHECK_EXECUTE(listener != nullptr, listener->OnCameraMuteCallback(callbackInfo->muteMode_));
277             delete callbackInfo;
278         }
279     };
280     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
281         MEDIA_ERR_LOG("Failed to execute work");
282     } else {
283         callbackInfo.release();
284     }
285 }
286 
OnCameraMuteCallback(bool muteMode) const287 void CameraMuteListenerNapi::OnCameraMuteCallback(bool muteMode) const
288 {
289     MEDIA_DEBUG_LOG("OnCameraMuteCallback is called, muteMode: %{public}d", muteMode);
290     napi_value result[ARGS_TWO];
291     napi_value retVal;
292     napi_get_undefined(env_, &result[PARAM0]);
293     napi_get_undefined(env_, &result[PARAM1]);
294     napi_get_boolean(env_, muteMode, &result[PARAM1]);
295 
296     ExecuteCallbackNapiPara callbackNapiPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
297     ExecuteCallback("cameraMute", callbackNapiPara);
298 }
299 
OnCameraMute(bool muteMode) const300 void CameraMuteListenerNapi::OnCameraMute(bool muteMode) const
301 {
302     MEDIA_DEBUG_LOG("OnCameraMute is called, muteMode: %{public}d", muteMode);
303     OnCameraMuteCallbackAsync(muteMode);
304 }
305 
ControlCenterStatusListenerNapi(napi_env env)306 ControlCenterStatusListenerNapi::ControlCenterStatusListenerNapi(napi_env env): ListenerBase(env)
307 {
308     MEDIA_DEBUG_LOG("ControlCenterStatusListenerNapi is called.");
309 }
310 
~ControlCenterStatusListenerNapi()311 ControlCenterStatusListenerNapi::~ControlCenterStatusListenerNapi()
312 {
313     MEDIA_DEBUG_LOG("~ControlCenterStatusListenerNapi is called.");
314 }
315 
OnControlCenterStatusCallbackAsync(bool status) const316 void ControlCenterStatusListenerNapi::OnControlCenterStatusCallbackAsync(bool status) const
317 {
318     MEDIA_INFO_LOG("OnControlCenterStatusCallbackAsync is called, status: %{public}d", status);
319     std::unique_ptr<ControlCenterStatusCallbackInfo> callbackInfo =
320         std::make_unique<ControlCenterStatusCallbackInfo>(status, shared_from_this());
321     ControlCenterStatusCallbackInfo *event = callbackInfo.get();
322     auto task = [event]() {
323         ControlCenterStatusCallbackInfo* callbackInfo = reinterpret_cast<ControlCenterStatusCallbackInfo *>(event);
324         if (callbackInfo) {
325             auto listener = callbackInfo->listener_.lock();
326             if (listener != nullptr) {
327                 listener->OnControlCenterStatusCallback(callbackInfo->controlCenterStatus_);
328             }
329             delete callbackInfo;
330         }
331     };
332     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
333         MEDIA_ERR_LOG("Failed to execute work");
334     } else {
335         callbackInfo.release();
336     }
337 }
338 
OnControlCenterStatusCallback(bool status) const339 void ControlCenterStatusListenerNapi::OnControlCenterStatusCallback(bool status) const
340 {
341     MEDIA_INFO_LOG("OnControlCenterStatusCallback is called, status: %{public}d", status);
342     ExecuteCallbackScopeSafe("controlCenterStatusChange", [&]() {
343         napi_value errCode = CameraNapiUtils::GetUndefinedValue(env_);
344         napi_value result;
345         napi_create_int32(env_, static_cast<int32_t>(status), &result);
346         return ExecuteCallbackData(env_, errCode, result);
347     });
348 }
349 
OnControlCenterStatusChanged(bool status) const350 void ControlCenterStatusListenerNapi::OnControlCenterStatusChanged(bool status) const
351 {
352     MEDIA_INFO_LOG("OnControlCenterStatusChanged is called, status: %{public}d", status);
353     OnControlCenterStatusCallbackAsync(status);
354 }
355 
TorchListenerNapi(napi_env env)356 TorchListenerNapi::TorchListenerNapi(napi_env env): ListenerBase(env)
357 {
358     MEDIA_INFO_LOG("TorchListenerNapi is called.");
359 }
360 
~TorchListenerNapi()361 TorchListenerNapi::~TorchListenerNapi()
362 {
363     MEDIA_DEBUG_LOG("~TorchListenerNapi is called.");
364 }
365 
OnTorchStatusChangeCallbackAsync(const TorchStatusInfo & torchStatusInfo) const366 void TorchListenerNapi::OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const
367 {
368     MEDIA_DEBUG_LOG("OnTorchStatusChangeCallbackAsync is called");
369     std::unique_ptr<TorchStatusChangeCallbackInfo> callbackInfo =
370         std::make_unique<TorchStatusChangeCallbackInfo>(torchStatusInfo, shared_from_this());
371     TorchStatusChangeCallbackInfo *event = callbackInfo.get();
372     auto task = [event]() {
373         TorchStatusChangeCallbackInfo* callbackInfo = reinterpret_cast<TorchStatusChangeCallbackInfo *>(event);
374         if (callbackInfo) {
375             auto listener = callbackInfo->listener_.lock();
376             CHECK_EXECUTE(listener != nullptr, listener->OnTorchStatusChangeCallback(callbackInfo->info_));
377             delete callbackInfo;
378         }
379     };
380     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
381         MEDIA_ERR_LOG("Failed to execute work");
382     } else {
383         callbackInfo.release();
384     }
385 }
386 
OnTorchStatusChangeCallback(const TorchStatusInfo & torchStatusInfo) const387 void TorchListenerNapi::OnTorchStatusChangeCallback(const TorchStatusInfo& torchStatusInfo) const
388 {
389     MEDIA_DEBUG_LOG("OnTorchStatusChangeCallback is called");
390     ExecuteCallbackScopeSafe("torchStatusChange", [&]() {
391         napi_value errCode = CameraNapiUtils::GetUndefinedValue(env_);
392         napi_value callbackObj;
393         TorchStatusInfo info = torchStatusInfo;
394         CameraNapiObject torchStateObj {{
395             { "isTorchAvailable", &info.isTorchAvailable },
396             { "isTorchActive", &info.isTorchActive },
397             { "torchLevel", &info.torchLevel }
398         }};
399         callbackObj = torchStateObj.CreateNapiObjFromMap(env_);
400         return ExecuteCallbackData(env_, errCode, callbackObj);
401     });
402 }
403 
OnTorchStatusChange(const TorchStatusInfo & torchStatusInfo) const404 void TorchListenerNapi::OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const
405 {
406     MEDIA_DEBUG_LOG("OnTorchStatusChange is called");
407     OnTorchStatusChangeCallbackAsync(torchStatusInfo);
408 }
409 
FoldListenerNapi(napi_env env)410 FoldListenerNapi::FoldListenerNapi(napi_env env): ListenerBase(env)
411 {
412     MEDIA_DEBUG_LOG("FoldListenerNapi is called.");
413 }
414 
~FoldListenerNapi()415 FoldListenerNapi::~FoldListenerNapi()
416 {
417     MEDIA_DEBUG_LOG("~FoldListenerNapi is called.");
418 }
419 
OnFoldStatusChangedCallbackAsync(const FoldStatusInfo & foldStatusInfo) const420 void FoldListenerNapi::OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const
421 {
422     MEDIA_DEBUG_LOG("OnFoldStatusChangedCallbackAsync is called");
423     std::unique_ptr<FoldStatusChangeCallbackInfo> callbackInfo =
424         std::make_unique<FoldStatusChangeCallbackInfo>(foldStatusInfo, shared_from_this());
425     FoldStatusChangeCallbackInfo *event = callbackInfo.get();
426     auto task = [event]() {
427         FoldStatusChangeCallbackInfo* callbackInfo = reinterpret_cast<FoldStatusChangeCallbackInfo *>(event);
428         if (callbackInfo) {
429             auto listener = callbackInfo->listener_.lock();
430             if (listener != nullptr) {
431                 listener->OnFoldStatusChangedCallback(callbackInfo->info_);
432             }
433             delete callbackInfo;
434         }
435     };
436     if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
437         MEDIA_ERR_LOG("Failed to execute work");
438     } else {
439         callbackInfo.release();
440     }
441 }
442 
OnFoldStatusChangedCallback(const FoldStatusInfo & foldStatusInfo) const443 void FoldListenerNapi::OnFoldStatusChangedCallback(const FoldStatusInfo& foldStatusInfo) const
444 {
445     MEDIA_DEBUG_LOG("OnFoldStatusChangedCallback is called");
446     ExecuteCallbackScopeSafe("foldStatusChange", [&]() {
447         napi_value errCode = CameraNapiUtils::GetUndefinedValue(env_);
448         napi_create_object(env_, &errCode);
449         napi_value resultObj;
450         napi_create_object(env_, &resultObj);
451 
452         napi_value foldStatusVal;
453         napi_create_int32(env_, static_cast<int32_t>(foldStatusInfo.foldStatus), &foldStatusVal);
454         napi_set_named_property(env_, resultObj, "foldStatus", foldStatusVal);
455         napi_value camerasArray;
456         napi_create_array(env_, &camerasArray);
457 
458         const auto& supportedCameras = foldStatusInfo.supportedCameras;
459         napi_value jsErrCode;
460         if (supportedCameras.empty()) {
461             MEDIA_ERR_LOG("supportedCameras is empty");
462             napi_create_int32(env_, CameraErrorCode::SERVICE_FATL_ERROR, &jsErrCode);
463             napi_set_named_property(env_, errCode, "code", jsErrCode);
464             napi_set_named_property(env_, resultObj, "supportedCameras", camerasArray);
465             return ExecuteCallbackData(env_, errCode, resultObj);
466         }
467 
468         for (size_t i = 0; i < supportedCameras.size(); ++i) {
469             if (supportedCameras[i] == nullptr) {
470                 MEDIA_ERR_LOG("cameraDevice is null");
471                 continue;
472             }
473             napi_value cameraObj = CameraNapiObjCameraDevice(*supportedCameras[i]).GenerateNapiValue(env_);
474             napi_set_element(env_, camerasArray, i, cameraObj);
475         }
476 
477         napi_create_int32(env_, 0, &jsErrCode);
478         napi_set_named_property(env_, errCode, "code", jsErrCode);
479         napi_set_named_property(env_, resultObj, "supportedCameras", camerasArray);
480         return ExecuteCallbackData(env_, errCode, resultObj);
481     });
482 }
483 
OnFoldStatusChanged(const FoldStatusInfo & foldStatusInfo) const484 void FoldListenerNapi::OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const
485 {
486     MEDIA_DEBUG_LOG("OnFoldStatusChanged is called");
487     OnFoldStatusChangedCallbackAsync(foldStatusInfo);
488 }
489 
490 const std::unordered_map<JsSceneMode, SceneMode> g_jsToFwMode_ = {
491     {JsSceneMode::JS_NORMAL, SceneMode::NORMAL},
492     {JsSceneMode::JS_CAPTURE, SceneMode::CAPTURE},
493     {JsSceneMode::JS_VIDEO, SceneMode::VIDEO},
494     {JsSceneMode::JS_SECURE_CAMERA, SceneMode::SECURE},
495 };
496 
497 const std::unordered_map<JsSceneMode, SceneMode> g_jsToFwMode4Sys_ = {
498     {JsSceneMode::JS_NORMAL, SceneMode::NORMAL},
499     {JsSceneMode::JS_CAPTURE, SceneMode::CAPTURE},
500     {JsSceneMode::JS_VIDEO, SceneMode::VIDEO},
501     {JsSceneMode::JS_PORTRAIT, SceneMode::PORTRAIT},
502     {JsSceneMode::JS_NIGHT, SceneMode::NIGHT},
503     {JsSceneMode::JS_SLOW_MOTION, SceneMode::SLOW_MOTION},
504     {JsSceneMode::JS_CAPTURE_MARCO, SceneMode::CAPTURE_MACRO},
505     {JsSceneMode::JS_VIDEO_MARCO, SceneMode::VIDEO_MACRO},
506     {JsSceneMode::JS_PROFESSIONAL_PHOTO, SceneMode::PROFESSIONAL_PHOTO},
507     {JsSceneMode::JS_PROFESSIONAL_VIDEO, SceneMode::PROFESSIONAL_VIDEO},
508     {JsSceneMode::JS_HIGH_RES_PHOTO, SceneMode::HIGH_RES_PHOTO},
509     {JsSceneMode::JS_SECURE_CAMERA, SceneMode::SECURE},
510     {JsSceneMode::JS_QUICK_SHOT_PHOTO, SceneMode::QUICK_SHOT_PHOTO},
511     {JsSceneMode::JS_APERTURE_VIDEO, SceneMode::APERTURE_VIDEO},
512     {JsSceneMode::JS_PANORAMA_PHOTO, SceneMode::PANORAMA_PHOTO},
513     {JsSceneMode::JS_LIGHT_PAINTING, SceneMode::LIGHT_PAINTING},
514     {JsSceneMode::JS_TIMELAPSE_PHOTO, SceneMode::TIMELAPSE_PHOTO},
515     {JsSceneMode::JS_FLUORESCENCE_PHOTO, SceneMode::FLUORESCENCE_PHOTO},
516 };
517 
518 static std::unordered_map<JsPolicyType, PolicyType> g_jsToFwPolicyType_ = {
519     {JsPolicyType::JS_PRIVACY, PolicyType::PRIVACY},
520 };
521 
522 std::unordered_map<int32_t, std::function<napi_value(napi_env)>> g_sessionFactories = {
__anon56575cdc0c02() 523     {JsSceneMode::JS_CAPTURE, [] (napi_env env) {
524         return PhotoSessionNapi::CreateCameraSession(env); }},
__anon56575cdc0d02() 525     {JsSceneMode::JS_VIDEO, [] (napi_env env) {
526         return VideoSessionNapi::CreateCameraSession(env); }},
__anon56575cdc0e02() 527     {JsSceneMode::JS_SECURE_CAMERA, [] (napi_env env) {
528         return SecureCameraSessionNapi::CreateCameraSession(env); }},
529 };
530 
CameraManagerNapi()531 CameraManagerNapi::CameraManagerNapi() : env_(nullptr)
532 {
533     CAMERA_SYNC_TRACE;
534     CHECK_EXECUTE(CameraSecurity::CheckSystemApp(), {
535         thread loadThread = thread([]() {CameraNapiExManager::GetCameraNapiExProxy();});
536         loadThread.detach();
537     });
538 }
539 
~CameraManagerNapi()540 CameraManagerNapi::~CameraManagerNapi()
541 {
542     MEDIA_DEBUG_LOG("~CameraManagerNapi is called");
543     CameraNapiExManager::FreeCameraNapiExProxy();
544 }
545 
546 // Constructor callback
CameraManagerNapiConstructor(napi_env env,napi_callback_info info)547 napi_value CameraManagerNapi::CameraManagerNapiConstructor(napi_env env, napi_callback_info info)
548 {
549     MEDIA_DEBUG_LOG("CameraManagerNapiConstructor is called");
550     napi_status status;
551     napi_value result = nullptr;
552     napi_value thisVar = nullptr;
553 
554     napi_get_undefined(env, &result);
555     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
556 
557     if (status == napi_ok && thisVar != nullptr) {
558         std::unique_ptr<CameraManagerNapi> obj = std::make_unique<CameraManagerNapi>();
559         obj->env_ = env;
560         obj->cameraManager_ = CameraManager::GetInstance();
561         CHECK_RETURN_RET_ELOG(obj->cameraManager_ == nullptr, result,
562             "Failure wrapping js to native napi, obj->cameraManager_ null");
563         status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
564                            CameraManagerNapi::CameraManagerNapiDestructor, nullptr, nullptr);
565         if (status == napi_ok) {
566             obj.release();
567             return thisVar;
568         } else {
569             MEDIA_ERR_LOG("Failure wrapping js to native napi");
570         }
571     }
572     MEDIA_ERR_LOG("CameraManagerNapiConstructor call Failed!");
573     return result;
574 }
575 
CameraManagerNapiDestructor(napi_env env,void * nativeObject,void * finalize_hint)576 void CameraManagerNapi::CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint)
577 {
578     MEDIA_DEBUG_LOG("CameraManagerNapiDestructor is called");
579     CameraManagerNapi* camera = reinterpret_cast<CameraManagerNapi*>(nativeObject);
580     if (camera != nullptr) {
581         delete camera;
582     }
583 }
584 
Init(napi_env env,napi_value exports)585 napi_value CameraManagerNapi::Init(napi_env env, napi_value exports)
586 {
587     MEDIA_DEBUG_LOG("Init is called");
588     napi_status status;
589     napi_value ctorObj;
590 
591     napi_property_descriptor camera_mgr_properties[] = {
592         // CameraManager
593         DECLARE_NAPI_FUNCTION("getSupportedCameras", GetSupportedCameras),
594         DECLARE_NAPI_FUNCTION("getSupportedSceneModes", GetSupportedModes),
595         DECLARE_NAPI_FUNCTION("getSupportedOutputCapability", GetSupportedOutputCapability),
596         DECLARE_NAPI_FUNCTION("isCameraMuted", IsCameraMuted),
597         DECLARE_NAPI_FUNCTION("isCameraMuteSupported", IsCameraMuteSupported),
598         DECLARE_NAPI_FUNCTION("muteCamera", MuteCamera),
599         DECLARE_NAPI_FUNCTION("muteCameraPersistent", MuteCameraPersist),
600         DECLARE_NAPI_FUNCTION("prelaunch", PrelaunchCamera),
601         DECLARE_NAPI_FUNCTION("resetRssPriority", ResetRssPriority),
602         DECLARE_NAPI_FUNCTION("preSwitchCamera", PreSwitchCamera),
603         DECLARE_NAPI_FUNCTION("isControlCenterActive", IsControlCenterActive),
604         DECLARE_NAPI_FUNCTION("createControlCenterSession", CreateControlCenterSession),
605         DECLARE_NAPI_FUNCTION("isPrelaunchSupported", IsPrelaunchSupported),
606         DECLARE_NAPI_FUNCTION("setPrelaunchConfig", SetPrelaunchConfig),
607         DECLARE_NAPI_FUNCTION("createCameraInput", CreateCameraInputInstance),
608         DECLARE_NAPI_FUNCTION("createCaptureSession", CreateCameraSessionInstance),
609         DECLARE_NAPI_FUNCTION("createSession", CreateSessionInstance),
610         DECLARE_NAPI_FUNCTION("createPreviewOutput", CreatePreviewOutputInstance),
611         DECLARE_NAPI_FUNCTION("createDeferredPreviewOutput", CreateDeferredPreviewOutputInstance),
612         DECLARE_NAPI_FUNCTION("createPhotoOutput", CreatePhotoOutputInstance),
613         DECLARE_NAPI_FUNCTION("createVideoOutput", CreateVideoOutputInstance),
614         DECLARE_NAPI_FUNCTION("createMetadataOutput", CreateMetadataOutputInstance),
615         DECLARE_NAPI_FUNCTION("createDepthDataOutput", CreateDepthDataOutputInstance),
616         DECLARE_NAPI_FUNCTION("isTorchSupported", IsTorchSupported),
617         DECLARE_NAPI_FUNCTION("isTorchModeSupported", IsTorchModeSupported),
618         DECLARE_NAPI_FUNCTION("getTorchMode", GetTorchMode),
619         DECLARE_NAPI_FUNCTION("setTorchMode", SetTorchMode),
620         DECLARE_NAPI_FUNCTION("getCameraDevice", GetCameraDevice),
621         DECLARE_NAPI_FUNCTION("getCameraConcurrentInfos", GetCameraConcurrentInfos),
622         DECLARE_NAPI_FUNCTION("getCameraStorageSize", GetCameraStorageSize),
623         DECLARE_NAPI_FUNCTION("on", On),
624         DECLARE_NAPI_FUNCTION("once", Once),
625         DECLARE_NAPI_FUNCTION("off", Off)
626     };
627 
628     status = napi_define_class(env, CAMERA_MANAGER_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
629                                CameraManagerNapiConstructor, nullptr,
630                                sizeof(camera_mgr_properties) / sizeof(camera_mgr_properties[PARAM0]),
631                                camera_mgr_properties, &ctorObj);
632     if (status == napi_ok) {
633         if (NapiRefManager::CreateMemSafetyRef(env, ctorObj, &sConstructor_) == napi_ok) {
634             status = napi_set_named_property(env, exports, CAMERA_MANAGER_NAPI_CLASS_NAME, ctorObj);
635             CHECK_RETURN_RET(status == napi_ok, exports);
636         }
637     }
638     MEDIA_ERR_LOG("Init call Failed!");
639     return nullptr;
640 }
641 
CreateCameraManager(napi_env env)642 napi_value CameraManagerNapi::CreateCameraManager(napi_env env)
643 {
644     MEDIA_INFO_LOG("CreateCameraManager is called");
645     napi_status status;
646     napi_value result = nullptr;
647     napi_value ctor;
648 
649     status = napi_get_reference_value(env, sConstructor_, &ctor);
650     if (status == napi_ok) {
651         status = napi_new_instance(env, ctor, 0, nullptr, &result);
652         if (status == napi_ok) {
653             MEDIA_INFO_LOG("CreateCameraManager is ok");
654             return result;
655         } else {
656             MEDIA_ERR_LOG("New instance could not be obtained");
657         }
658     }
659     napi_get_undefined(env, &result);
660     MEDIA_ERR_LOG("CreateCameraManager call Failed!");
661     return result;
662 }
663 
CreateCameraJSArray(napi_env env,std::vector<sptr<CameraDevice>> cameraObjList)664 static napi_value CreateCameraJSArray(napi_env env, std::vector<sptr<CameraDevice>> cameraObjList)
665 {
666     MEDIA_DEBUG_LOG("CreateCameraJSArray is called");
667     napi_value cameraArray = nullptr;
668 
669     CHECK_PRINT_ELOG(cameraObjList.empty(), "cameraObjList is empty");
670 
671     napi_status status = napi_create_array(env, &cameraArray);
672     if (status == napi_ok) {
673         for (size_t i = 0; i < cameraObjList.size(); i++) {
674             if (cameraObjList[i] == nullptr) {
675                 continue;
676             }
677             napi_value camera = CameraNapiObjCameraDevice(*cameraObjList[i]).GenerateNapiValue(env);
678             CHECK_RETURN_RET_ELOG(camera == nullptr || napi_set_element(env, cameraArray, i, camera) != napi_ok,
679                 nullptr, "Failed to create camera napi wrapper object");
680         }
681     }
682     return cameraArray;
683 }
684 
CreateCameraSessionInstance(napi_env env,napi_callback_info info)685 napi_value CameraManagerNapi::CreateCameraSessionInstance(napi_env env, napi_callback_info info)
686 {
687     CAMERA_SYNC_TRACE;
688     MEDIA_INFO_LOG("CreateCameraSessionInstance is called");
689     napi_status status;
690     napi_value result = nullptr;
691     size_t argc = ARGS_ZERO;
692     napi_value argv[ARGS_ZERO];
693     napi_value thisVar = nullptr;
694 
695     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
696 
697     napi_get_undefined(env, &result);
698 
699     CameraManagerNapi* cameraManagerNapi = nullptr;
700     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
701     CHECK_RETURN_RET_ELOG(status != napi_ok || cameraManagerNapi == nullptr, nullptr, "napi_unwrap failure!");
702     if (CameraNapiSecurity::CheckSystemApp(env, false)) {
703         auto cameraNapiExProxy = CameraNapiExManager::GetCameraNapiExProxy();
704         CHECK_RETURN_RET_ELOG(cameraNapiExProxy == nullptr, result, "cameraNapiExProxy is nullptr");
705         result = cameraNapiExProxy->CreateDeprecatedSessionForSys(env);
706     } else {
707         result = CameraSessionNapi::CreateCameraSession(env);
708     }
709     CHECK_PRINT_ELOG(result == nullptr, "CreateCameraSessionInstance failed");
710     return result;
711 }
712 
CreateSessionInstance(napi_env env,napi_callback_info info)713 napi_value CameraManagerNapi::CreateSessionInstance(napi_env env, napi_callback_info info)
714 {
715     MEDIA_INFO_LOG("CreateSessionInstance is called");
716     CameraManagerNapi* cameraManagerNapi = nullptr;
717     int32_t jsModeName = -1;
718     CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, jsModeName);
719     CHECK_PRINT_ELOG(!jsParamParser.AssertStatus(INVALID_ARGUMENT, "Create session invalid argument!"),
720         "CameraManagerNapi::CreateSessionInstance invalid argument: %{public}d", jsModeName);
721     MEDIA_INFO_LOG("CameraManagerNapi::CreateSessionInstance mode = %{public}d", jsModeName);
722     napi_value result = nullptr;
723     if (CameraNapiSecurity::CheckSystemApp(env, false)) {
724         auto cameraNapiExProxy = CameraNapiExManager::GetCameraNapiExProxy();
725         CHECK_RETURN_RET_ELOG(cameraNapiExProxy == nullptr, result, "cameraNapiExProxy is nullptr");
726         result = cameraNapiExProxy->CreateSessionForSys(env, jsModeName);
727         if (result == nullptr) {
728             MEDIA_ERR_LOG("CreateSessionForSys failed");
729             CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Invalid js mode");
730         }
731         return result;
732     }
733     if (g_sessionFactories.find(jsModeName) != g_sessionFactories.end()) {
734         result = g_sessionFactories[jsModeName](env);
735     } else {
736         MEDIA_ERR_LOG("CameraManagerNapi::CreateSessionInstance mode = %{public}d not supported", jsModeName);
737         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Invalid js mode");
738     }
739     return result;
740 }
741 
ParsePrelaunchConfig(napi_env env,napi_value root,PrelaunchConfig * prelaunchConfig)742 bool ParsePrelaunchConfig(napi_env env, napi_value root, PrelaunchConfig* prelaunchConfig)
743 {
744     napi_value res = nullptr;
745     int32_t intValue;
746     std::string cameraId {};
747     CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
748     CameraNapiObject cameraDeviceObj { { { "cameraDevice", &cameraInfoObj } } };
749     CameraNapiParamParser paramParser { env, { root }, cameraDeviceObj };
750     CHECK_RETURN_RET_ELOG(!paramParser.AssertStatus(INVALID_ARGUMENT, "camera info is invalid."),
751         false, "ParsePrelaunchConfig get camera device failure!");
752     prelaunchConfig->cameraDevice_ = CameraManager::GetInstance()->GetCameraDeviceFromId(cameraId);
753     CHECK_PRINT_ELOG(prelaunchConfig->cameraDevice_ == nullptr,
754         "ParsePrelaunchConfig get camera device failure! cameraId:%{public}s", cameraId.c_str());
755     if (napi_get_named_property(env, root, "restoreParamType", &res) == napi_ok) {
756         napi_get_value_int32(env, res, &intValue);
757         prelaunchConfig->restoreParamType = static_cast<RestoreParamType>(intValue);
758         MEDIA_INFO_LOG("SetPrelaunchConfig restoreParamType = %{public}d", intValue);
759     }
760 
761     if (napi_get_named_property(env, root, "activeTime", &res) == napi_ok) {
762         napi_get_value_int32(env, res, &intValue);
763         prelaunchConfig->activeTime = intValue;
764         MEDIA_INFO_LOG("SetPrelaunchConfig activeTime = %{public}d", intValue);
765     }
766     return true;
767 }
768 
ParseSettingParam(napi_env env,napi_value root,EffectParam * effectParam)769 bool ParseSettingParam(napi_env env, napi_value root, EffectParam* effectParam)
770 {
771     napi_value res = nullptr;
772     if (napi_get_named_property(env, root, "settingParam",  &res) == napi_ok) {
773         napi_value tempValue = nullptr;
774         int32_t effectValue;
775         if (napi_get_named_property(env, res, "skinSmoothLevel", &tempValue) == napi_ok) {
776             napi_get_value_int32(env, tempValue, &effectValue);
777             effectParam->skinSmoothLevel = effectValue;
778         }
779         if (napi_get_named_property(env, res, "faceSlender", &tempValue) == napi_ok) {
780             napi_get_value_int32(env, tempValue, &effectValue);
781             effectParam->faceSlender = effectValue;
782         }
783 
784         if (napi_get_named_property(env, res, "skinTone", &tempValue) == napi_ok) {
785             napi_get_value_int32(env, tempValue, &effectValue);
786             effectParam->skinTone = effectValue;
787         }
788         MEDIA_INFO_LOG("SetPrelaunchConfig effectParam = %{public}d", effectParam->skinSmoothLevel);
789     }
790     return true;
791 }
792 
CreatePreviewOutputInstance(napi_env env,napi_callback_info info)793 napi_value CameraManagerNapi::CreatePreviewOutputInstance(napi_env env, napi_callback_info info)
794 {
795     MEDIA_INFO_LOG("CreatePreviewOutputInstance is called");
796     std::string surfaceId;
797     CameraManagerNapi* cameraManagerNapi = nullptr;
798     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
799     MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance napi args size is %{public}zu", napiArgsSize);
800 
801     // Check two parameters
802     if (napiArgsSize == 2) { // 2 parameters condition
803         Profile profile;
804         CameraNapiObject profileSizeObj {{
805             { "width", &profile.size_.width },
806             { "height", &profile.size_.height }
807         }};
808         CameraNapiObject profileNapiOjbect {{
809             { "size", &profileSizeObj },
810             { "format", reinterpret_cast<int32_t*>(&profile.format_) }
811         }};
812         CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, profileNapiOjbect, surfaceId);
813         CHECK_RETURN_RET(!jsParamParser.AssertStatus(INVALID_ARGUMENT,
814             "CameraManagerNapi::CreatePreviewOutputInstance 2 args parse error"), nullptr);
815         MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance ParseProfile "
816                        "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
817             profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
818         return PreviewOutputNapi::CreatePreviewOutput(env, profile, surfaceId);
819     }
820 
821     // Check one parameters
822     CameraNapiParamParser jsParamParser = CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId);
823     CHECK_RETURN_RET(!jsParamParser.AssertStatus(INVALID_ARGUMENT,
824         "CameraManagerNapi::CreatePreviewOutputInstance 1 args parse error"), nullptr);
825     MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance surfaceId : %{public}s", surfaceId.c_str());
826     return PreviewOutputNapi::CreatePreviewOutput(env, surfaceId);
827 }
828 
CreateDeferredPreviewOutputInstance(napi_env env,napi_callback_info info)829 napi_value CameraManagerNapi::CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info)
830 {
831     MEDIA_INFO_LOG("CreateDeferredPreviewOutputInstance is called");
832     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr,
833         "SystemApi CreateDeferredPreviewOutputInstance is called!");
834 
835     CameraManagerNapi* cameraManagerNapi = nullptr;
836     Profile profile;
837     CameraNapiObject profileSizeObj {{
838         { "width", &profile.size_.width },
839         { "height", &profile.size_.height }
840     }};
841     CameraNapiObject profileNapiOjbect {{
842         { "size", &profileSizeObj },
843         { "format", reinterpret_cast<int32_t*>(&profile.format_) }
844     }};
845 
846     CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, profileNapiOjbect);
847     CHECK_RETURN_RET(!jsParamParser.AssertStatus(INVALID_ARGUMENT,
848         "CameraManagerNapi::CreateDeferredPreviewOutput args parse error"), nullptr);
849     MEDIA_INFO_LOG("CameraManagerNapi::CreateDeferredPreviewOutput ParseProfile "
850                    "size.width = %{public}d, size.height = %{public}d, format = %{public}d",
851         profile.size_.width, profile.size_.height, profile.format_);
852     return PreviewOutputNapi::CreateDeferredPreviewOutput(env, profile);
853 }
854 
CreatePhotoOutputInstance(napi_env env,napi_callback_info info)855 napi_value CameraManagerNapi::CreatePhotoOutputInstance(napi_env env, napi_callback_info info)
856 {
857     MEDIA_INFO_LOG("CreatePhotoOutputInstance is called");
858     std::string surfaceId;
859     CameraManagerNapi* cameraManagerNapi = nullptr;
860     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
861     MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance napi args size is %{public}zu", napiArgsSize);
862 
863     Profile profile;
864     CameraNapiObject profileSizeObj {{
865         { "width", &profile.size_.width },
866         { "height", &profile.size_.height }
867     }};
868     CameraNapiObject profileNapiOjbect {{
869         { "size", &profileSizeObj },
870         { "format", reinterpret_cast<int32_t*>(&profile.format_) }
871     }};
872 
873     if (napiArgsSize == 2) { // 2 parameters condition
874         CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi,
875             profileNapiOjbect, surfaceId).AssertStatus(INVALID_ARGUMENT,
876             "CameraManagerNapi::CreatePhotoOutputInstance 2 args parse error"), nullptr);
877         MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance ParseProfile "
878                        "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
879             profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
880         return PhotoOutputNapi::CreatePhotoOutput(env, profile, surfaceId);
881     } else if (napiArgsSize == 1) { // 1 parameters condition
882         // Check one parameter only profile
883         if (CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect).IsStatusOk()) {
884             MEDIA_INFO_LOG(
885                 "CameraManagerNapi::CreatePhotoOutputInstance ParseProfile "
886                 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
887                 profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
888             return PhotoOutputNapi::CreatePhotoOutput(env, profile, "");
889         }
890 
891         // Check one parameter only surfaceId
892         CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId).AssertStatus(
893             INVALID_ARGUMENT, "CameraManagerNapi::CreatePhotoOutputInstance 1 args parse error"), nullptr);
894         MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance surfaceId : %{public}s", surfaceId.c_str());
895         return PhotoOutputNapi::CreatePhotoOutput(env, surfaceId);
896     }
897 
898     MEDIA_WARNING_LOG("CameraManagerNapi::CreatePhotoOutputInstance with none parameter");
899     // Check none parameter
900     CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi).AssertStatus(INVALID_ARGUMENT,
901         "CameraManagerNapi::CreatePhotoOutputInstance args parse error"), nullptr);
902     return PhotoOutputNapi::CreatePhotoOutput(env, "");
903 }
904 
CreateVideoOutputInstance(napi_env env,napi_callback_info info)905 napi_value CameraManagerNapi::CreateVideoOutputInstance(napi_env env, napi_callback_info info)
906 {
907     MEDIA_INFO_LOG("CreateVideoOutputInstance is called");
908     std::string surfaceId;
909     CameraManagerNapi* cameraManagerNapi = nullptr;
910     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
911     MEDIA_INFO_LOG("CameraManagerNapi::CreateVideoOutputInstance napi args size is %{public}zu", napiArgsSize);
912 
913     if (napiArgsSize == 2) { // 2 parameters condition
914         VideoProfile videoProfile;
915         videoProfile.framerates_.resize(2); // framerate size is 2
916         CameraNapiObject profileSizeObj {{
917             { "width", &videoProfile.size_.width },
918             { "height", &videoProfile.size_.height }
919         }};
920         CameraNapiObject profileFrameRateObj {{
921             { "min", &videoProfile.framerates_[0] },
922             { "max", &videoProfile.framerates_[1] }
923         }};
924         CameraNapiObject profileNapiOjbect {{
925             { "size", &profileSizeObj },
926             { "frameRateRange", &profileFrameRateObj },
927             { "format", reinterpret_cast<int32_t*>(&videoProfile.format_) }
928         }};
929 
930         CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect, surfaceId)
931             .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreateVideoOutputInstance 2 args parse error"),
932             nullptr);
933         MEDIA_INFO_LOG(
934             "CameraManagerNapi::CreateVideoOutputInstance ParseVideoProfile "
935             "size.width = %{public}d, size.height = %{public}d, format = %{public}d, frameRateMin = %{public}d, "
936             "frameRateMax = %{public}d, surfaceId = %{public}s",
937             videoProfile.size_.width, videoProfile.size_.height, videoProfile.format_, videoProfile.framerates_[0],
938             videoProfile.framerates_[1], surfaceId.c_str());
939         return VideoOutputNapi::CreateVideoOutput(env, videoProfile, surfaceId);
940     }
941 
942     MEDIA_WARNING_LOG("CameraManagerNapi::CreateVideoOutputInstance with only surfaceId");
943     // Check one parameters only surfaceId
944     CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId).AssertStatus(
945         INVALID_ARGUMENT, "CameraManagerNapi::CreateVideoOutputInstance args parse error"), nullptr);
946     MEDIA_INFO_LOG("CameraManagerNapi::CreateVideoOutputInstance surfaceId : %{public}s", surfaceId.c_str());
947     return VideoOutputNapi::CreateVideoOutput(env, surfaceId);
948 }
949 
CreateDepthDataOutputInstance(napi_env env,napi_callback_info info)950 napi_value CameraManagerNapi::CreateDepthDataOutputInstance(napi_env env, napi_callback_info info)
951 {
952     MEDIA_INFO_LOG("CreateDepthDataOutputInstance is called");
953     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr,
954         "SystemApi CreateDepthDataOutputInstance is called!");
955     CameraManagerNapi* cameraManagerNapi = nullptr;
956     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
957     MEDIA_INFO_LOG("CameraManagerNapi::CreateDepthDataOutputInstance napi args size is %{public}zu", napiArgsSize);
958 
959     DepthProfile depthProfile;
960     CameraNapiObject profileSizeObj {{
961         { "width", &depthProfile.size_.width },
962         { "height", &depthProfile.size_.height }
963     }};
964     CameraNapiObject profileNapiOjbect {{
965         { "size", &profileSizeObj },
966         { "dataAccuracy", reinterpret_cast<int32_t*>(&depthProfile.dataAccuracy_) },
967         { "format", reinterpret_cast<int32_t*>(&depthProfile.format_) }
968     }};
969 
970     CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect).AssertStatus(
971         INVALID_ARGUMENT, "CameraManagerNapi::CreateDepthDataOutputInstance 1 args parse error"), nullptr);
972     MEDIA_INFO_LOG(
973         "CameraManagerNapi::CreateDepthDataOutputInstance ParseDepthProfile "
974         "size.width = %{public}d, size.height = %{public}d, format = %{public}d, dataAccuracy = %{public}d,",
975         depthProfile.size_.width, depthProfile.size_.height, depthProfile.format_, depthProfile.dataAccuracy_);
976     auto cameraNapiExProxy = CameraNapiExManager::GetCameraNapiExProxy();
977     CHECK_RETURN_RET_ELOG(cameraNapiExProxy == nullptr, nullptr, "cameraNapiExProxy is nullptr");
978     return cameraNapiExProxy->CreateDepthDataOutput(env, depthProfile);
979 }
980 
CreateMetadataOutputInstance(napi_env env,napi_callback_info info)981 napi_value CameraManagerNapi::CreateMetadataOutputInstance(napi_env env, napi_callback_info info)
982 {
983     MEDIA_INFO_LOG("CreateMetadataOutputInstance is called");
984     napi_status status;
985     napi_value result = nullptr;
986     size_t argc = ARGS_ONE;
987     napi_value argv[ARGS_ONE] = {0};
988     napi_value thisVar = nullptr;
989 
990     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
991     CHECK_RETURN_RET(!CameraNapiUtils::CheckInvalidArgument(env, argc, ARGS_ONE,
992         argv, CREATE_METADATA_OUTPUT_INSTANCE), result);
993 
994     napi_get_undefined(env, &result);
995     CameraManagerNapi* cameraManagerNapi = nullptr;
996     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
997     CHECK_RETURN_RET_ELOG(status != napi_ok || cameraManagerNapi == nullptr, nullptr, "napi_unwrap failure!");
998     std::vector<MetadataObjectType> metadataObjectTypes;
999     CameraNapiUtils::ParseMetadataObjectTypes(env, argv[PARAM0], metadataObjectTypes);
1000     result = MetadataOutputNapi::CreateMetadataOutput(env, metadataObjectTypes);
1001     return result;
1002 }
1003 
GetSupportedCameras(napi_env env,napi_callback_info info)1004 napi_value CameraManagerNapi::GetSupportedCameras(napi_env env, napi_callback_info info)
1005 {
1006     MEDIA_INFO_LOG("GetSupportedCameras is called");
1007     CameraManagerNapi* cameraManagerNapi;
1008     CameraNapiParamParser paramParser(env, info, cameraManagerNapi);
1009     CHECK_RETURN_RET_ELOG(!paramParser.AssertStatus(INVALID_ARGUMENT, "invalid argument."), nullptr,
1010         "CameraManagerNapi::GetSupportedCameras invalid argument");
1011     std::vector<sptr<CameraDevice>> cameraObjList = cameraManagerNapi->cameraManager_->GetSupportedCameras();
1012     napi_value result = GetCachedSupportedCameras(env, cameraObjList);
1013     if (result == nullptr) {
1014         result = CreateCameraJSArray(env, cameraObjList);
1015         CacheSupportedCameras(env, cameraObjList, result);
1016     }
1017     MEDIA_DEBUG_LOG("CameraManagerNapi::GetSupportedCameras size=[%{public}zu]", cameraObjList.size());
1018     return result;
1019 }
1020 
GetCameraDevice(napi_env env,napi_callback_info info)1021 napi_value CameraManagerNapi::GetCameraDevice(napi_env env, napi_callback_info info)
1022 {
1023     MEDIA_INFO_LOG("GetCameraDevice is called");
1024     CameraManagerNapi* cameraManagerNapi;
1025     int32_t cameraPosition;
1026     int32_t cameraType;
1027     sptr<CameraDevice> cameraInfo = nullptr;
1028     CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraPosition, cameraType);
1029     if (!jsParamParser.AssertStatus(PARAMETER_ERROR, "GetCameraDevice with 2 invalid arguments!")) {
1030             MEDIA_ERR_LOG("CameraManagerNapi::GetCameraDevice 2 invalid arguments");
1031             return nullptr;
1032     }
1033     ProcessCameraInfo(cameraManagerNapi->cameraManager_, static_cast<const CameraPosition>(cameraPosition),
1034         static_cast<const CameraType>(cameraType), cameraInfo);
1035     if (cameraInfo == nullptr) {
1036         MEDIA_ERR_LOG("cameraInfo is null");
1037         CameraNapiUtils::ThrowError(env, SERVICE_FATL_ERROR, "cameraInfo is null.");
1038         return nullptr;
1039     }
1040     napi_value result = nullptr;
1041     result = CameraNapiObjCameraDevice(*cameraInfo).GenerateNapiValue(env);
1042     return result;
1043 }
1044 
GetCameraConcurrentInfos(napi_env env,napi_callback_info info)1045 napi_value CameraManagerNapi::GetCameraConcurrentInfos(napi_env env, napi_callback_info info)
1046 {
1047     MEDIA_INFO_LOG("GetCameraConcurrentInfos is called");
1048     CameraManagerNapi* cameraManagerNapi;
1049     std::vector<bool> cameraConcurrentType = {};
1050     std::vector<std::vector<SceneMode>> modes = {};
1051     std::vector<std::vector<sptr<CameraOutputCapability>>> outputCapabilities = {};
1052     size_t argc = ARGS_ONE;
1053     napi_value argv[ARGS_ONE] = {0};
1054     napi_value thisVar = nullptr;
1055     napi_status status;
1056 
1057     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1058     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1059     if (status != napi_ok) {
1060         CameraNapiUtils::ThrowError(env, PARAMETER_ERROR,
1061             "CameraManagerNapi::GetCameraConcurrentInfos can not get thisVar");
1062         return nullptr;
1063     }
1064     if (argc != ARGS_ONE) {
1065         CameraNapiUtils::ThrowError(env, PARAMETER_ERROR,
1066             "CameraManagerNapi::GetCameraConcurrentInfos argc is not ARGS_ONE");
1067         return nullptr;
1068     }
1069     napi_valuetype argvType;
1070     napi_typeof(env, argv[PARAM0], &argvType);
1071     if (argvType != napi_object) {
1072         CameraNapiUtils::ThrowError(env, PARAMETER_ERROR,
1073             "CameraManagerNapi::GetCameraConcurrentInfos type of array is error");
1074         return nullptr;
1075     }
1076 
1077     std::vector<string>cameraIdv = {};
1078     vector<sptr<CameraDevice>> cameraReturnNull = {};
1079     cameraManagerNapi->ParseGetCameraConcurrentInfos(env, argv[PARAM0], cameraIdv);
1080     CHECK_RETURN_RET_ELOG(cameraIdv.size() == 0,
1081         CreateCameraConcurrentResult(env, cameraReturnNull, cameraConcurrentType, modes, outputCapabilities),
1082         "CameraManagerNapi::GetCameraConcurrentInfos ParseGetCameraConcurrentInfos cameraid size is null");
1083     vector<sptr<CameraDevice>> cameraDeviceArrray = {};
1084     for (auto cameraidonly : cameraIdv) {
1085         CHECK_RETURN_RET_ELOG(cameraidonly.empty(),
1086             CreateCameraConcurrentResult(env, cameraReturnNull, cameraConcurrentType, modes, outputCapabilities),
1087             "CameraManagerNapi::GetCameraConcurrentInfos ParseGetCameraConcurrentInfos cameraid is null");
1088         auto getCameraDev = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraidonly);
1089         CHECK_RETURN_RET_ELOG(getCameraDev == nullptr,
1090             CreateCameraConcurrentResult(env, cameraReturnNull, cameraConcurrentType, modes, outputCapabilities),
1091             "CameraManagerNapi::GetCameraConcurrentInfos GetCameraDeviceFromId get cameraid is null");
1092         cameraDeviceArrray.push_back(getCameraDev);
1093     }
1094 
1095     bool issupported = cameraManagerNapi->cameraManager_->GetConcurrentType(cameraDeviceArrray, cameraConcurrentType);
1096     if (issupported == false) {
1097         MEDIA_ERR_LOG("CameraManagerNapi::Camera is not support ConcurrentType");
1098         return CreateCameraConcurrentResult(env, cameraReturnNull, cameraConcurrentType, modes, outputCapabilities);
1099     }
1100     issupported = cameraManagerNapi->cameraManager_->CheckConcurrentExecution(cameraDeviceArrray);
1101     if (issupported == false) {
1102         MEDIA_ERR_LOG("CameraManagerNapi::Camera is not support ConcurrentType");
1103         return CreateCameraConcurrentResult(env, cameraReturnNull, cameraConcurrentType, modes, outputCapabilities);
1104     }
1105 
1106     cameraManagerNapi->cameraManager_->GetCameraConcurrentInfos(cameraDeviceArrray,
1107         cameraConcurrentType, modes, outputCapabilities);
1108     return CreateCameraConcurrentResult(env, cameraDeviceArrray, cameraConcurrentType, modes, outputCapabilities);
1109 }
1110 
ParseGetCameraConcurrentInfos(napi_env env,napi_value arrayParam,std::vector<std::string> & cameraIdv)1111 void CameraManagerNapi::ParseGetCameraConcurrentInfos(napi_env env, napi_value arrayParam,
1112     std::vector<std::string> &cameraIdv)
1113 {
1114     MEDIA_DEBUG_LOG("ParseGetCameraConcurrentInfos is called");
1115     uint32_t length = 0;
1116     napi_value value;
1117     napi_get_array_length(env, arrayParam, &length);
1118     for (uint32_t i = 0; i < length; i++) {
1119         napi_get_element(env, arrayParam, i, &value);
1120         napi_value res = nullptr;
1121         if (napi_get_named_property(env, value, "cameraId", &res) == napi_ok) {
1122             size_t sizeofres;
1123             char buffer[PATH_MAX];
1124             napi_get_value_string_utf8(env, res, buffer, PATH_MAX, &sizeofres);
1125             std::string cameraidonly = std::string(buffer);
1126             cameraIdv.push_back(cameraidonly);
1127         }
1128     }
1129 }
1130 
GetCameraStorageSize(napi_env env,napi_callback_info info)1131 napi_value CameraManagerNapi::GetCameraStorageSize(napi_env env, napi_callback_info info)
1132 {
1133     MEDIA_INFO_LOG("GetCameraStorageSize is called");
1134     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1135         MEDIA_ERR_LOG("SystemApi GetCameraStorageSize is called!");
1136         return nullptr;
1137     }
1138     std::unique_ptr<CameraManagerAsyncContext> asyncContext = std::make_unique<CameraManagerAsyncContext>(
1139         "CameraManagerNapi::GetCameraStorageSize", CameraNapiUtils::IncrementAndGet(cameraManagerTaskId));
1140     auto asyncFunction =
1141         std::make_shared<CameraNapiAsyncFunction>(env, "GetCameraStorageSize", asyncContext->callbackRef,
1142             asyncContext->deferred);
1143     CameraNapiParamParser jsParamParser(env, info, asyncContext->objectInfo, asyncFunction);
1144     if (!jsParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) {
1145         MEDIA_ERR_LOG("CameraManagerNapi::GetCameraStorageSize invalid argument");
1146         return nullptr;
1147     }
1148     asyncContext->HoldNapiValue(env, jsParamParser.GetThisVar());
1149     napi_status status = napi_create_async_work(
1150         env, nullptr, asyncFunction->GetResourceName(),
1151         [](napi_env env, void* data) {
1152             MEDIA_INFO_LOG("CameraManagerNapi::GetCameraStorageSize running on worker");
1153             auto context = static_cast<CameraManagerAsyncContext*>(data);
1154             CHECK_RETURN_ELOG(context->objectInfo == nullptr,
1155                 "CameraManagerNapi::GetCameraStorageSize async info is nullptr");
1156             CAMERA_START_ASYNC_TRACE(context->funcName, context->taskId);
1157             CameraNapiWorkerQueueKeeper::GetInstance()->ConsumeWorkerQueueTask(context->queueTask, [&context]() {
1158                 int64_t storageSize = 0;
1159                 context->errorCode = context->objectInfo->cameraManager_->GetCameraStorageSize(storageSize);
1160                 context->status = context->errorCode == CameraErrorCode::SUCCESS;
1161                 context->storageSize = storageSize;
1162             });
1163         },
1164         AsyncCompleteCallback, static_cast<void*>(asyncContext.get()), &asyncContext->work);
1165     if (status != napi_ok) {
1166         MEDIA_ERR_LOG("Failed to create napi_create_async_work for PreviewOutputNapi::Release");
1167         asyncFunction->Reset();
1168     } else {
1169         asyncContext->queueTask =
1170             CameraNapiWorkerQueueKeeper::GetInstance()->AcquireWorkerQueueTask("PreviewOutputNapi::Release");
1171         napi_queue_async_work_with_qos(env, asyncContext->work, napi_qos_user_initiated);
1172         asyncContext.release();
1173     }
1174     if (asyncFunction->GetAsyncFunctionType() == ASYNC_FUN_TYPE_PROMISE) {
1175         return asyncFunction->GetPromise();
1176     }
1177     return CameraNapiUtils::GetUndefinedValue(env);
1178 }
1179 
CreateCameraConcurrentResult(napi_env env,vector<sptr<CameraDevice>> & cameraDeviceArrray,std::vector<bool> & cameraConcurrentType,std::vector<std::vector<SceneMode>> & modes,std::vector<std::vector<sptr<CameraOutputCapability>>> & outputCapabilities)1180 napi_value CameraManagerNapi::CreateCameraConcurrentResult(napi_env env, vector<sptr<CameraDevice>> &cameraDeviceArrray,
1181     std::vector<bool> &cameraConcurrentType, std::vector<std::vector<SceneMode>> &modes,
1182     std::vector<std::vector<sptr<CameraOutputCapability>>> &outputCapabilities)
1183 {
1184     napi_value resjsArray = nullptr;
1185     napi_status resjsArraystatus = napi_create_array(env, &resjsArray);
1186     if (resjsArraystatus != napi_ok) {
1187         MEDIA_ERR_LOG("resjsArray create is fail");
1188         return nullptr;
1189     }
1190     for (size_t i = 0; i < cameraDeviceArrray.size(); i++) {
1191         napi_value obj = nullptr;
1192         napi_create_object(env, &obj);
1193         napi_value cameranow = CameraNapiObjCameraDevice(*cameraDeviceArrray[i]).GenerateNapiValue(env);
1194         napi_set_named_property(env, obj, "device", cameranow);
1195         napi_value cameraconcurrent = nullptr;
1196         napi_get_boolean(env, cameraConcurrentType[i], &cameraconcurrent);
1197         napi_set_named_property(env, obj, "type", cameraconcurrent);
1198         napi_value scenemodearray = nullptr;
1199         napi_status scenemodearraystatus = napi_create_array(env, &scenemodearray);
1200         if (scenemodearraystatus != napi_ok) {
1201             MEDIA_ERR_LOG("scenemodearray create is fail");
1202             continue;
1203         }
1204         int32_t index = 0;
1205         for (auto modenow : modes[i]) {
1206             auto itr = g_nativeToNapiSupportedMode_.find(modenow);
1207             if (itr != g_nativeToNapiSupportedMode_.end()) {
1208                 napi_value modeitem = nullptr;
1209                 napi_create_int32(env, itr->second, &modeitem);
1210                 napi_set_element(env, scenemodearray, index, modeitem);
1211                 index++;
1212             }
1213         }
1214         napi_set_named_property(env, obj, "modes", scenemodearray);
1215         napi_value outputcapabilitiyarray = nullptr;
1216         napi_status status = napi_create_array(env, &outputcapabilitiyarray);
1217         if (status != napi_ok) {
1218             MEDIA_ERR_LOG("outputcapabilitiyarray create is fail");
1219             continue;
1220         }
1221         index = 0;
1222         for (auto outputCapability : outputCapabilities[i]) {
1223             napi_value outputcapability = CameraNapiObjCameraOutputCapability(*outputCapability).GenerateNapiValue(env);
1224             napi_set_element(env, outputcapabilitiyarray, index, outputcapability);
1225             index++;
1226         }
1227         napi_set_named_property(env, obj, "outputCapabilities", outputcapabilitiyarray);
1228         napi_set_element(env, resjsArray, i, obj);
1229     }
1230     return resjsArray;
1231 }
1232 
CreateSceneModeJSArray(napi_env env,std::vector<SceneMode> & nativeArray)1233 static napi_value CreateSceneModeJSArray(napi_env env, std::vector<SceneMode>& nativeArray)
1234 {
1235     MEDIA_DEBUG_LOG("CreateSceneModeJSArray is called");
1236     napi_value jsArray = nullptr;
1237     napi_value item = nullptr;
1238 
1239     CHECK_PRINT_ELOG(nativeArray.empty(), "nativeArray is empty");
1240 
1241     napi_status status = napi_create_array(env, &jsArray);
1242     std::unordered_map<SceneMode, JsSceneMode> nativeToNapiMap = g_nativeToNapiSupportedMode_;
1243     if (CameraNapiSecurity::CheckSystemApp(env, false)) {
1244         nativeToNapiMap = g_nativeToNapiSupportedModeForSystem_;
1245     }
1246     if (status == napi_ok) {
1247         uint8_t index = 0;
1248         for (size_t i = 0; i < nativeArray.size(); i++) {
1249             auto itr = nativeToNapiMap.find(nativeArray[i]);
1250             if (itr != nativeToNapiMap.end()) {
1251                 napi_create_int32(env, itr->second, &item);
1252                 napi_set_element(env, jsArray, index, item);
1253                 index++;
1254             }
1255         }
1256     }
1257     return jsArray;
1258 }
1259 
GetSupportedModes(napi_env env,napi_callback_info info)1260 napi_value CameraManagerNapi::GetSupportedModes(napi_env env, napi_callback_info info)
1261 {
1262     MEDIA_INFO_LOG("GetSupportedModes is called");
1263     CameraManagerNapi* cameraManagerNapi = nullptr;
1264     std::string cameraId {};
1265     CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1266     CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj).AssertStatus(
1267         INVALID_ARGUMENT, "GetSupportedModes args parse error"), nullptr);
1268     sptr<CameraDevice> cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1269     if (cameraInfo == nullptr) {
1270         MEDIA_ERR_LOG("CameraManagerNapi::GetSupportedModes get camera info fail");
1271         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Get camera info fail");
1272         return nullptr;
1273     }
1274 
1275     std::vector<SceneMode> modeObjList = cameraManagerNapi->cameraManager_->GetSupportedModes(cameraInfo);
1276     for (auto it = modeObjList.begin(); it != modeObjList.end(); it++) {
1277         if (*it == SCAN) {
1278             modeObjList.erase(it);
1279             break;
1280         }
1281     }
1282     if (modeObjList.empty()) {
1283         modeObjList.emplace_back(CAPTURE);
1284         modeObjList.emplace_back(VIDEO);
1285     }
1286     MEDIA_INFO_LOG("CameraManagerNapi::GetSupportedModes size=[%{public}zu]", modeObjList.size());
1287     return CreateSceneModeJSArray(env, modeObjList);
1288 }
1289 
GetSupportedOutputCapabilityAdaptNormalMode(SceneMode fwkMode,sptr<CameraDevice> & cameraInfo,sptr<CameraOutputCapability> & outputCapability)1290 void CameraManagerNapi::GetSupportedOutputCapabilityAdaptNormalMode(
1291     SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability)
1292 {
1293     if (fwkMode == SceneMode::NORMAL && cameraInfo->GetPosition() == CAMERA_POSITION_FRONT) {
1294         auto defaultVideoProfiles = cameraInfo->modeVideoProfiles_[SceneMode::NORMAL];
1295         if (!defaultVideoProfiles.empty()) {
1296             MEDIA_INFO_LOG("return align videoProfile size = %{public}zu", defaultVideoProfiles.size());
1297             outputCapability->SetVideoProfiles(defaultVideoProfiles);
1298         }
1299     }
1300 }
1301 
GetSupportedOutputCapabilityGetCameraInfo(napi_env env,napi_callback_info info,CameraManagerNapi * & cameraManagerNapi,int32_t & jsSceneMode)1302 sptr<CameraDevice> CameraManagerNapi::GetSupportedOutputCapabilityGetCameraInfo(
1303     napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode)
1304 {
1305     std::string cameraId {};
1306     CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1307     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
1308     MEDIA_INFO_LOG("CameraManagerNapi::GetSupportedOutputCapability napi args size is %{public}zu", napiArgsSize);
1309     if (napiArgsSize == ARGS_ONE) {
1310         CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj)
1311             .AssertStatus(INVALID_ARGUMENT, "GetSupportedOutputCapability 1 args parse error"), nullptr);
1312     } else if (napiArgsSize == ARGS_TWO) {
1313         CHECK_RETURN_RET(!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj, jsSceneMode)
1314             .AssertStatus(INVALID_ARGUMENT, "GetSupportedOutputCapability 2 args parse error"), nullptr);
1315         if (jsSceneMode == JsSceneMode::JS_NORMAL) {
1316             CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "invalid js mode");
1317             return nullptr;
1318         }
1319     } else {
1320         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Args size error");
1321         return nullptr;
1322     }
1323     if (cameraManagerNapi == nullptr) {
1324         MEDIA_ERR_LOG("cameraManagerNapi is null");
1325         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "cameraManagerNapi is null");
1326         return nullptr;
1327     }
1328     return cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1329 }
1330 
GetSupportedOutputCapability(napi_env env,napi_callback_info info)1331 napi_value CameraManagerNapi::GetSupportedOutputCapability(napi_env env, napi_callback_info info)
1332 {
1333     MEDIA_INFO_LOG("GetSupportedOutputCapability is called");
1334     CameraManagerNapi* cameraManagerNapi = nullptr;
1335     int32_t jsSceneMode = JsSceneMode::JS_NORMAL;
1336     sptr<CameraDevice> cameraInfo =
1337         GetSupportedOutputCapabilityGetCameraInfo(env, info, cameraManagerNapi, jsSceneMode);
1338 
1339     if (cameraInfo == nullptr) {
1340         MEDIA_ERR_LOG("CameraManagerNapi::GetSupportedOutputCapability get camera info fail");
1341         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Get camera info fail");
1342         return nullptr;
1343     }
1344     std::string cameraId = cameraInfo->GetID();
1345     auto foldType = cameraManagerNapi->cameraManager_->GetFoldScreenType();
1346     if (!(!foldType.empty() && foldType[0] == '4')) {
1347         napi_value cachedResult = GetCachedSupportedOutputCapability(env, cameraId, jsSceneMode);
1348         CHECK_RETURN_RET(cachedResult != nullptr, cachedResult);
1349     }
1350     SceneMode fwkMode = SceneMode::NORMAL;
1351     std::unordered_map<JsSceneMode, SceneMode> jsToFwModeMap = g_jsToFwMode_;
1352     if (CameraNapiSecurity::CheckSystemApp(env, false)) {
1353         jsToFwModeMap = g_jsToFwMode4Sys_;
1354     }
1355     auto itr = jsToFwModeMap.find(static_cast<JsSceneMode>(jsSceneMode));
1356     if (itr != jsToFwModeMap.end()) {
1357         fwkMode = itr->second;
1358     } else {
1359         MEDIA_ERR_LOG("CreateCameraSessionInstance mode = %{public}d not supported", jsSceneMode);
1360         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Not support the input mode");
1361         return nullptr;
1362     }
1363     auto outputCapability = cameraManagerNapi->cameraManager_->GetSupportedOutputCapability(cameraInfo, fwkMode);
1364     CHECK_RETURN_RET_ELOG(outputCapability == nullptr, nullptr, "failed to create CreateCameraOutputCapability");
1365     outputCapability->RemoveDuplicatesProfiles();
1366     GetSupportedOutputCapabilityAdaptNormalMode(fwkMode, cameraInfo, outputCapability);
1367     napi_value result = CameraNapiObjCameraOutputCapability(*outputCapability).GenerateNapiValue(env);
1368     CHECK_EXECUTE(cameraInfo->GetConnectionType() == CAMERA_CONNECTION_BUILT_IN,
1369         CacheSupportedOutputCapability(env, cameraId, jsSceneMode, result));
1370     return result;
1371 }
1372 
IsCameraMuted(napi_env env,napi_callback_info info)1373 napi_value CameraManagerNapi::IsCameraMuted(napi_env env, napi_callback_info info)
1374 {
1375     CAMERA_SYNC_TRACE;
1376     MEDIA_INFO_LOG("IsCameraMuted is called");
1377     napi_value result = nullptr;
1378     size_t argc = ARGS_ONE;
1379     napi_value argv[ARGS_ONE] = {0};
1380     napi_value thisVar = nullptr;
1381 
1382     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1383     NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
1384     bool isMuted = CameraManager::GetInstance()->IsCameraMuted();
1385     MEDIA_DEBUG_LOG("IsCameraMuted : %{public}d", isMuted);
1386     napi_get_boolean(env, isMuted, &result);
1387     return result;
1388 }
1389 
IsCameraMuteSupported(napi_env env,napi_callback_info info)1390 napi_value CameraManagerNapi::IsCameraMuteSupported(napi_env env, napi_callback_info info)
1391 {
1392     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr,
1393         "SystemApi IsCameraMuteSupported is called!");
1394     MEDIA_INFO_LOG("IsCameraMuteSupported is called");
1395     napi_value result = nullptr;
1396     size_t argc = ARGS_ONE;
1397     napi_value argv[ARGS_ONE] = {0};
1398     napi_value thisVar = nullptr;
1399 
1400     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1401     NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
1402 
1403     bool isMuteSupported = CameraManager::GetInstance()->IsCameraMuteSupported();
1404     MEDIA_DEBUG_LOG("isMuteSupported: %{public}d", isMuteSupported);
1405     napi_get_boolean(env, isMuteSupported, &result);
1406     return result;
1407 }
1408 
MuteCamera(napi_env env,napi_callback_info info)1409 napi_value CameraManagerNapi::MuteCamera(napi_env env, napi_callback_info info)
1410 {
1411     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr, "SystemApi MuteCamera is called!");
1412     MEDIA_INFO_LOG("MuteCamera is called");
1413     napi_value result = nullptr;
1414     size_t argc = ARGS_TWO;
1415     napi_value argv[ARGS_TWO] = {0};
1416     napi_value thisVar = nullptr;
1417 
1418     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1419     NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 1 parameters maximum");
1420     bool isSupported;
1421     napi_get_value_bool(env, argv[PARAM0], &isSupported);
1422     CameraManager::GetInstance()->MuteCamera(isSupported);
1423     napi_get_undefined(env, &result);
1424     return result;
1425 }
1426 
MuteCameraPersist(napi_env env,napi_callback_info info)1427 napi_value CameraManagerNapi::MuteCameraPersist(napi_env env, napi_callback_info info)
1428 {
1429     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr,
1430         "SystemApi MuteCameraPersist is called!");
1431     MEDIA_INFO_LOG("MuteCamera is called");
1432     napi_value result = nullptr;
1433     size_t argc = ARGS_TWO;
1434     napi_value argv[ARGS_TWO] = {0};
1435     napi_value thisVar = nullptr;
1436 
1437     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1438     NAPI_ASSERT(env, argc == ARGS_TWO, "requires 2 parameters");
1439     bool muteMode;
1440     int32_t jsPolicyType;
1441     napi_get_value_bool(env, argv[PARAM0], &muteMode);
1442     napi_get_value_int32(env, argv[PARAM1], &jsPolicyType);
1443     NAPI_ASSERT(env, g_jsToFwPolicyType_.count(static_cast<JsPolicyType>(jsPolicyType)) != 0,
1444         "invalid policyType value");
1445     CameraManager::GetInstance()->MuteCameraPersist(g_jsToFwPolicyType_[static_cast<JsPolicyType>(jsPolicyType)],
1446         muteMode);
1447     napi_get_undefined(env, &result);
1448     return result;
1449 }
1450 
CreateCameraInputInstance(napi_env env,napi_callback_info info)1451 napi_value CameraManagerNapi::CreateCameraInputInstance(napi_env env, napi_callback_info info)
1452 {
1453     MEDIA_INFO_LOG("CreateCameraInputInstance is called");
1454     CameraManagerNapi* cameraManagerNapi = nullptr;
1455     size_t argSize = CameraNapiUtils::GetNapiArgs(env, info);
1456     sptr<CameraDevice> cameraInfo = nullptr;
1457     if (argSize == ARGS_ONE) {
1458         std::string cameraId {};
1459         CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1460         CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraInfoObj);
1461         CHECK_RETURN_RET_ELOG(!jsParamParser.AssertStatus(INVALID_ARGUMENT,
1462             "Create cameraInput invalid argument!"), nullptr,
1463             "CameraManagerNapi::CreateCameraInputInstance invalid argument");
1464         cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1465     } else if (argSize == ARGS_TWO) {
1466         int32_t cameraPosition;
1467         int32_t cameraType;
1468         CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraPosition, cameraType);
1469         CHECK_RETURN_RET_ELOG(!jsParamParser.AssertStatus(INVALID_ARGUMENT,
1470             "Create cameraInput with 2 invalid arguments!"), nullptr,
1471             "CameraManagerNapi::CreateCameraInputInstance 2 invalid arguments");
1472         ProcessCameraInfo(cameraManagerNapi->cameraManager_, static_cast<const CameraPosition>(cameraPosition),
1473             static_cast<const CameraType>(cameraType), cameraInfo);
1474     } else {
1475         CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "invalid argument.");
1476         return nullptr;
1477     }
1478     if (cameraInfo == nullptr) {
1479         MEDIA_ERR_LOG("cameraInfo is null");
1480         CameraNapiUtils::ThrowError(env, SERVICE_FATL_ERROR, "cameraInfo is null.");
1481         return nullptr;
1482     }
1483     sptr<CameraInput> cameraInput = nullptr;
1484     int retCode = cameraManagerNapi->cameraManager_->CreateCameraInput(cameraInfo, &cameraInput);
1485     if (retCode == CAMERA_NO_PERMISSION) {
1486         CameraNapiUtils::ThrowError(env, OPERATION_NOT_ALLOWED, "not allowed, because have no permission.");
1487         return nullptr;
1488     }
1489     CHECK_RETURN_RET(!CameraNapiUtils::CheckError(env, retCode), nullptr);
1490     return CameraInputNapi::CreateCameraInput(env, cameraInput);
1491 }
1492 
ProcessCameraInfo(sptr<CameraManager> & cameraManager,const CameraPosition cameraPosition,const CameraType cameraType,sptr<CameraDevice> & cameraInfo)1493 void CameraManagerNapi::ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition,
1494     const CameraType cameraType, sptr<CameraDevice>& cameraInfo)
1495 {
1496     std::vector<sptr<CameraDevice>> cameraObjList = cameraManager->GetSupportedCameras();
1497     MEDIA_DEBUG_LOG("cameraInfo is null, the cameraObjList size is %{public}zu", cameraObjList.size());
1498     for (size_t i = 0; i < cameraObjList.size(); i++) {
1499         sptr<CameraDevice> cameraDevice = cameraObjList[i];
1500         if (cameraDevice == nullptr) {
1501             continue;
1502         }
1503         if (cameraDevice->GetPosition() == cameraPosition &&
1504             cameraDevice->GetCameraType() == cameraType) {
1505             cameraInfo = cameraDevice;
1506             break;
1507         }
1508     }
1509 }
1510 
RegisterCameraStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1511 void CameraManagerNapi::RegisterCameraStatusCallbackListener(
1512     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1513 {
1514     auto listener = CameraNapiEventListener<CameraManagerCallbackNapi>::RegisterCallbackListener(
1515         eventName, env, callback, args, isOnce);
1516     CHECK_RETURN_ELOG(
1517         listener == nullptr, "CameraManagerNapi::RegisterCameraStatusCallbackListener listener is null");
1518     cameraManager_->RegisterCameraStatusCallback(listener);
1519 }
1520 
UnregisterCameraStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1521 void CameraManagerNapi::UnregisterCameraStatusCallbackListener(
1522     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1523 {
1524     auto listener =
1525         CameraNapiEventListener<CameraManagerCallbackNapi>::UnregisterCallbackListener(eventName, env, callback, args);
1526     CHECK_RETURN(listener == nullptr);
1527     if (listener->IsEmpty(eventName)) {
1528         cameraManager_->UnregisterCameraStatusCallback(listener);
1529     }
1530 }
1531 
RegisterCameraMuteCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1532 void CameraManagerNapi::RegisterCameraMuteCallbackListener(
1533     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1534 {
1535     CHECK_RETURN_ELOG(!CameraNapiSecurity::CheckSystemApp(env), "SystemApi On cameraMute is called!");
1536     auto listener = CameraNapiEventListener<CameraMuteListenerNapi>::RegisterCallbackListener(
1537         eventName, env, callback, args, isOnce);
1538     CHECK_RETURN_ELOG(
1539         listener == nullptr, "CameraManagerNapi::RegisterCameraMuteCallbackListener listener is null");
1540     cameraManager_->RegisterCameraMuteListener(listener);
1541 }
1542 
UnregisterCameraMuteCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1543 void CameraManagerNapi::UnregisterCameraMuteCallbackListener(
1544     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1545 {
1546     CHECK_RETURN_ELOG(!CameraNapiSecurity::CheckSystemApp(env), "SystemApi On cameraMute is called!");
1547     auto listener =
1548         CameraNapiEventListener<CameraMuteListenerNapi>::UnregisterCallbackListener(eventName, env, callback, args);
1549     CHECK_RETURN(listener == nullptr);
1550     if (listener->IsEmpty(eventName)) {
1551         cameraManager_->UnregisterCameraMuteListener(listener);
1552     }
1553 }
1554 
RegisterTorchStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1555 void CameraManagerNapi::RegisterTorchStatusCallbackListener(
1556     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1557 {
1558     auto listener =
1559         CameraNapiEventListener<TorchListenerNapi>::RegisterCallbackListener(eventName, env, callback, args, isOnce);
1560     CHECK_RETURN_ELOG(
1561         listener == nullptr, "CameraManagerNapi::RegisterTorchStatusCallbackListener listener is null");
1562     cameraManager_->RegisterTorchListener(listener);
1563 }
1564 
UnregisterTorchStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1565 void CameraManagerNapi::UnregisterTorchStatusCallbackListener(
1566     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1567 {
1568     auto listener =
1569         CameraNapiEventListener<TorchListenerNapi>::UnregisterCallbackListener(eventName, env, callback, args);
1570     CHECK_RETURN(listener == nullptr);
1571     if (listener->IsEmpty(eventName)) {
1572         cameraManager_->UnregisterTorchListener(listener);
1573     }
1574 }
1575 
RegisterFoldStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1576 void CameraManagerNapi::RegisterFoldStatusCallbackListener(
1577     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1578 {
1579     auto listener =
1580         CameraNapiEventListener<FoldListenerNapi>::RegisterCallbackListener(eventName, env, callback, args, isOnce);
1581     CHECK_RETURN_ELOG(
1582         listener == nullptr, "CameraManagerNapi::RegisterTorchStatusCallbackListener listener is null");
1583     cameraManager_->RegisterFoldListener(listener);
1584 }
1585 
UnregisterFoldStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1586 void CameraManagerNapi::UnregisterFoldStatusCallbackListener(
1587     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1588 {
1589     auto listener =
1590         CameraNapiEventListener<FoldListenerNapi>::UnregisterCallbackListener(eventName, env, callback, args);
1591     CHECK_RETURN(listener == nullptr);
1592     if (listener->IsEmpty(eventName)) {
1593         cameraManager_->UnregisterFoldListener(listener);
1594     }
1595 }
1596 
RegisterControlCenterStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1597 void CameraManagerNapi::RegisterControlCenterStatusCallbackListener(
1598     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1599 {
1600     MEDIA_INFO_LOG("CameraManagerNapi::RegisterControlCenterStatusCallbackListener is called.");
1601     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1602         MEDIA_ERR_LOG("SystemApi On controlCenterStatus is called!");
1603         return;
1604     }
1605     auto listener = CameraNapiEventListener<ControlCenterStatusListenerNapi>::RegisterCallbackListener(
1606         eventName, env, callback, args, isOnce);
1607     CHECK_RETURN_ELOG(
1608         listener == nullptr, "CameraManagerNapi::RegisterControlCenterStatusCallbackListener listener is null");
1609     cameraManager_->RegisterControlCenterStatusListener(listener);
1610 }
1611 
UnregisterControlCenterStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1612 void CameraManagerNapi::UnregisterControlCenterStatusCallbackListener(
1613     const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1614 {
1615     MEDIA_INFO_LOG("CameraManagerNapi::UnregisterControlCenterStatusCallbackListener is called.");
1616     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1617         MEDIA_ERR_LOG("SystemApi On controlCenterStatus is called!");
1618         return;
1619     }
1620     auto listener = CameraNapiEventListener<ControlCenterStatusListenerNapi>::UnregisterCallbackListener(
1621         eventName, env, callback, args);
1622     CHECK_RETURN(listener == nullptr);
1623     if (listener->IsEmpty(eventName)) {
1624         cameraManager_->UnregisterControlCenterStatusListener(listener);
1625     }
1626 }
1627 
GetEmitterFunctions()1628 const CameraManagerNapi::EmitterFunctions& CameraManagerNapi::GetEmitterFunctions()
1629 {
1630     static const EmitterFunctions funMap = {
1631         { "cameraStatus", {
1632             &CameraManagerNapi::RegisterCameraStatusCallbackListener,
1633             &CameraManagerNapi::UnregisterCameraStatusCallbackListener } },
1634         { "cameraMute", {
1635             &CameraManagerNapi::RegisterCameraMuteCallbackListener,
1636             &CameraManagerNapi::UnregisterCameraMuteCallbackListener } },
1637         { "torchStatusChange", {
1638             &CameraManagerNapi::RegisterTorchStatusCallbackListener,
1639             &CameraManagerNapi::UnregisterTorchStatusCallbackListener } },
1640         { "foldStatusChange", {
1641             &CameraManagerNapi::RegisterFoldStatusCallbackListener,
1642             &CameraManagerNapi::UnregisterFoldStatusCallbackListener } },
1643         { "controlCenterStatusChange", {
1644             &CameraManagerNapi::RegisterControlCenterStatusCallbackListener,
1645             &CameraManagerNapi::UnregisterControlCenterStatusCallbackListener } } };
1646     return funMap;
1647 }
1648 
IsControlCenterActive(napi_env env,napi_callback_info info)1649 napi_value CameraManagerNapi::IsControlCenterActive(napi_env env, napi_callback_info info)
1650 {
1651     MEDIA_INFO_LOG("IsControlCenterActive is called.");
1652     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1653         MEDIA_ERR_LOG("SystemApi IsControlCenterActive is called!");
1654         return nullptr;
1655     }
1656     napi_status status;
1657     napi_value result = nullptr;
1658     size_t argc = ARGS_ZERO;
1659     napi_value argv[ARGS_ZERO];
1660     napi_value thisVar = nullptr;
1661     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1662     napi_get_undefined(env, &result);
1663     CameraManagerNapi* cameraManagerNapi = nullptr;
1664     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1665     if (status == napi_ok && cameraManagerNapi != nullptr) {
1666         bool isControlCenterActive = CameraManager::GetInstance()->IsControlCenterActive();
1667         MEDIA_DEBUG_LOG("isControlCenterActive : %{public}d", isControlCenterActive);
1668         napi_get_boolean(env, isControlCenterActive, &result);
1669     } else {
1670         MEDIA_ERR_LOG("isControlCenterActive call Failed!");
1671     }
1672     return result;
1673 }
1674 
CreateControlCenterSession(napi_env env,napi_callback_info info)1675 napi_value CameraManagerNapi::CreateControlCenterSession(napi_env env, napi_callback_info info)
1676 {
1677     MEDIA_INFO_LOG("CameraManagerNapi::CreateControlCenterSession is called");
1678     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1679         MEDIA_ERR_LOG("SystemApi CreateControlCenterSession is called!");
1680         return nullptr;
1681     }
1682     MEDIA_INFO_LOG("CreateControlCenterSession is called");
1683     napi_status status;
1684     napi_value result = nullptr;
1685     size_t argc = ARGS_ZERO;
1686     napi_value argv[ARGS_ZERO];
1687     napi_value thisVar = nullptr;
1688 
1689     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1690     napi_get_undefined(env, &result);
1691     CameraManagerNapi* cameraManagerNapi = nullptr;
1692     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1693     if (status != napi_ok || cameraManagerNapi == nullptr) {
1694         MEDIA_ERR_LOG("napi_unwrap failure!");
1695         return nullptr;
1696     }
1697     result = ControlCenterSessionNapi::CreateControlCenterSession(env);
1698     return result;
1699 }
1700 
IsPrelaunchSupported(napi_env env,napi_callback_info info)1701 napi_value CameraManagerNapi::IsPrelaunchSupported(napi_env env, napi_callback_info info)
1702 {
1703     MEDIA_INFO_LOG("IsPrelaunchSupported is called");
1704     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env), nullptr,
1705         "SystemApi IsPrelaunchSupported is called!");
1706     CameraManagerNapi* cameraManagerNapi = nullptr;
1707     std::string cameraId {};
1708     CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1709     CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraInfoObj);
1710     CHECK_RETURN_RET_ELOG(!jsParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument!"), nullptr,
1711         "CameraManagerNapi::IsPrelaunchSupported invalid argument");
1712     sptr<CameraDevice> cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1713     if (cameraInfo != nullptr) {
1714         bool isPrelaunchSupported = cameraManagerNapi->cameraManager_->IsPrelaunchSupported(cameraInfo);
1715         MEDIA_DEBUG_LOG("isPrelaunchSupported: %{public}d", isPrelaunchSupported);
1716         napi_value result;
1717         napi_get_boolean(env, isPrelaunchSupported, &result);
1718         return result;
1719     }
1720     MEDIA_ERR_LOG("CameraManagerNapi::IsPrelaunchSupported cameraInfo is null!");
1721     CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "cameraInfo is null.");
1722     return nullptr;
1723 }
1724 
PrelaunchCamera(napi_env env,napi_callback_info info)1725 napi_value CameraManagerNapi::PrelaunchCamera(napi_env env, napi_callback_info info)
1726 {
1727     MEDIA_INFO_LOG("PrelaunchCamera is called");
1728     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env),
1729         nullptr, "SystemApi PrelaunchCamera is called!");
1730     napi_value result = nullptr;
1731     int32_t retCode = 0;
1732     size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
1733     if (napiArgsSize == 1) {
1734         MEDIA_INFO_LOG("PrelaunchCamera arg 1");
1735         size_t argc = ARGS_ONE;
1736         napi_value argv[ARGS_ONE] = {0};
1737         napi_value thisVar = nullptr;
1738         CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1739         int32_t value = 0;
1740         napi_get_value_int32(env, argv[PARAM0], &value);
1741         MEDIA_INFO_LOG("PrelaunchCamera value:%{public}d", value);
1742         retCode = CameraManager::GetInstance()->PrelaunchCamera(value);
1743     } else if (napiArgsSize == 0) {
1744         MEDIA_INFO_LOG("PrelaunchCamera arg 0");
1745         retCode = CameraManager::GetInstance()->PrelaunchCamera();
1746     }
1747     CHECK_RETURN_RET(!CameraNapiUtils::CheckError(env, retCode), result);
1748     MEDIA_INFO_LOG("PrelaunchCamera");
1749     napi_get_undefined(env, &result);
1750     return result;
1751 }
1752 
ResetRssPriority(napi_env env,napi_callback_info info)1753 napi_value CameraManagerNapi::ResetRssPriority(napi_env env, napi_callback_info info)
1754 {
1755     MEDIA_INFO_LOG("ResetRssPriority is called");
1756     if (!CameraNapiSecurity::CheckSystemApp(env)) {
1757         MEDIA_ERR_LOG("SystemApi ResetRssPriority is called!");
1758         return nullptr;
1759     }
1760     napi_value result = nullptr;
1761     int32_t retCode = CameraManager::GetInstance()->ResetRssPriority();
1762     if (!CameraNapiUtils::CheckError(env, retCode)) {
1763         return result;
1764     }
1765     MEDIA_INFO_LOG("ResetRssPriority");
1766     napi_get_undefined(env, &result);
1767     return result;
1768 }
1769 
PreSwitchCamera(napi_env env,napi_callback_info info)1770 napi_value CameraManagerNapi::PreSwitchCamera(napi_env env, napi_callback_info info)
1771 {
1772     MEDIA_INFO_LOG("PreSwitchCamera is called");
1773     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env),
1774         nullptr, "SystemApi PreSwitchCamera is called!");
1775     napi_value result = nullptr;
1776     size_t argc = ARGS_ONE;
1777     napi_value argv[ARGS_ONE] = { 0 };
1778     napi_value thisVar = nullptr;
1779     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1780     NAPI_ASSERT(env, argc < ARGS_TWO, "requires 1 parameters maximum");
1781     char buffer[PATH_MAX];
1782     size_t length;
1783     napi_get_value_string_utf8(env, argv[ARGS_ZERO], buffer, PATH_MAX, &length);
1784     int32_t retCode = CameraManager::GetInstance()->PreSwitchCamera(std::string(buffer));
1785     CHECK_RETURN_RET(!CameraNapiUtils::CheckError(env, retCode), result);
1786     MEDIA_INFO_LOG("PreSwitchCamera");
1787     napi_get_undefined(env, &result);
1788     return result;
1789 }
1790 
SetPrelaunchConfig(napi_env env,napi_callback_info info)1791 napi_value CameraManagerNapi::SetPrelaunchConfig(napi_env env, napi_callback_info info)
1792 {
1793     MEDIA_INFO_LOG("SetPrelaunchConfig is called");
1794     CHECK_RETURN_RET_ELOG(!CameraNapiSecurity::CheckSystemApp(env),
1795         nullptr, "SystemApi SetPrelaunchConfig is called!");
1796 
1797     size_t argc = ARGS_ONE;
1798     napi_value argv[ARGS_ONE] = {0};
1799     napi_value thisVar = nullptr;
1800     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1801     NAPI_ASSERT(env, argc < ARGS_TWO, "requires 1 parameters maximum");
1802     PrelaunchConfig prelaunchConfig;
1803     EffectParam effectParam;
1804     napi_value result = nullptr;
1805 
1806     bool isConfigSuccess = ParsePrelaunchConfig(env, argv[PARAM0], &prelaunchConfig);
1807     CHECK_RETURN_RET_ELOG(!isConfigSuccess, result, "SetPrelaunchConfig failed");
1808     ParseSettingParam(env, argv[PARAM0], &effectParam);
1809     std::string cameraId = prelaunchConfig.GetCameraDevice()->GetID();
1810     MEDIA_INFO_LOG("SetPrelaunchConfig cameraId = %{public}s", cameraId.c_str());
1811 
1812     int32_t retCode = CameraManager::GetInstance()->SetPrelaunchConfig(cameraId,
1813         static_cast<RestoreParamTypeOhos>(prelaunchConfig.restoreParamType), prelaunchConfig.activeTime, effectParam);
1814     CHECK_RETURN_RET(!CameraNapiUtils::CheckError(env, retCode), result);
1815     napi_get_undefined(env, &result);
1816     return result;
1817 }
1818 
IsTorchSupported(napi_env env,napi_callback_info info)1819 napi_value CameraManagerNapi::IsTorchSupported(napi_env env, napi_callback_info info)
1820 {
1821     MEDIA_INFO_LOG("IsTorchSupported is called");
1822     napi_status status;
1823     napi_value result = nullptr;
1824     size_t argc = ARGS_ZERO;
1825     napi_value argv[ARGS_ZERO];
1826     napi_value thisVar = nullptr;
1827 
1828     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1829 
1830     napi_get_undefined(env, &result);
1831     CameraManagerNapi* cameraManagerNapi = nullptr;
1832     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1833     if (status == napi_ok && cameraManagerNapi != nullptr) {
1834         bool isSupported = CameraManager::GetInstance()->IsTorchSupported();
1835         MEDIA_DEBUG_LOG("IsTorchSupported : %{public}d", isSupported);
1836         napi_get_boolean(env, isSupported, &result);
1837     } else {
1838         MEDIA_ERR_LOG("IsTorchSupported call Failed!");
1839     }
1840     return result;
1841 }
1842 
IsTorchModeSupported(napi_env env,napi_callback_info info)1843 napi_value CameraManagerNapi::IsTorchModeSupported(napi_env env, napi_callback_info info)
1844 {
1845     MEDIA_INFO_LOG("IsTorchModeSupported is called");
1846     napi_status status;
1847     napi_value result = nullptr;
1848     napi_value argv[ARGS_ONE];
1849     size_t argc = ARGS_ONE;
1850     napi_value thisVar = nullptr;
1851 
1852     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1853 
1854     napi_get_undefined(env, &result);
1855     CameraManagerNapi* cameraManagerNapi = nullptr;
1856     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1857     if (status == napi_ok && cameraManagerNapi != nullptr) {
1858         int32_t mode;
1859         napi_get_value_int32(env, argv[PARAM0], &mode);
1860         MEDIA_INFO_LOG("CameraManagerNapi::IsTorchModeSupported mode = %{public}d", mode);
1861         TorchMode torchMode = (TorchMode)mode;
1862         bool isTorchModeSupported = CameraManager::GetInstance()->IsTorchModeSupported(torchMode);
1863         MEDIA_DEBUG_LOG("IsTorchModeSupported : %{public}d", isTorchModeSupported);
1864         napi_get_boolean(env, isTorchModeSupported, &result);
1865     } else {
1866         MEDIA_ERR_LOG("GetTorchMode call Failed!");
1867     }
1868     return result;
1869 }
1870 
GetTorchMode(napi_env env,napi_callback_info info)1871 napi_value CameraManagerNapi::GetTorchMode(napi_env env, napi_callback_info info)
1872 {
1873     MEDIA_INFO_LOG("GetTorchMode is called");
1874     napi_status status;
1875     napi_value result = nullptr;
1876     size_t argc = ARGS_ZERO;
1877     napi_value argv[ARGS_ZERO];
1878     napi_value thisVar = nullptr;
1879 
1880     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1881 
1882     napi_get_undefined(env, &result);
1883     CameraManagerNapi* cameraManagerNapi = nullptr;
1884     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1885     if (status == napi_ok && cameraManagerNapi != nullptr) {
1886         TorchMode mode = CameraManager::GetInstance()->GetTorchMode();
1887         MEDIA_DEBUG_LOG("GetTorchMode : %{public}d", mode);
1888         napi_create_int32(env, mode, &result);
1889     } else {
1890         MEDIA_ERR_LOG("GetTorchMode call Failed!");
1891     }
1892     return result;
1893 }
1894 
SetTorchMode(napi_env env,napi_callback_info info)1895 napi_value CameraManagerNapi::SetTorchMode(napi_env env, napi_callback_info info)
1896 {
1897     MEDIA_INFO_LOG("SetTorchMode is called");
1898     napi_status status;
1899     napi_value result = nullptr;
1900     napi_value argv[ARGS_ONE];
1901     size_t argc = ARGS_ONE;
1902     napi_value thisVar = nullptr;
1903 
1904     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1905 
1906     napi_get_undefined(env, &result);
1907     CameraManagerNapi* cameraManagerNapi = nullptr;
1908     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1909     if (status == napi_ok && cameraManagerNapi != nullptr) {
1910         int32_t mode;
1911         napi_get_value_int32(env, argv[PARAM0], &mode);
1912         MEDIA_INFO_LOG("CameraManagerNapi::SetTorchMode mode = %{public}d", mode);
1913         TorchMode torchMode = (TorchMode)mode;
1914         int32_t retCode = CameraManager::GetInstance()->SetTorchMode(torchMode);
1915         if (!CameraNapiUtils::CheckError(env, retCode)) {
1916             MEDIA_DEBUG_LOG("SetTorchMode fail throw error");
1917         }
1918     } else {
1919         MEDIA_ERR_LOG("GetTorchMode call Failed!");
1920     }
1921     return result;
1922 }
1923 
On(napi_env env,napi_callback_info info)1924 napi_value CameraManagerNapi::On(napi_env env, napi_callback_info info)
1925 {
1926     return ListenerTemplate<CameraManagerNapi>::On(env, info);
1927 }
1928 
Once(napi_env env,napi_callback_info info)1929 napi_value CameraManagerNapi::Once(napi_env env, napi_callback_info info)
1930 {
1931     return ListenerTemplate<CameraManagerNapi>::Once(env, info);
1932 }
1933 
Off(napi_env env,napi_callback_info info)1934 napi_value CameraManagerNapi::Off(napi_env env, napi_callback_info info)
1935 {
1936     return ListenerTemplate<CameraManagerNapi>::Off(env, info);
1937 }
1938 } // namespace CameraStandard
1939 } // namespace OHOS