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