• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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