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