1 /*
2 * Copyright (c) 2022 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 <vector>
17 #include <new>
18
19 #include <hitrace_meter.h>
20 #include "js_runtime_utils.h"
21 #include "native_engine/native_reference.h"
22 #include "display_manager.h"
23 #include "window_manager_hilog.h"
24 #include "singleton_container.h"
25 #include "js_display_listener.h"
26 #include "js_display.h"
27 #include "js_display_manager.h"
28 #include "screen.h"
29 #include "screen_manager.h"
30 #include "surface_utils.h"
31
32 namespace OHOS {
33 namespace Rosen {
34 using namespace AbilityRuntime;
35 constexpr size_t ARGC_ONE = 1;
36 constexpr size_t ARGC_TWO = 2;
37 constexpr size_t ARGC_THREE = 3;
38 constexpr int32_t INDEX_ONE = 1;
39 namespace {
40 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "JsDisplayManager"};
41 }
42
43 class JsDisplayManager {
44 public:
JsDisplayManager(napi_env env)45 explicit JsDisplayManager(napi_env env) {
46 }
47
48 ~JsDisplayManager() = default;
49
Finalizer(napi_env env,void * data,void * hint)50 static void Finalizer(napi_env env, void* data, void* hint)
51 {
52 WLOGI("Finalizer is called");
53 std::unique_ptr<JsDisplayManager>(static_cast<JsDisplayManager*>(data));
54 }
55
GetDefaultDisplay(napi_env env,napi_callback_info info)56 static napi_value GetDefaultDisplay(napi_env env, napi_callback_info info)
57 {
58 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
59 return (me != nullptr) ? me->OnGetDefaultDisplay(env, info) : nullptr;
60 }
61
GetDefaultDisplaySync(napi_env env,napi_callback_info info)62 static napi_value GetDefaultDisplaySync(napi_env env, napi_callback_info info)
63 {
64 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
65 return (me != nullptr) ? me->OnGetDefaultDisplaySync(env, info) : nullptr;
66 }
67
GetPrimaryDisplaySync(napi_env env,napi_callback_info info)68 static napi_value GetPrimaryDisplaySync(napi_env env, napi_callback_info info)
69 {
70 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
71 return (me != nullptr) ? me->OnGetPrimaryDisplaySync(env, info) : nullptr;
72 }
73
GetDisplayByIdSync(napi_env env,napi_callback_info info)74 static napi_value GetDisplayByIdSync(napi_env env, napi_callback_info info)
75 {
76 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
77 return (me != nullptr) ? me->OnGetDisplayByIdSync(env, info) : nullptr;
78 }
79
GetAllDisplay(napi_env env,napi_callback_info info)80 static napi_value GetAllDisplay(napi_env env, napi_callback_info info)
81 {
82 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
83 return (me != nullptr) ? me->OnGetAllDisplay(env, info) : nullptr;
84 }
85
GetAllDisplayPhysicalResolution(napi_env env,napi_callback_info info)86 static napi_value GetAllDisplayPhysicalResolution(napi_env env, napi_callback_info info)
87 {
88 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
89 return (me != nullptr) ? me->OnGetAllDisplayPhysicalResolution(env, info) : nullptr;
90 }
91
GetAllDisplays(napi_env env,napi_callback_info info)92 static napi_value GetAllDisplays(napi_env env, napi_callback_info info)
93 {
94 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
95 return (me != nullptr) ? me->OnGetAllDisplays(env, info) : nullptr;
96 }
97
RegisterDisplayManagerCallback(napi_env env,napi_callback_info info)98 static napi_value RegisterDisplayManagerCallback(napi_env env, napi_callback_info info)
99 {
100 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
101 return (me != nullptr) ? me->OnRegisterDisplayManagerCallback(env, info) : nullptr;
102 }
103
UnregisterDisplayManagerCallback(napi_env env,napi_callback_info info)104 static napi_value UnregisterDisplayManagerCallback(napi_env env, napi_callback_info info)
105 {
106 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
107 return (me != nullptr) ? me->OnUnregisterDisplayManagerCallback(env, info) : nullptr;
108 }
109
HasPrivateWindow(napi_env env,napi_callback_info info)110 static napi_value HasPrivateWindow(napi_env env, napi_callback_info info)
111 {
112 JsDisplayManager* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
113 return (me != nullptr) ? me->OnHasPrivateWindow(env, info) : nullptr;
114 }
115
IsFoldable(napi_env env,napi_callback_info info)116 static napi_value IsFoldable(napi_env env, napi_callback_info info)
117 {
118 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
119 return (me != nullptr) ? me->OnIsFoldable(env, info) : nullptr;
120 }
121
IsCaptured(napi_env env,napi_callback_info info)122 static napi_value IsCaptured(napi_env env, napi_callback_info info)
123 {
124 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
125 return (me != nullptr) ? me->OnIsCaptured(env, info) : nullptr;
126 }
127
GetFoldStatus(napi_env env,napi_callback_info info)128 static napi_value GetFoldStatus(napi_env env, napi_callback_info info)
129 {
130 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
131 return (me != nullptr) ? me->OnGetFoldStatus(env, info) : nullptr;
132 }
133
GetFoldDisplayMode(napi_env env,napi_callback_info info)134 static napi_value GetFoldDisplayMode(napi_env env, napi_callback_info info)
135 {
136 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
137 return (me != nullptr) ? me->OnGetFoldDisplayMode(env, info) : nullptr;
138 }
139
SetFoldDisplayMode(napi_env env,napi_callback_info info)140 static napi_value SetFoldDisplayMode(napi_env env, napi_callback_info info)
141 {
142 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
143 return (me != nullptr) ? me->OnSetFoldDisplayMode(env, info) : nullptr;
144 }
145
SetFoldStatusLocked(napi_env env,napi_callback_info info)146 static napi_value SetFoldStatusLocked(napi_env env, napi_callback_info info)
147 {
148 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
149 return (me != nullptr) ? me->OnSetFoldStatusLocked(env, info) : nullptr;
150 }
151
GetCurrentFoldCreaseRegion(napi_env env,napi_callback_info info)152 static napi_value GetCurrentFoldCreaseRegion(napi_env env, napi_callback_info info)
153 {
154 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
155 return (me != nullptr) ? me->OnGetCurrentFoldCreaseRegion(env, info) : nullptr;
156 }
157
CreateVirtualScreen(napi_env env,napi_callback_info info)158 static napi_value CreateVirtualScreen(napi_env env, napi_callback_info info)
159 {
160 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
161 return (me != nullptr) ? me->OnCreateVirtualScreen(env, info) : nullptr;
162 }
163
MakeUnique(napi_env env,napi_callback_info info)164 static napi_value MakeUnique(napi_env env, napi_callback_info info)
165 {
166 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
167 return (me != nullptr) ? me->OnMakeUnique(env, info) : nullptr;
168 }
169
DestroyVirtualScreen(napi_env env,napi_callback_info info)170 static napi_value DestroyVirtualScreen(napi_env env, napi_callback_info info)
171 {
172 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
173 return (me != nullptr) ? me->OnDestroyVirtualScreen(env, info) : nullptr;
174 }
175
SetVirtualScreenSurface(napi_env env,napi_callback_info info)176 static napi_value SetVirtualScreenSurface(napi_env env, napi_callback_info info)
177 {
178 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
179 return (me != nullptr) ? me->OnSetVirtualScreenSurface(env, info) : nullptr;
180 }
181
AddVirtualScreenBlockList(napi_env env,napi_callback_info info)182 static napi_value AddVirtualScreenBlockList(napi_env env, napi_callback_info info)
183 {
184 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
185 return (me != nullptr) ? me->OnAddVirtualScreenBlockList(env, info) : nullptr;
186 }
187
RemoveVirtualScreenBlockList(napi_env env,napi_callback_info info)188 static napi_value RemoveVirtualScreenBlockList(napi_env env, napi_callback_info info)
189 {
190 auto* me = CheckParamsAndGetThis<JsDisplayManager>(env, info);
191 return (me != nullptr) ? me->OnRemoveVirtualScreenBlockList(env, info) : nullptr;
192 }
193
194 private:
195 std::map<std::string, std::map<std::unique_ptr<NativeReference>, sptr<JsDisplayListener>>> jsCbMap_;
196 std::mutex mtx_;
197
OnGetDefaultDisplay(napi_env env,napi_callback_info info)198 napi_value OnGetDefaultDisplay(napi_env env, napi_callback_info info)
199 {
200 WLOGI("GetDefaultDisplay called");
201 DMError errCode = DMError::DM_OK;
202 size_t argc = 4;
203 napi_value argv[4] = {nullptr};
204 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
205 if (argc != 0 && argc != ARGC_ONE) {
206 WLOGFE("OnGetDefaultDisplay params not match");
207 errCode = DMError::DM_ERROR_INVALID_PARAM;
208 }
209
210 napi_value lastParam = nullptr;
211 if (argc == ARGC_ONE && GetType(env, argv[0]) == napi_function) {
212 lastParam = argv[0];
213 }
214 napi_value result = nullptr;
215 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
216 auto asyncTask = [this, env, errCode, task = napiAsyncTask.get()] {
217 if (errCode != DMError::DM_OK) {
218 task->Reject(env, CreateJsError(env,
219 static_cast<int32_t>(errCode), "JsDisplayManager::OnGetDefaultDisplay failed."));
220 delete task;
221 return;
222 }
223 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "Async:GetDefaultDisplay");
224 sptr<Display> display = SingletonContainer::Get<DisplayManager>().GetDefaultDisplay();
225 if (display != nullptr) {
226 task->Resolve(env, CreateJsDisplayObject(env, display));
227 WLOGI("OnGetDefaultDisplay success");
228 } else {
229 task->Reject(env, CreateJsError(env,
230 static_cast<int32_t>(DMError::DM_ERROR_NULLPTR), "JsDisplayManager::OnGetDefaultDisplay failed."));
231 }
232 delete task;
233 };
234 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnGetDefaultDisplay");
235 return result;
236 }
237
OnGetPrimaryDisplaySync(napi_env env,napi_callback_info info)238 napi_value OnGetPrimaryDisplaySync(napi_env env, napi_callback_info info)
239 {
240 WLOGD("OnGetPrimaryDisplaySync called");
241 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "Sync:OnGetPrimaryDisplaySync");
242 sptr<Display> display = SingletonContainer::Get<DisplayManager>().GetPrimaryDisplaySync();
243 if (display == nullptr) {
244 WLOGFE("[NAPI]Display info is nullptr, js error will be happen");
245 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN),
246 "invalid screen id"));
247 return NapiGetUndefined(env);
248 }
249 return CreateJsDisplayObject(env, display);
250 }
251
OnGetDefaultDisplaySync(napi_env env,napi_callback_info info)252 napi_value OnGetDefaultDisplaySync(napi_env env, napi_callback_info info)
253 {
254 WLOGD("GetDefaultDisplaySync called");
255 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "Sync:GetDefaultDisplay");
256 sptr<Display> display = SingletonContainer::Get<DisplayManager>().GetDefaultDisplaySync(true);
257 if (display == nullptr) {
258 WLOGFE("[NAPI]Display info is nullptr, js error will be happen");
259 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN)));
260 return NapiGetUndefined(env);
261 }
262 return CreateJsDisplayObject(env, display);
263 }
264
OnGetDisplayByIdSync(napi_env env,napi_callback_info info)265 napi_value OnGetDisplayByIdSync(napi_env env, napi_callback_info info)
266 {
267 TLOGD(WmsLogTag::DMS, "OnGetDisplayByIdSync called");
268 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "Sync:OnGetDisplayByIdSync");
269 size_t argc = 4;
270 napi_value argv[4] = {nullptr};
271 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
272 if (argc < ARGC_ONE) {
273 WLOGFE("Params not match %{public}zu", argc);
274 std::string errMsg = "Invalid args count, need one arg";
275 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
276 return NapiGetUndefined(env);
277 }
278 int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
279 if (!ConvertFromJsValue(env, argv[0], displayId)) {
280 TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to displayId");
281 std::string errMsg = "Failed to convert parameter to displayId";
282 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
283 return NapiGetUndefined(env);
284 }
285 if (displayId < 0) {
286 std::string errMsg = "displayid is invalid, less than 0";
287 TLOGE(WmsLogTag::DMS, "[NAPI]Invalid displayId: %{public}" PRId64", less than 0", displayId);
288 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
289 return NapiGetUndefined(env);
290 }
291 sptr<Display> display = SingletonContainer::Get<DisplayManager>().GetDisplayById(static_cast<DisplayId>(displayId));
292 if (display == nullptr) {
293 TLOGE(WmsLogTag::DMS, "[NAPI]Display info is nullptr, js error will be happen");
294 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_SYSTEM_INNORMAL)));
295 return NapiGetUndefined(env);
296 }
297 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "Sync:OnGetDisplayByIdSync end");
298 return CreateJsDisplayObject(env, display);
299 }
300
OnGetAllDisplay(napi_env env,napi_callback_info info)301 napi_value OnGetAllDisplay(napi_env env, napi_callback_info info)
302 {
303 WLOGD("GetAllDisplay called");
304 DMError errCode = DMError::DM_OK;
305 size_t argc = 4;
306 napi_value argv[4] = {nullptr};
307 std::string taskName = "OnGetAllDisplay";
308 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
309 if (argc != 0 && argc != ARGC_ONE) {
310 WLOGFE("OnGetAllDisplay params not match");
311 errCode = DMError::DM_ERROR_INVALID_PARAM;
312 return NapiGetUndefined(env);
313 }
314 napi_value lastParam = nullptr;
315 if (argc == ARGC_ONE && GetType(env, argv[0]) == napi_function) {
316 lastParam = argv[0];
317 }
318 napi_value result = nullptr;
319 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
320 auto asyncTask = [this, env, task = napiAsyncTask.get()]() {
321 std::vector<sptr<Display>> displays = SingletonContainer::Get<DisplayManager>().GetAllDisplays();
322 if (!displays.empty()) {
323 task->Resolve(env, CreateJsDisplayArrayObject(env, displays));
324 WLOGI("GetAllDisplays success");
325 } else {
326 task->Reject(env, CreateJsError(env,
327 static_cast<int32_t>(DMError::DM_ERROR_NULLPTR), "JsDisplayManager::OnGetAllDisplay failed."));
328 }
329 delete task;
330 };
331 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, taskName);
332 return result;
333 }
334
NapiSendDmsEvent(napi_env env,std::function<void ()> asyncTask,std::unique_ptr<AbilityRuntime::NapiAsyncTask> & napiAsyncTask,std::string taskName)335 void NapiSendDmsEvent(napi_env env, std::function<void()> asyncTask,
336 std::unique_ptr<AbilityRuntime::NapiAsyncTask>& napiAsyncTask, std::string taskName)
337 {
338 if (!env) {
339 WLOGFE("env is null");
340 return;
341 }
342 if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_immediate)) {
343 napiAsyncTask->Reject(env, CreateJsError(env,
344 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN), "Send event failed!"));
345 } else {
346 napiAsyncTask.release();
347 WLOGFI("%{public}s:send event success", taskName.c_str());
348 }
349 }
350
CreateEmptyAsyncTask(napi_env env,napi_value lastParam,napi_value * result)351 std::unique_ptr<NapiAsyncTask> CreateEmptyAsyncTask(napi_env env, napi_value lastParam, napi_value* result)
352 {
353 napi_valuetype type = napi_undefined;
354 napi_typeof(env, lastParam, &type);
355 if (lastParam == nullptr || type != napi_function) {
356 napi_deferred nativeDeferred = nullptr;
357 napi_create_promise(env, &nativeDeferred, result);
358 return std::make_unique<NapiAsyncTask>(nativeDeferred, std::unique_ptr<NapiAsyncTask::ExecuteCallback>(),
359 std::unique_ptr<NapiAsyncTask::CompleteCallback>());
360 } else {
361 napi_get_undefined(env, result);
362 napi_ref callbackRef = nullptr;
363 napi_create_reference(env, lastParam, 1, &callbackRef);
364 return std::make_unique<NapiAsyncTask>(callbackRef, std::unique_ptr<NapiAsyncTask::ExecuteCallback>(),
365 std::unique_ptr<NapiAsyncTask::CompleteCallback>());
366 }
367 }
368
CreateJsDisplayPhysicalArrayObject(napi_env env,const std::vector<DisplayPhysicalResolution> & physicalArray)369 napi_value CreateJsDisplayPhysicalArrayObject(napi_env env,
370 const std::vector<DisplayPhysicalResolution>& physicalArray)
371 {
372 WLOGD("CreateJsDisplayPhysicalArrayObject is called");
373 napi_value arrayValue = nullptr;
374 napi_create_array_with_length(env, physicalArray.size(), &arrayValue);
375 if (arrayValue == nullptr) {
376 WLOGFE("Failed to create display array");
377 return NapiGetUndefined(env);
378 }
379 int32_t i = 0;
380 for (const auto& displayItem : physicalArray) {
381 napi_set_element(env, arrayValue, i++, CreateJsDisplayPhysicalInfoObject(env, displayItem));
382 }
383 return arrayValue;
384 }
385
OnGetAllDisplayPhysicalResolution(napi_env env,napi_callback_info info)386 napi_value OnGetAllDisplayPhysicalResolution(napi_env env, napi_callback_info info)
387 {
388 WLOGD("OnGetAllDisplayPhysicalResolution called");
389 DMError errCode = DMError::DM_OK;
390 size_t argc = 4;
391 napi_value argv[4] = {nullptr};
392 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
393 if (argc != 0 && argc != ARGC_ONE) {
394 WLOGFE("params not match");
395 errCode = DMError::DM_ERROR_INVALID_PARAM;
396 }
397
398 napi_value lastParam = nullptr;
399 if (argc == ARGC_ONE && GetType(env, argv[0]) == napi_function) {
400 lastParam = argv[0];
401 }
402 napi_value result = nullptr;
403 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
404 auto asyncTask = [this, env, errCode, task = napiAsyncTask.get()] {
405 if (errCode != DMError::DM_OK) {
406 task->Reject(env, CreateJsError(env,
407 static_cast<int32_t>(errCode), "JsDisplayManager::OnGetAllDisplayPhysicalResolution failed."));
408 delete task;
409 return;
410 }
411 std::vector<DisplayPhysicalResolution> displayPhysicalArray =
412 SingletonContainer::Get<DisplayManager>().GetAllDisplayPhysicalResolution();
413 if (!displayPhysicalArray.empty()) {
414 task->Resolve(env, CreateJsDisplayPhysicalArrayObject(env, displayPhysicalArray));
415 WLOGI("OnGetAllDisplayPhysicalResolution success");
416 } else {
417 task->Reject(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_SYSTEM_INNORMAL),
418 "JsDisplayManager::OnGetAllDisplayPhysicalResolution failed."));
419 }
420 delete task;
421 };
422 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnGetAllDisplayPhysicalResolution");
423 return result;
424 }
425
OnGetAllDisplays(napi_env env,napi_callback_info info)426 napi_value OnGetAllDisplays(napi_env env, napi_callback_info info)
427 {
428 WLOGD("OnGetAllDisplays is called");
429 size_t argc = 4;
430 napi_value argv[4] = {nullptr};
431 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
432 napi_value lastParam = nullptr;
433 if (argc >= ARGC_ONE && argv[ARGC_ONE - 1] != nullptr &&
434 GetType(env, argv[ARGC_ONE - 1]) == napi_function) {
435 lastParam = argv[0];
436 }
437 napi_value result = nullptr;
438 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
439 auto asyncTask = [this, env, task = napiAsyncTask.get()] {
440 std::vector<sptr<Display>> displays = SingletonContainer::Get<DisplayManager>().GetAllDisplays();
441 if (!displays.empty()) {
442 task->Resolve(env, CreateJsDisplayArrayObject(env, displays));
443 WLOGD("GetAllDisplays success");
444 } else {
445 auto errorPending = false;
446 napi_is_exception_pending(env, &errorPending);
447 if (errorPending) {
448 napi_value exception = nullptr;
449 napi_get_and_clear_last_exception(env, &exception);
450 }
451 task->Reject(env, CreateJsError(env,
452 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN),
453 "JsDisplayManager::OnGetAllDisplays failed."));
454 }
455 delete task;
456 };
457 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnGetDefaultDisplay");
458 return result;
459 }
460
RegisterDisplayListenerWithType(napi_env env,const std::string & type,napi_value value)461 DMError RegisterDisplayListenerWithType(napi_env env, const std::string& type, napi_value value)
462 {
463 if (IfCallbackRegistered(env, type, value)) {
464 WLOGFE("RegisterDisplayListenerWithType callback already registered!");
465 return DMError::DM_OK;
466 }
467 std::unique_ptr<NativeReference> callbackRef;
468 napi_ref result = nullptr;
469 napi_create_reference(env, value, 1, &result);
470 callbackRef.reset(reinterpret_cast<NativeReference*>(result));
471 sptr<JsDisplayListener> displayListener = new(std::nothrow) JsDisplayListener(env);
472 DMError ret = DMError::DM_OK;
473 if (displayListener == nullptr) {
474 WLOGFE("displayListener is nullptr");
475 return DMError::DM_ERROR_INVALID_PARAM;
476 }
477 if (type == EVENT_ADD || type == EVENT_REMOVE || type == EVENT_CHANGE) {
478 ret = SingletonContainer::Get<DisplayManager>().RegisterDisplayListener(displayListener);
479 } else if (type == EVENT_PRIVATE_MODE_CHANGE) {
480 ret = SingletonContainer::Get<DisplayManager>().RegisterPrivateWindowListener(displayListener);
481 } else if (type == EVENT_FOLD_STATUS_CHANGED) {
482 ret = SingletonContainer::Get<DisplayManager>().RegisterFoldStatusListener(displayListener);
483 } else if (type == EVENT_DISPLAY_MODE_CHANGED) {
484 ret = SingletonContainer::Get<DisplayManager>().RegisterDisplayModeListener(displayListener);
485 } else if (type == EVENT_AVAILABLE_AREA_CHANGED) {
486 ret = SingletonContainer::Get<DisplayManager>().RegisterAvailableAreaListener(displayListener);
487 } else if (type == EVENT_FOLD_ANGLE_CHANGED) {
488 ret = SingletonContainer::Get<DisplayManager>().RegisterFoldAngleListener(displayListener);
489 } else if (type == EVENT_CAPTURE_STATUS_CHANGED) {
490 ret = SingletonContainer::Get<DisplayManager>().RegisterCaptureStatusListener(displayListener);
491 } else {
492 WLOGFE("RegisterDisplayListenerWithType failed, %{public}s not support", type.c_str());
493 return DMError::DM_ERROR_INVALID_PARAM;
494 }
495 if (ret != DMError::DM_OK) {
496 WLOGFE("RegisterDisplayListenerWithType failed, ret: %{public}u", ret);
497 return ret;
498 }
499 displayListener->AddCallback(type, value);
500 jsCbMap_[type][std::move(callbackRef)] = displayListener;
501 return DMError::DM_OK;
502 }
503
IfCallbackRegistered(napi_env env,const std::string & type,napi_value jsListenerObject)504 bool IfCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject)
505 {
506 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
507 WLOGI("IfCallbackRegistered methodName %{public}s not registered!", type.c_str());
508 return false;
509 }
510
511 for (auto& iter : jsCbMap_[type]) {
512 bool isEquals = false;
513 napi_strict_equals(env, jsListenerObject, iter.first->GetNapiValue(), &isEquals);
514 if (isEquals) {
515 WLOGFE("IfCallbackRegistered callback already registered!");
516 return true;
517 }
518 }
519 return false;
520 }
521
UnregisterAllDisplayListenerWithType(const std::string & type)522 DMError UnregisterAllDisplayListenerWithType(const std::string& type)
523 {
524 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
525 WLOGI("UnregisterAllDisplayListenerWithType methodName %{public}s not registered!",
526 type.c_str());
527 return DMError::DM_OK;
528 }
529 DMError ret = DMError::DM_OK;
530 for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
531 it->second->RemoveAllCallback();
532 if (type == EVENT_ADD || type == EVENT_REMOVE || type == EVENT_CHANGE) {
533 sptr<DisplayManager::IDisplayListener> thisListener(it->second);
534 ret = SingletonContainer::Get<DisplayManager>().UnregisterDisplayListener(thisListener);
535 } else if (type == EVENT_PRIVATE_MODE_CHANGE) {
536 sptr<DisplayManager::IPrivateWindowListener> thisListener(it->second);
537 ret = SingletonContainer::Get<DisplayManager>().UnregisterPrivateWindowListener(thisListener);
538 } else if (type == EVENT_AVAILABLE_AREA_CHANGED) {
539 sptr<DisplayManager::IAvailableAreaListener> thisListener(it->second);
540 ret = SingletonContainer::Get<DisplayManager>().UnregisterAvailableAreaListener(thisListener);
541 } else if (type == EVENT_FOLD_STATUS_CHANGED) {
542 sptr<DisplayManager::IFoldStatusListener> thisListener(it->second);
543 ret = SingletonContainer::Get<DisplayManager>().UnregisterFoldStatusListener(thisListener);
544 } else if (type == EVENT_DISPLAY_MODE_CHANGED) {
545 sptr<DisplayManager::IDisplayModeListener> thisListener(it->second);
546 ret = SingletonContainer::Get<DisplayManager>().UnregisterDisplayModeListener(thisListener);
547 } else if (type == EVENT_FOLD_ANGLE_CHANGED) {
548 sptr<DisplayManager::IFoldAngleListener> thisListener(it->second);
549 ret = SingletonContainer::Get<DisplayManager>().UnregisterFoldAngleListener(thisListener);
550 } else if (type == EVENT_CAPTURE_STATUS_CHANGED) {
551 sptr<DisplayManager::ICaptureStatusListener> thisListener(it->second);
552 ret = SingletonContainer::Get<DisplayManager>().UnregisterCaptureStatusListener(thisListener);
553 } else {
554 ret = DMError::DM_ERROR_INVALID_PARAM;
555 }
556 jsCbMap_[type].erase(it++);
557 WLOGFI("unregister display listener with type %{public}s ret: %{public}u", type.c_str(), ret);
558 }
559 jsCbMap_.erase(type);
560 return ret;
561 }
562
UnRegisterDisplayListenerWithType(napi_env env,const std::string & type,napi_value value)563 DMError UnRegisterDisplayListenerWithType(napi_env env, const std::string& type, napi_value value)
564 {
565 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
566 WLOGI("UnRegisterDisplayListenerWithType methodName %{public}s not registered!", type.c_str());
567 return DMError::DM_OK;
568 }
569 DMError ret = DMError::DM_OK;
570 for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
571 bool isEquals = false;
572 napi_strict_equals(env, value, it->first->GetNapiValue(), &isEquals);
573 if (isEquals) {
574 it->second->RemoveCallback(env, type, value);
575 if (type == EVENT_ADD || type == EVENT_REMOVE || type == EVENT_CHANGE) {
576 sptr<DisplayManager::IDisplayListener> thisListener(it->second);
577 ret = SingletonContainer::Get<DisplayManager>().UnregisterDisplayListener(thisListener);
578 } else if (type == EVENT_PRIVATE_MODE_CHANGE) {
579 sptr<DisplayManager::IPrivateWindowListener> thisListener(it->second);
580 ret = SingletonContainer::Get<DisplayManager>().UnregisterPrivateWindowListener(thisListener);
581 } else if (type == EVENT_AVAILABLE_AREA_CHANGED) {
582 sptr<DisplayManager::IAvailableAreaListener> thisListener(it->second);
583 ret = SingletonContainer::Get<DisplayManager>().UnregisterAvailableAreaListener(thisListener);
584 } else if (type == EVENT_FOLD_STATUS_CHANGED) {
585 sptr<DisplayManager::IFoldStatusListener> thisListener(it->second);
586 ret = SingletonContainer::Get<DisplayManager>().UnregisterFoldStatusListener(thisListener);
587 } else if (type == EVENT_DISPLAY_MODE_CHANGED) {
588 sptr<DisplayManager::IDisplayModeListener> thisListener(it->second);
589 ret = SingletonContainer::Get<DisplayManager>().UnregisterDisplayModeListener(thisListener);
590 } else if (type == EVENT_FOLD_ANGLE_CHANGED) {
591 sptr<DisplayManager::IFoldAngleListener> thisListener(it->second);
592 ret = SingletonContainer::Get<DisplayManager>().UnregisterFoldAngleListener(thisListener);
593 } else if (type == EVENT_CAPTURE_STATUS_CHANGED) {
594 sptr<DisplayManager::ICaptureStatusListener> thisListener(it->second);
595 ret = SingletonContainer::Get<DisplayManager>().UnregisterCaptureStatusListener(thisListener);
596 } else {
597 ret = DMError::DM_ERROR_INVALID_PARAM;
598 }
599 jsCbMap_[type].erase(it++);
600 WLOGFI("unregister display listener with type %{public}s ret: %{public}u", type.c_str(), ret);
601 break;
602 } else {
603 it++;
604 }
605 }
606 if (jsCbMap_[type].empty()) {
607 jsCbMap_.erase(type);
608 }
609 return ret;
610 }
611
NapiIsCallable(napi_env env,napi_value value)612 bool NapiIsCallable(napi_env env, napi_value value)
613 {
614 bool result = false;
615 napi_is_callable(env, value, &result);
616 return result;
617 }
618
OnRegisterDisplayManagerCallback(napi_env env,napi_callback_info info)619 napi_value OnRegisterDisplayManagerCallback(napi_env env, napi_callback_info info)
620 {
621 WLOGD("OnRegisterDisplayManagerCallback is called");
622 size_t argc = 4;
623 napi_value argv[4] = {nullptr};
624 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
625 if (argc < ARGC_TWO) {
626 WLOGFE("JsDisplayManager Params not match: %{public}zu", argc);
627 std::string errMsg = "Invalid args count, need 2 args";
628 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
629 return NapiGetUndefined(env);
630 }
631 std::string cbType;
632 if (!ConvertFromJsValue(env, argv[0], cbType)) {
633 std::string errMsg = "Failed to convert parameter to callbackType";
634 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
635 WLOGFE("Failed to convert parameter to callbackType");
636 return NapiGetUndefined(env);
637 }
638 napi_value value = argv[INDEX_ONE];
639 if (value == nullptr) {
640 WLOGI("OnRegisterDisplayManagerCallback info->argv[1] is nullptr");
641 std::string errMsg = "OnRegisterDisplayManagerCallback is nullptr";
642 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
643 return NapiGetUndefined(env);
644 }
645 if (!NapiIsCallable(env, value)) {
646 WLOGI("OnRegisterDisplayManagerCallback info->argv[1] is not callable");
647 std::string errMsg = "OnRegisterDisplayManagerCallback is not callable";
648 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
649 return NapiGetUndefined(env);
650 }
651 std::lock_guard<std::mutex> lock(mtx_);
652 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(RegisterDisplayListenerWithType(env, cbType, value));
653 if (ret != DmErrorCode::DM_OK) {
654 DmErrorCode errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
655 if (ret == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) {
656 errCode = ret;
657 }
658 WLOGFE("Failed to register display listener with type");
659 std::string errMsg = "Failed to register display listener with type";
660 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode), errMsg));
661 return NapiGetUndefined(env);
662 }
663 return NapiGetUndefined(env);
664 }
665
OnUnregisterDisplayManagerCallback(napi_env env,napi_callback_info info)666 napi_value OnUnregisterDisplayManagerCallback(napi_env env, napi_callback_info info)
667 {
668 WLOGI("OnUnregisterDisplayCallback is called");
669 size_t argc = 4;
670 napi_value argv[4] = {nullptr};
671 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
672 if (argc < ARGC_ONE) {
673 WLOGFE("JsDisplayManager Params not match %{public}zu", argc);
674 std::string errMsg = "Invalid args count, need one arg at least!";
675 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
676 return NapiGetUndefined(env);
677 }
678 std::string cbType;
679 if (!ConvertFromJsValue(env, argv[0], cbType)) {
680 WLOGFE("Failed to convert parameter to callbackType");
681 std::string errMsg = "Failed to convert parameter to string";
682 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
683 return NapiGetUndefined(env);
684 }
685 std::lock_guard<std::mutex> lock(mtx_);
686 DmErrorCode ret;
687 if (argc == ARGC_ONE) {
688 ret = DM_JS_TO_ERROR_CODE_MAP.at(UnregisterAllDisplayListenerWithType(cbType));
689 } else {
690 napi_value value = argv[INDEX_ONE];
691 if ((value == nullptr) || (!NapiIsCallable(env, value))) {
692 ret = DM_JS_TO_ERROR_CODE_MAP.at(UnregisterAllDisplayListenerWithType(cbType));
693 } else {
694 ret = DM_JS_TO_ERROR_CODE_MAP.at(UnRegisterDisplayListenerWithType(env, cbType, value));
695 }
696 }
697 if (ret != DmErrorCode::DM_OK) {
698 DmErrorCode errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
699 if (ret == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) {
700 errCode = ret;
701 }
702 WLOGFW("failed to unregister display listener with type");
703 std::string errMsg = "failed to unregister display listener with type";
704 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode), errMsg));
705 return NapiGetUndefined(env);
706 }
707 return NapiGetUndefined(env);
708 }
709
OnHasPrivateWindow(napi_env env,napi_callback_info info)710 napi_value OnHasPrivateWindow(napi_env env, napi_callback_info info)
711 {
712 bool hasPrivateWindow = false;
713 size_t argc = 4;
714 napi_value argv[4] = {nullptr};
715 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
716 if (argc < ARGC_ONE) {
717 WLOGFE("Params not match %{public}zu", argc);
718 std::string errMsg = "Invalid args count, need one arg";
719 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
720 return NapiGetUndefined(env);
721 }
722 int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
723 if (!ConvertFromJsValue(env, argv[0], displayId)) {
724 WLOGFE("[NAPI]Failed to convert parameter to displayId");
725 std::string errMsg = "Failed to convert parameter to displayId";
726 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
727 return NapiGetUndefined(env);
728 }
729 if (displayId < 0) {
730 TLOGE(WmsLogTag::DMS, "[NAPI]Invalid displayId: %{public}" PRId64", less than 0", displayId);
731 std::string errMsg = "displayid is invalid, less than 0";
732 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
733 return NapiGetUndefined(env);
734 }
735 DmErrorCode errCode = DM_JS_TO_ERROR_CODE_MAP.at(
736 SingletonContainer::Get<DisplayManager>().HasPrivateWindow(displayId, hasPrivateWindow));
737 WLOGI("[NAPI]Display id = %{public}" PRIu64", hasPrivateWindow = %{public}u err = %{public}d",
738 static_cast<uint64_t>(displayId), hasPrivateWindow, errCode);
739 if (errCode != DmErrorCode::DM_OK) {
740 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode)));
741 return NapiGetUndefined(env);
742 }
743 napi_value result;
744 napi_get_boolean(env, hasPrivateWindow, &result);
745 return result;
746 }
747
CreateJsDisplayArrayObject(napi_env env,std::vector<sptr<Display>> & displays)748 napi_value CreateJsDisplayArrayObject(napi_env env, std::vector<sptr<Display>>& displays)
749 {
750 WLOGD("CreateJsDisplayArrayObject is called");
751 napi_value arrayValue = nullptr;
752 napi_create_array_with_length(env, displays.size(), &arrayValue);
753 if (arrayValue == nullptr) {
754 WLOGFE("Failed to create display array");
755 return NapiGetUndefined(env);
756 }
757 int32_t i = 0;
758 for (auto& display : displays) {
759 if (display == nullptr) {
760 continue;
761 }
762 napi_set_element(env, arrayValue, i++, CreateJsDisplayObject(env, display));
763 }
764 return arrayValue;
765 }
766
OnIsFoldable(napi_env env,napi_callback_info info)767 napi_value OnIsFoldable(napi_env env, napi_callback_info info)
768 {
769 size_t argc = 4;
770 napi_value argv[4] = {nullptr};
771 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
772 if (argc >= ARGC_ONE) {
773 WLOGFE("Params not match %{public}zu", argc);
774 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
775 return NapiGetUndefined(env);
776 }
777 bool foldable = SingletonContainer::Get<DisplayManager>().IsFoldable();
778 WLOGD("[NAPI]" PRIu64", isFoldable = %{public}u", foldable);
779 napi_value result;
780 napi_get_boolean(env, foldable, &result);
781 return result;
782 }
783
OnIsCaptured(napi_env env,napi_callback_info info)784 napi_value OnIsCaptured(napi_env env, napi_callback_info info)
785 {
786 size_t argc = 4; // default arg length
787 napi_value argv[4] = { nullptr }; // default arg length
788 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
789 if (argc >= ARGC_ONE) {
790 WLOGFE("Params not match %{public}zu", argc);
791 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
792 return NapiGetUndefined(env);
793 }
794 bool isCapture = SingletonContainer::Get<DisplayManager>().IsCaptured();
795 WLOGD("[NAPI]" PRIu64", IsCaptured = %{public}u", isCapture);
796 napi_value result;
797 napi_get_boolean(env, isCapture, &result);
798 return result;
799 }
800
OnGetFoldStatus(napi_env env,napi_callback_info info)801 napi_value OnGetFoldStatus(napi_env env, napi_callback_info info)
802 {
803 size_t argc = 4;
804 napi_value argv[4] = {nullptr};
805 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
806 if (argc >= ARGC_ONE) {
807 WLOGFE("Params not match %{public}zu", argc);
808 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
809 return NapiGetUndefined(env);
810 }
811 FoldStatus status = SingletonContainer::Get<DisplayManager>().GetFoldStatus();
812 WLOGD("[NAPI]" PRIu64", getFoldStatus = %{public}u", status);
813 return CreateJsValue(env, status);
814 }
815
OnGetFoldDisplayMode(napi_env env,napi_callback_info info)816 napi_value OnGetFoldDisplayMode(napi_env env, napi_callback_info info)
817 {
818 size_t argc = 4;
819 napi_value argv[4] = {nullptr};
820 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
821 if (argc >= ARGC_ONE) {
822 WLOGFE("Params not match %{public}zu", argc);
823 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
824 return NapiGetUndefined(env);
825 }
826 FoldDisplayMode mode = SingletonContainer::Get<DisplayManager>().GetFoldDisplayModeForExternal();
827 WLOGD("[NAPI]" PRIu64", getFoldDisplayMode = %{public}u", mode);
828 return CreateJsValue(env, mode);
829 }
830
OnSetFoldDisplayMode(napi_env env,napi_callback_info info)831 napi_value OnSetFoldDisplayMode(napi_env env, napi_callback_info info)
832 {
833 size_t argc = 4;
834 napi_value argv[4] = {nullptr};
835 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
836 if (argc < ARGC_ONE) {
837 WLOGFE("Params not match %{public}zu", argc);
838 std::string errMsg = "Invalid args count, need one arg";
839 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
840 return NapiGetUndefined(env);
841 }
842 FoldDisplayMode mode = FoldDisplayMode::UNKNOWN;
843 if (!ConvertFromJsValue(env, argv[0], mode)) {
844 WLOGFE("[NAPI]Failed to convert parameter to FoldDisplayMode");
845 std::string errMsg = "Failed to convert parameter to FoldDisplayMode";
846 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
847 return NapiGetUndefined(env);
848 }
849 std::string reason = "";
850 if (argc == ARGC_TWO) {
851 if (!ConvertFromJsValue(env, argv[INDEX_ONE], reason)) {
852 WLOGFE("[NAPI]Failed to convert parameter to reason");
853 std::string errMsg = "Failed to convert parameter to reason";
854 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
855 return NapiGetUndefined(env);
856 }
857 }
858 DmErrorCode errCode = DM_JS_TO_ERROR_CODE_MAP.at(
859 SingletonContainer::Get<DisplayManager>().SetFoldDisplayModeFromJs(mode, reason));
860 WLOGI("[NAPI]setFoldDisplayMode, %{public}d", static_cast<int32_t>(errCode));
861 if (errCode != DmErrorCode::DM_OK) {
862 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode)));
863 return NapiGetUndefined(env);
864 }
865 return NapiGetUndefined(env);
866 }
867
OnSetFoldStatusLocked(napi_env env,napi_callback_info info)868 napi_value OnSetFoldStatusLocked(napi_env env, napi_callback_info info)
869 {
870 size_t argc = 4;
871 napi_value argv[4] = {nullptr};
872 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
873 if (argc < ARGC_ONE) {
874 WLOGFE("Params not match %{public}zu", argc);
875 std::string errMsg = "Invalid args count, need one arg";
876 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
877 return NapiGetUndefined(env);
878 }
879 bool locked = false;
880 if (!ConvertFromJsValue(env, argv[0], locked)) {
881 WLOGFE("[NAPI]Failed to convert parameter to SetFoldStatusLocked");
882 std::string errMsg = "Failed to convert parameter to SetFoldStatusLocked";
883 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM), errMsg));
884 return NapiGetUndefined(env);
885 }
886 DmErrorCode errCode = DM_JS_TO_ERROR_CODE_MAP.at(
887 SingletonContainer::Get<DisplayManager>().SetFoldStatusLockedFromJs(locked));
888 if (errCode != DmErrorCode::DM_OK) {
889 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode)));
890 return NapiGetUndefined(env);
891 }
892 WLOGI("[NAPI]" PRIu64", SetFoldStatusLocked");
893 return NapiGetUndefined(env);
894 }
895
OnGetCurrentFoldCreaseRegion(napi_env env,napi_callback_info info)896 napi_value OnGetCurrentFoldCreaseRegion(napi_env env, napi_callback_info info)
897 {
898 size_t argc = 4;
899 napi_value argv[4] = {nullptr};
900 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
901 if (argc >= ARGC_ONE) {
902 WLOGFE("Params not match %{public}zu", argc);
903 napi_throw(env, CreateJsError(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
904 return NapiGetUndefined(env);
905 }
906 sptr<FoldCreaseRegion> region = SingletonContainer::Get<DisplayManager>().GetCurrentFoldCreaseRegion();
907 WLOGI("[NAPI]" PRIu64", getCurrentFoldCreaseRegion");
908 return CreateJsFoldCreaseRegionObject(env, region);
909 }
910
CreateJsFoldCreaseRegionObject(napi_env env,sptr<FoldCreaseRegion> region)911 napi_value CreateJsFoldCreaseRegionObject(napi_env env, sptr<FoldCreaseRegion> region)
912 {
913 WLOGI("JsDisplay::CreateJsFoldCreaseRegionObject is called");
914 napi_value objValue = nullptr;
915 napi_create_object(env, &objValue);
916 if (objValue == nullptr) {
917 WLOGFE("Failed to convert prop to jsObject");
918 return NapiGetUndefined(env);
919 }
920 if (region == nullptr) {
921 WLOGFW("Get null fold crease region");
922 return NapiGetUndefined(env);
923 }
924 DisplayId displayId = region->GetDisplayId();
925 std::vector<DMRect> creaseRects = region->GetCreaseRects();
926 napi_set_named_property(env, objValue, "displayId", CreateJsValue(env, static_cast<uint32_t>(displayId)));
927 napi_set_named_property(env, objValue, "creaseRects", CreateJsCreaseRectsArrayObject(env, creaseRects));
928 return objValue;
929 }
930
CreateJsCreaseRectsArrayObject(napi_env env,std::vector<DMRect> creaseRects)931 napi_value CreateJsCreaseRectsArrayObject(napi_env env, std::vector<DMRect> creaseRects)
932 {
933 napi_value arrayValue = nullptr;
934 napi_create_array_with_length(env, creaseRects.size(), &arrayValue);
935 size_t i = 0;
936 for (const auto& rect : creaseRects) {
937 napi_set_element(env, arrayValue, i++, CreateJsRectObject(env, rect));
938 }
939 return arrayValue;
940 }
941
OnCreateVirtualScreen(napi_env env,napi_callback_info info)942 napi_value OnCreateVirtualScreen(napi_env env, napi_callback_info info)
943 {
944 WLOGI("JsDisplayManager::OnCreateVirtualScreen is called");
945 DmErrorCode errCode = DmErrorCode::DM_OK;
946 VirtualScreenOption option;
947 size_t argc = 4;
948 std::string errMsg = "";
949 napi_value argv[4] = {nullptr};
950 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
951 if (argc < ARGC_ONE) {
952 errMsg = "Invalid args count, need one arg at least!";
953 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
954 } else {
955 napi_value object = argv[0];
956 if (object == nullptr) {
957 errMsg = "Failed to get options, options is nullptr";
958 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
959 } else {
960 errCode = GetVirtualScreenOptionFromJs(env, object, option);
961 }
962 }
963 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM) {
964 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
965 }
966 napi_value lastParam = nullptr;
967 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
968 GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
969 lastParam = argv[ARGC_TWO - 1];
970 }
971 napi_value result = nullptr;
972 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
973 auto asyncTask = [option, env, task = napiAsyncTask.get()]() {
974 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsDisplayManager::OnCreateVirtualScreen");
975 auto screenId = SingletonContainer::Get<ScreenManager>().CreateVirtualScreen(option);
976 auto screen = SingletonContainer::Get<ScreenManager>().GetScreenById(screenId);
977 if (screen == nullptr) {
978 DmErrorCode ret = DmErrorCode::DM_ERROR_INVALID_SCREEN;
979 if (screenId == ERROR_ID_NOT_SYSTEM_APP) {
980 ret = DmErrorCode::DM_ERROR_NO_PERMISSION;
981 }
982 task->Reject(env, CreateJsError(env, static_cast<int32_t>(ret), "CreateVirtualScreen failed."));
983 WLOGFE("JsDisplayManager::CreateVirtualScreen failed.");
984 } else {
985 task->Resolve(env, CreateJsValue(env, static_cast<int64_t>(screenId)));
986 WLOGI("JsDisplayManager::OnCreateVirtualScreen success");
987 }
988 delete task;
989 };
990 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnCreateVirtualScreen");
991 return result;
992 }
993
OnMakeUnique(napi_env env,napi_callback_info info)994 napi_value OnMakeUnique(napi_env env, napi_callback_info info)
995 {
996 WLOGI("OnMakeUnique is called");
997 size_t argc = 4;
998 int64_t screenId = -1LL;
999 DmErrorCode errCode = DmErrorCode::DM_OK;
1000 std::string errMsg = "";
1001 napi_value argv[4] = {nullptr};
1002 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1003 if (argc < ARGC_ONE) {
1004 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1005 errMsg = "Invalid args count, need one arg at least!";
1006 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1007 } else {
1008 if (!ConvertFromJsValue(env, argv[0], screenId) || static_cast<int32_t>(screenId) < 0) {
1009 WLOGFE("Failed to convert parameter to screen id.");
1010 errMsg = "Failed to convert parameter to screen id.";
1011 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1012 }
1013 }
1014 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || screenId == -1LL) {
1015 WLOGFE("JsDisplayManager::OnMakeUnique failed, Invalidate params.");
1016 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1017 }
1018 std::vector<ScreenId> screenIds;
1019 screenIds.emplace_back(static_cast<ScreenId>(screenId));
1020 napi_value lastParam = nullptr;
1021 napi_value result = nullptr;
1022 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1023 auto asyncTask = [this, screenIds, env, task = napiAsyncTask.get()]() {
1024 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsDisplayManager::OnMakeUnique");
1025 std::vector<DisplayId> displayIds;
1026 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
1027 SingletonContainer::Get<ScreenManager>().MakeUniqueScreen(screenIds, displayIds));
1028 ret = (ret == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) ? DmErrorCode::DM_ERROR_NO_PERMISSION : ret;
1029 if (ret == DmErrorCode::DM_OK) {
1030 task->Resolve(env, NapiGetUndefined(env));
1031 WLOGI("makeUnique success");
1032 } else {
1033 task->Reject(env,
1034 CreateJsError(env, static_cast<int32_t>(ret), "JsDisplayManager::OnMakeUnique failed."));
1035 }
1036 delete task;
1037 };
1038 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnMakeUnique");
1039 return result;
1040 }
1041
OnDestroyVirtualScreen(napi_env env,napi_callback_info info)1042 napi_value OnDestroyVirtualScreen(napi_env env, napi_callback_info info)
1043 {
1044 WLOGI("JsDisplayManager::OnDestroyVirtualScreen is called");
1045 DmErrorCode errCode = DmErrorCode::DM_OK;
1046 int64_t screenId = -1LL;
1047 std::string errMsg = "";
1048 size_t argc = 4;
1049 napi_value argv[4] = {nullptr};
1050 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1051 if (argc < ARGC_ONE) {
1052 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1053 errMsg = "Invalid args count, need one arg at least!";
1054 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1055 } else {
1056 if (!ConvertFromJsValue(env, argv[0], screenId)) {
1057 WLOGFE("Failed to convert parameter to screen id.");
1058 errMsg = "Failed to convert parameter to screen id.";
1059 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1060 }
1061 }
1062 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || screenId == -1LL) {
1063 WLOGFE("JsDisplayManager::OnDestroyVirtualScreen failed, Invalidate params.");
1064 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1065 }
1066 napi_value lastParam = nullptr;
1067 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
1068 GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
1069 lastParam = argv[ARGC_TWO - 1];
1070 }
1071 napi_value result = nullptr;
1072 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1073 auto asyncTask = [screenId, env, task = napiAsyncTask.get()]() {
1074 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsDisplayManager::OnDestroyVirtualScreen");
1075 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1076 SingletonContainer::Get<ScreenManager>().DestroyVirtualScreen(screenId));
1077 res = (res == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) ? DmErrorCode::DM_ERROR_NO_PERMISSION : res;
1078 if (res != DmErrorCode::DM_OK) {
1079 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1080 "JsDisplayManager::DestroyVirtualScreen failed."));
1081 WLOGFE("JsDisplayManager::DestroyVirtualScreen failed.");
1082 delete task;
1083 return;
1084 }
1085 task->Resolve(env, NapiGetUndefined(env));
1086 WLOGI("JsDisplayManager::OnDestroyVirtualScreen success");
1087 delete task;
1088 };
1089 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnDestroyVirtualScreen");
1090 return result;
1091 }
1092
OnSetVirtualScreenSurface(napi_env env,napi_callback_info info)1093 napi_value OnSetVirtualScreenSurface(napi_env env, napi_callback_info info)
1094 {
1095 WLOGI("JsDisplayManager::OnSetVirtualScreenSurface is called");
1096 DmErrorCode errCode = DmErrorCode::DM_OK;
1097 int64_t screenId = -1LL;
1098 sptr<Surface> surface;
1099 size_t argc = 4;
1100 std::string errMsg = "";
1101 napi_value argv[4] = {nullptr};
1102 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1103 if (argc < ARGC_TWO) {
1104 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1105 errMsg = "Invalid args count, need 2 args at least!";
1106 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1107 } else {
1108 if (!ConvertFromJsValue(env, argv[0], screenId)) {
1109 errMsg = "Failed to convert parameter to screen id.";
1110 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1111 }
1112 if (!GetSurfaceFromJs(env, argv[1], surface)) {
1113 errMsg = "Failed to convert parameter.";
1114 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1115 }
1116 }
1117 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || surface == nullptr) {
1118 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1119 }
1120 napi_value lastParam = nullptr;
1121 if (argc >= ARGC_THREE && argv[ARGC_THREE - 1] != nullptr &&
1122 GetType(env, argv[ARGC_THREE - 1]) == napi_function) {
1123 lastParam = argv[ARGC_THREE - 1];
1124 }
1125 napi_value result = nullptr;
1126 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1127 auto asyncTask = [screenId, surface, env, task = napiAsyncTask.get()]() {
1128 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsDisplayManager::OnSetVirtualScreenSurface");
1129 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1130 SingletonContainer::Get<ScreenManager>().SetVirtualScreenSurface(screenId, surface));
1131 res = (res == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) ? DmErrorCode::DM_ERROR_NO_PERMISSION : res;
1132 if (res != DmErrorCode::DM_OK) {
1133 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1134 "JsDisplayManager::SetVirtualScreenSurface failed."));
1135 WLOGFE("JsDisplayManager::SetVirtualScreenSurface failed.");
1136 } else {
1137 task->Resolve(env, NapiGetUndefined(env));
1138 }
1139 delete task;
1140 };
1141 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "OnSetVirtualScreenSurface");
1142 return result;
1143 }
1144
OnAddVirtualScreenBlockList(napi_env env,napi_callback_info info)1145 napi_value OnAddVirtualScreenBlockList(napi_env env, napi_callback_info info)
1146 {
1147 TLOGD(WmsLogTag::DMS, "in");
1148 size_t argc = ARGC_THREE;
1149 napi_value argv[ARGC_THREE] = {nullptr};
1150 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1151 if (argc < ARGC_ONE) {
1152 TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc);
1153 return NapiThrowError(
1154 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid parameter count");
1155 }
1156 napi_value nativeArray = argv[0];
1157 uint32_t size = 0;
1158 if (GetType(env, nativeArray) != napi_object ||
1159 napi_get_array_length(env, nativeArray, &size) == napi_invalid_arg) {
1160 return NapiThrowError(
1161 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to black list array");
1162 }
1163 std::vector<int32_t> persistentIds;
1164 for (uint32_t i = 0; i < size; i++) {
1165 int32_t persistentId = 0;
1166 napi_value element = nullptr;
1167 napi_get_element(env, nativeArray, i, &element);
1168 if (!ConvertFromJsValue(env, element, persistentId)) {
1169 return NapiThrowError(
1170 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to persistent id");
1171 }
1172 persistentIds.push_back(persistentId);
1173 }
1174 napi_value result = nullptr;
1175 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
1176 auto asyncTask = [persistentIds, env, task = napiAsyncTask.get()] {
1177 if (persistentIds.size() == 0) {
1178 TLOGND(WmsLogTag::DMS, "RemoveVirtualScreenBlockList: persistentIds size is 0, no need update");
1179 task->Resolve(env, NapiGetUndefined(env));
1180 return;
1181 }
1182 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1183 SingletonContainer::Get<ScreenManager>().AddVirtualScreenBlockList(persistentIds));
1184 res = (res == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) ? DmErrorCode::DM_ERROR_NO_PERMISSION : res;
1185 if (res != DmErrorCode::DM_OK) {
1186 TLOGE(WmsLogTag::DMS, "failed");
1187 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res), "add black list failed"));
1188 } else {
1189 task->Resolve(env, NapiGetUndefined(env));
1190 }
1191 delete task;
1192 };
1193 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "AddVirtualScreenBlockList");
1194 return result;
1195 }
1196
OnRemoveVirtualScreenBlockList(napi_env env,napi_callback_info info)1197 napi_value OnRemoveVirtualScreenBlockList(napi_env env, napi_callback_info info)
1198 {
1199 TLOGD(WmsLogTag::DMS, "in");
1200 size_t argc = ARGC_THREE;
1201 napi_value argv[ARGC_THREE] = {nullptr};
1202 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1203 if (argc < ARGC_ONE) {
1204 TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc);
1205 return NapiThrowError(
1206 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid parameter count");
1207 }
1208 napi_value nativeArray = argv[0];
1209 uint32_t size = 0;
1210 if (GetType(env, nativeArray) != napi_object ||
1211 napi_get_array_length(env, nativeArray, &size) == napi_invalid_arg) {
1212 return NapiThrowError(
1213 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to black list array");
1214 }
1215 std::vector<int32_t> persistentIds;
1216 for (uint32_t i = 0; i < size; i++) {
1217 int32_t persistentId = 0;
1218 napi_value element = nullptr;
1219 napi_get_element(env, nativeArray, i, &element);
1220 if (!ConvertFromJsValue(env, element, persistentId)) {
1221 return NapiThrowError(
1222 env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to persistent id");
1223 }
1224 persistentIds.push_back(persistentId);
1225 }
1226 napi_value result = nullptr;
1227 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
1228 auto asyncTask = [persistentIds, env, task = napiAsyncTask.get()] {
1229 if (persistentIds.size() == 0) {
1230 TLOGND(WmsLogTag::DMS, "RemoveVirtualScreenBlockList: persistentIds size is 0, no need update");
1231 task->Resolve(env, NapiGetUndefined(env));
1232 return;
1233 }
1234 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1235 SingletonContainer::Get<ScreenManager>().RemoveVirtualScreenBlockList(persistentIds));
1236 res = (res == DmErrorCode::DM_ERROR_NOT_SYSTEM_APP) ? DmErrorCode::DM_ERROR_NO_PERMISSION : res;
1237 if (res != DmErrorCode::DM_OK) {
1238 TLOGE(WmsLogTag::DMS, "failed");
1239 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res), "remove black list failed"));
1240 } else {
1241 task->Resolve(env, NapiGetUndefined(env));
1242 }
1243 delete task;
1244 };
1245 NapiSendDmsEvent(env, asyncTask, napiAsyncTask, "RemoveVirtualScreenBlockList");
1246 return result;
1247 }
1248
GetVirtualScreenOptionFromJs(napi_env env,napi_value optionObject,VirtualScreenOption & option)1249 DmErrorCode GetVirtualScreenOptionFromJs(napi_env env, napi_value optionObject, VirtualScreenOption& option)
1250 {
1251 napi_value name = nullptr;
1252 napi_get_named_property(env, optionObject, "name", &name);
1253 if (!ConvertFromJsValue(env, name, option.name_)) {
1254 WLOGFE("Failed to convert parameter to name.");
1255 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1256 }
1257 napi_value width = nullptr;
1258 napi_get_named_property(env, optionObject, "width", &width);
1259 if (!ConvertFromJsValue(env, width, option.width_)) {
1260 WLOGFE("Failed to convert parameter to width.");
1261 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1262 }
1263 napi_value height = nullptr;
1264 napi_get_named_property(env, optionObject, "height", &height);
1265 if (!ConvertFromJsValue(env, height, option.height_)) {
1266 WLOGFE("Failed to convert parameter to height.");
1267 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1268 }
1269 napi_value density = nullptr;
1270 napi_get_named_property(env, optionObject, "density", &density);
1271 double densityValue;
1272 if (!ConvertFromJsValue(env, density, densityValue)) {
1273 WLOGFE("Failed to convert parameter to density.");
1274 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1275 }
1276 option.density_ = static_cast<float>(densityValue);
1277
1278 napi_value surfaceIdNapiValue = nullptr;
1279 napi_get_named_property(env, optionObject, "surfaceId", &surfaceIdNapiValue);
1280 if (!GetSurfaceFromJs(env, surfaceIdNapiValue, option.surface_)) {
1281 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1282 }
1283 return DmErrorCode::DM_OK;
1284 }
1285
GetSurfaceFromJs(napi_env env,napi_value surfaceIdNapiValue,sptr<Surface> & surface)1286 bool GetSurfaceFromJs(napi_env env, napi_value surfaceIdNapiValue, sptr<Surface>& surface)
1287 {
1288 if (surfaceIdNapiValue == nullptr || GetType(env, surfaceIdNapiValue) != napi_string) {
1289 WLOGFE("Failed to convert parameter to surface. Invalidate params.");
1290 return false;
1291 }
1292
1293 char buffer[PATH_MAX];
1294 size_t length = 0;
1295 uint64_t surfaceId = 0;
1296 if (napi_get_value_string_utf8(env, surfaceIdNapiValue, buffer, PATH_MAX, &length) != napi_ok) {
1297 WLOGFE("Failed to convert parameter to surface.");
1298 return false;
1299 }
1300 std::istringstream inputStream(buffer);
1301 inputStream >> surfaceId;
1302 surface = SurfaceUtils::GetInstance()->GetSurface(surfaceId);
1303 if (surface == nullptr) {
1304 WLOGI("GetSurfaceFromJs failed, surfaceId:%{public}" PRIu64"", surfaceId);
1305 }
1306 return true;
1307 }
1308
NapiThrowError(napi_env env,DmErrorCode errCode,std::string msg="")1309 napi_value NapiThrowError(napi_env env, DmErrorCode errCode, std::string msg = "")
1310 {
1311 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode), msg));
1312 return NapiGetUndefined(env);
1313 }
1314 };
1315
InitDisplayState(napi_env env)1316 napi_value InitDisplayState(napi_env env)
1317 {
1318 WLOGD("InitDisplayState called");
1319
1320 if (env == nullptr) {
1321 WLOGFE("env is nullptr");
1322 return nullptr;
1323 }
1324
1325 napi_value objValue = nullptr;
1326 napi_create_object(env, &objValue);
1327 if (objValue == nullptr) {
1328 WLOGFE("Failed to get object");
1329 return nullptr;
1330 }
1331 napi_set_named_property(env, objValue, "STATE_UNKNOWN",
1332 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_UNKNOWN)));
1333 napi_set_named_property(env, objValue, "STATE_OFF",
1334 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_OFF)));
1335 napi_set_named_property(env, objValue, "STATE_ON",
1336 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_ON)));
1337 napi_set_named_property(env, objValue, "STATE_DOZE",
1338 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_DOZE)));
1339 napi_set_named_property(env, objValue, "STATE_DOZE_SUSPEND",
1340 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_DOZE_SUSPEND)));
1341 napi_set_named_property(env, objValue, "STATE_VR",
1342 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_VR)));
1343 napi_set_named_property(env, objValue, "STATE_ON_SUSPEND",
1344 CreateJsValue(env, static_cast<int32_t>(DisplayStateMode::STATE_ON_SUSPEND)));
1345 return objValue;
1346 }
1347
InitOrientation(napi_env env)1348 napi_value InitOrientation(napi_env env)
1349 {
1350 WLOGD("InitOrientation called");
1351
1352 if (env == nullptr) {
1353 WLOGFE("env is nullptr");
1354 return nullptr;
1355 }
1356
1357 napi_value objValue = nullptr;
1358 napi_create_object(env, &objValue);
1359 if (objValue == nullptr) {
1360 WLOGFE("Failed to get object");
1361 return nullptr;
1362 }
1363
1364 napi_set_named_property(env, objValue, "PORTRAIT",
1365 CreateJsValue(env, static_cast<uint32_t>(DisplayOrientation::PORTRAIT)));
1366 napi_set_named_property(env, objValue, "LANDSCAPE",
1367 CreateJsValue(env, static_cast<uint32_t>(DisplayOrientation::LANDSCAPE)));
1368 napi_set_named_property(env, objValue, "PORTRAIT_INVERTED",
1369 CreateJsValue(env, static_cast<uint32_t>(DisplayOrientation::PORTRAIT_INVERTED)));
1370 napi_set_named_property(env, objValue, "LANDSCAPE_INVERTED",
1371 CreateJsValue(env, static_cast<uint32_t>(DisplayOrientation::LANDSCAPE_INVERTED)));
1372 return objValue;
1373 }
1374
InitDisplayErrorCode(napi_env env)1375 napi_value InitDisplayErrorCode(napi_env env)
1376 {
1377 WLOGD("InitDisplayErrorCode called");
1378
1379 if (env == nullptr) {
1380 WLOGFE("env is nullptr");
1381 return nullptr;
1382 }
1383
1384 napi_value objValue = nullptr;
1385 napi_create_object(env, &objValue);
1386 if (objValue == nullptr) {
1387 WLOGFE("Failed to get object");
1388 return nullptr;
1389 }
1390
1391 napi_set_named_property(env, objValue, "DM_ERROR_NO_PERMISSION",
1392 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_NO_PERMISSION)));
1393 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1394 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
1395 napi_set_named_property(env, objValue, "DM_ERROR_DEVICE_NOT_SUPPORT",
1396 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_DEVICE_NOT_SUPPORT)));
1397 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_SCREEN",
1398 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN)));
1399 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1400 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_CALLING)));
1401 napi_set_named_property(env, objValue, "DM_ERROR_SYSTEM_INNORMAL",
1402 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_SYSTEM_INNORMAL)));
1403
1404 return objValue;
1405 }
1406
InitDisplayError(napi_env env)1407 napi_value InitDisplayError(napi_env env)
1408 {
1409 WLOGD("InitDisplayError called");
1410
1411 if (env == nullptr) {
1412 WLOGFE("env is nullptr");
1413 return nullptr;
1414 }
1415
1416 napi_value objValue = nullptr;
1417 napi_create_object(env, &objValue);
1418 if (objValue == nullptr) {
1419 WLOGFE("Failed to get object");
1420 return nullptr;
1421 }
1422
1423 napi_set_named_property(env, objValue, "DM_ERROR_INIT_DMS_PROXY_LOCKED",
1424 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED)));
1425 napi_set_named_property(env, objValue, "DM_ERROR_IPC_FAILED",
1426 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_IPC_FAILED)));
1427 napi_set_named_property(env, objValue, "DM_ERROR_REMOTE_CREATE_FAILED",
1428 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_REMOTE_CREATE_FAILED)));
1429 napi_set_named_property(env, objValue, "DM_ERROR_NULLPTR",
1430 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_NULLPTR)));
1431 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1432 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_PARAM)));
1433 napi_set_named_property(env, objValue, "DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED",
1434 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED)));
1435 napi_set_named_property(env, objValue, "DM_ERROR_DEATH_RECIPIENT",
1436 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_DEATH_RECIPIENT)));
1437 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_MODE_ID",
1438 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_MODE_ID)));
1439 napi_set_named_property(env, objValue, "DM_ERROR_WRITE_DATA_FAILED",
1440 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_DATA_FAILED)));
1441 napi_set_named_property(env, objValue, "DM_ERROR_RENDER_SERVICE_FAILED",
1442 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_RENDER_SERVICE_FAILED)));
1443 napi_set_named_property(env, objValue, "DM_ERROR_UNREGISTER_AGENT_FAILED",
1444 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNREGISTER_AGENT_FAILED)));
1445 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1446 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_CALLING)));
1447 napi_set_named_property(env, objValue, "DM_ERROR_UNKNOWN",
1448 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNKNOWN)));
1449
1450 return objValue;
1451 }
1452
InitFoldStatus(napi_env env)1453 napi_value InitFoldStatus(napi_env env)
1454 {
1455 WLOGD("InitFoldStatus called");
1456
1457 if (env == nullptr) {
1458 WLOGFE("env is nullptr");
1459 return nullptr;
1460 }
1461
1462 napi_value objValue = nullptr;
1463 napi_create_object(env, &objValue);
1464 if (objValue == nullptr) {
1465 WLOGFE("Failed to get object");
1466 return nullptr;
1467 }
1468 napi_set_named_property(env, objValue, "FOLD_STATUS_UNKNOWN",
1469 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::UNKNOWN)));
1470 napi_set_named_property(env, objValue, "FOLD_STATUS_EXPANDED",
1471 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::EXPAND)));
1472 napi_set_named_property(env, objValue, "FOLD_STATUS_FOLDED",
1473 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLDED)));
1474 napi_set_named_property(env, objValue, "FOLD_STATUS_HALF_FOLDED",
1475 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::HALF_FOLD)));
1476 napi_set_named_property(env, objValue, "FOLD_STATUS_EXPANDED_WITH_SECOND_EXPANDED",
1477 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_EXPAND)));
1478 napi_set_named_property(env, objValue, "FOLD_STATUS_EXPANDED_WITH_SECOND_HALF_FOLDED",
1479 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_HALF_FOLDED)));
1480 napi_set_named_property(env, objValue, "FOLD_STATUS_FOLDED_WITH_SECOND_EXPANDED",
1481 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_EXPAND)));
1482 napi_set_named_property(env, objValue, "FOLD_STATUS_FOLDED_WITH_SECOND_HALF_FOLDED",
1483 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_HALF_FOLDED)));
1484 napi_set_named_property(env, objValue, "FOLD_STATUS_HALF_FOLDED_WITH_SECOND_EXPANDED",
1485 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_EXPAND)));
1486 napi_set_named_property(env, objValue, "FOLD_STATUS_HALF_FOLDED_WITH_SECOND_HALF_FOLDED",
1487 CreateJsValue(env, static_cast<uint32_t>(FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_HALF_FOLDED)));
1488 return objValue;
1489 }
1490
InitFoldDisplayMode(napi_env env)1491 napi_value InitFoldDisplayMode(napi_env env)
1492 {
1493 WLOGD("IniFoldDisplayMode called");
1494
1495 if (env == nullptr) {
1496 WLOGFE("env is nullptr");
1497 return nullptr;
1498 }
1499
1500 napi_value objValue = nullptr;
1501 napi_create_object(env, &objValue);
1502 if (objValue == nullptr) {
1503 WLOGFE("Failed to get object");
1504 return nullptr;
1505 }
1506
1507 napi_set_named_property(env, objValue, "FOLD_DISPLAY_MODE_UNKNOWN",
1508 CreateJsValue(env, static_cast<uint32_t>(FoldDisplayMode::UNKNOWN)));
1509 napi_set_named_property(env, objValue, "FOLD_DISPLAY_MODE_FULL",
1510 CreateJsValue(env, static_cast<uint32_t>(FoldDisplayMode::FULL)));
1511 napi_set_named_property(env, objValue, "FOLD_DISPLAY_MODE_MAIN",
1512 CreateJsValue(env, static_cast<uint32_t>(FoldDisplayMode::MAIN)));
1513 napi_set_named_property(env, objValue, "FOLD_DISPLAY_MODE_SUB",
1514 CreateJsValue(env, static_cast<uint32_t>(FoldDisplayMode::SUB)));
1515 napi_set_named_property(env, objValue, "FOLD_DISPLAY_MODE_COORDINATION",
1516 CreateJsValue(env, static_cast<uint32_t>(FoldDisplayMode::COORDINATION)));
1517 return objValue;
1518 }
1519
InitColorSpace(napi_env env)1520 napi_value InitColorSpace(napi_env env)
1521 {
1522 WLOGD("InitColorSpace called");
1523
1524 if (env == nullptr) {
1525 WLOGFE("env is nullptr");
1526 return nullptr;
1527 }
1528
1529 napi_value objValue = nullptr;
1530 napi_create_object(env, &objValue);
1531 if (objValue == nullptr) {
1532 WLOGFE("Failed to get object");
1533 return nullptr;
1534 }
1535
1536 napi_set_named_property(env, objValue, "UNKNOWN",
1537 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::UNKNOWN)));
1538 napi_set_named_property(env, objValue, "ADOBE_RGB",
1539 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::ADOBE_RGB)));
1540 napi_set_named_property(env, objValue, "BT2020_HLG",
1541 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::BT2020_HLG)));
1542 napi_set_named_property(env, objValue, "BT2020_PQ",
1543 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::BT2020_PQ)));
1544 napi_set_named_property(env, objValue, "BT601_EBU",
1545 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::BT601_EBU)));
1546 napi_set_named_property(env, objValue, "BT601_SMPTE_C",
1547 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::BT601_SMPTE_C)));
1548 napi_set_named_property(env, objValue, "BT709",
1549 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::BT709)));
1550 napi_set_named_property(env, objValue, "P3_HLG",
1551 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::P3_HLG)));
1552 napi_set_named_property(env, objValue, "P3_PQ",
1553 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::P3_PQ)));
1554 napi_set_named_property(env, objValue, "DISPLAY_P3",
1555 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::DISPLAY_P3)));
1556 napi_set_named_property(env, objValue, "SRGB",
1557 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::SRGB)));
1558 napi_set_named_property(env, objValue, "LINEAR_SRGB",
1559 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::LINEAR_SRGB)));
1560 napi_set_named_property(env, objValue, "LINEAR_P3",
1561 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::LINEAR_P3)));
1562 napi_set_named_property(env, objValue, "LINEAR_BT2020",
1563 CreateJsValue(env, static_cast<uint32_t>(ColorSpace::LINEAR_BT2020)));
1564 return objValue;
1565 }
1566
InitHDRFormat(napi_env env)1567 napi_value InitHDRFormat(napi_env env)
1568 {
1569 WLOGD("InitHDRFormat called");
1570
1571 if (env == nullptr) {
1572 WLOGFE("env is nullptr");
1573 return nullptr;
1574 }
1575
1576 napi_value objValue = nullptr;
1577 napi_create_object(env, &objValue);
1578 if (objValue == nullptr) {
1579 WLOGFE("Failed to get object");
1580 return nullptr;
1581 }
1582
1583 napi_set_named_property(env, objValue, "NONE",
1584 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::NONE)));
1585 napi_set_named_property(env, objValue, "VIDEO_HLG",
1586 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::VIDEO_HLG)));
1587 napi_set_named_property(env, objValue, "VIDEO_HDR10",
1588 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::VIDEO_HDR10)));
1589 napi_set_named_property(env, objValue, "VIDEO_HDR_VIVID",
1590 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::VIDEO_HDR_VIVID)));
1591 napi_set_named_property(env, objValue, "IMAGE_HDR_VIVID_DUAL",
1592 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::IMAGE_HDR_VIVID_DUAL)));
1593 napi_set_named_property(env, objValue, "IMAGE_HDR_VIVID_SINGLE",
1594 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::IMAGE_HDR_VIVID_SINGLE)));
1595 napi_set_named_property(env, objValue, "IMAGE_HDR_ISO_DUAL",
1596 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::IMAGE_HDR_ISO_DUAL)));
1597 napi_set_named_property(env, objValue, "IMAGE_HDR_ISO_SINGLE",
1598 CreateJsValue(env, static_cast<uint32_t>(HDRFormat::IMAGE_HDR_ISO_SINGLE)));
1599 return objValue;
1600 }
1601
InitScreenShape(napi_env env)1602 napi_value InitScreenShape(napi_env env)
1603 {
1604 TLOGD(WmsLogTag::DMS, "InitScreenShape called");
1605
1606 if (env == nullptr) {
1607 TLOGE(WmsLogTag::DMS, "env is nullptr");
1608 return nullptr;
1609 }
1610
1611 napi_value objValue = nullptr;
1612 napi_create_object(env, &objValue);
1613 if (objValue == nullptr) {
1614 TLOGE(WmsLogTag::DMS, "Failed to get object");
1615 return nullptr;
1616 }
1617
1618 napi_set_named_property(env, objValue, "RECTANGLE",
1619 CreateJsValue(env, static_cast<uint32_t>(ScreenShape::RECTANGLE)));
1620 napi_set_named_property(env, objValue, "ROUND",
1621 CreateJsValue(env, static_cast<uint32_t>(ScreenShape::ROUND)));
1622 return objValue;
1623 }
1624
JsDisplayManagerInit(napi_env env,napi_value exportObj)1625 napi_value JsDisplayManagerInit(napi_env env, napi_value exportObj)
1626 {
1627 WLOGD("JsDisplayManagerInit is called");
1628
1629 if (env == nullptr || exportObj == nullptr) {
1630 WLOGFE("JsDisplayManagerInit env or exportObj is nullptr");
1631 return nullptr;
1632 }
1633
1634 std::unique_ptr<JsDisplayManager> jsDisplayManager = std::make_unique<JsDisplayManager>(env);
1635 napi_wrap(env, exportObj, jsDisplayManager.release(), JsDisplayManager::Finalizer, nullptr, nullptr);
1636
1637 napi_set_named_property(env, exportObj, "DisplayState", InitDisplayState(env));
1638 napi_set_named_property(env, exportObj, "Orientation", InitOrientation(env));
1639 napi_set_named_property(env, exportObj, "DmErrorCode", InitDisplayErrorCode(env));
1640 napi_set_named_property(env, exportObj, "DMError", InitDisplayError(env));
1641 napi_set_named_property(env, exportObj, "FoldStatus", InitFoldStatus(env));
1642 napi_set_named_property(env, exportObj, "FoldDisplayMode", InitFoldDisplayMode(env));
1643 napi_set_named_property(env, exportObj, "ColorSpace", InitColorSpace(env));
1644 napi_set_named_property(env, exportObj, "HDRFormat", InitHDRFormat(env));
1645 napi_set_named_property(env, exportObj, "ScreenShape", InitScreenShape(env));
1646
1647 const char *moduleName = "JsDisplayManager";
1648 BindNativeFunction(env, exportObj, "getDefaultDisplay", moduleName, JsDisplayManager::GetDefaultDisplay);
1649 BindNativeFunction(env, exportObj, "getDefaultDisplaySync", moduleName, JsDisplayManager::GetDefaultDisplaySync);
1650 BindNativeFunction(env, exportObj, "getPrimaryDisplaySync", moduleName, JsDisplayManager::GetPrimaryDisplaySync);
1651 BindNativeFunction(env, exportObj, "getDisplayByIdSync", moduleName, JsDisplayManager::GetDisplayByIdSync);
1652 BindNativeFunction(env, exportObj, "getAllDisplay", moduleName, JsDisplayManager::GetAllDisplay);
1653 BindNativeFunction(env, exportObj, "getAllDisplays", moduleName, JsDisplayManager::GetAllDisplays);
1654 BindNativeFunction(env, exportObj, "hasPrivateWindow", moduleName, JsDisplayManager::HasPrivateWindow);
1655 BindNativeFunction(env, exportObj, "isFoldable", moduleName, JsDisplayManager::IsFoldable);
1656 BindNativeFunction(env, exportObj, "isCaptured", moduleName, JsDisplayManager::IsCaptured);
1657 BindNativeFunction(env, exportObj, "getFoldStatus", moduleName, JsDisplayManager::GetFoldStatus);
1658 BindNativeFunction(env, exportObj, "getFoldDisplayMode", moduleName, JsDisplayManager::GetFoldDisplayMode);
1659 BindNativeFunction(env, exportObj, "setFoldDisplayMode", moduleName, JsDisplayManager::SetFoldDisplayMode);
1660 BindNativeFunction(env, exportObj, "setFoldStatusLocked", moduleName, JsDisplayManager::SetFoldStatusLocked);
1661 BindNativeFunction(env, exportObj, "getCurrentFoldCreaseRegion", moduleName,
1662 JsDisplayManager::GetCurrentFoldCreaseRegion);
1663 BindNativeFunction(env, exportObj, "on", moduleName, JsDisplayManager::RegisterDisplayManagerCallback);
1664 BindNativeFunction(env, exportObj, "off", moduleName, JsDisplayManager::UnregisterDisplayManagerCallback);
1665 BindNativeFunction(env, exportObj, "getAllDisplayPhysicalResolution", moduleName,
1666 JsDisplayManager::GetAllDisplayPhysicalResolution);
1667 BindNativeFunction(env, exportObj, "createVirtualScreen", moduleName, JsDisplayManager::CreateVirtualScreen);
1668 BindNativeFunction(env, exportObj, "makeUnique", moduleName, JsDisplayManager::MakeUnique);
1669 BindNativeFunction(env, exportObj, "destroyVirtualScreen", moduleName, JsDisplayManager::DestroyVirtualScreen);
1670 BindNativeFunction(env, exportObj, "setVirtualScreenSurface", moduleName,
1671 JsDisplayManager::SetVirtualScreenSurface);
1672 BindNativeFunction(env, exportObj, "addVirtualScreenBlocklist", moduleName,
1673 JsDisplayManager::AddVirtualScreenBlockList);
1674 BindNativeFunction(env, exportObj, "removeVirtualScreenBlocklist", moduleName,
1675 JsDisplayManager::RemoveVirtualScreenBlockList);
1676 return NapiGetUndefined(env);
1677 }
1678 } // namespace Rosen
1679 } // namespace OHOS
1680