• 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 "js_screen_manager.h"
17 
18 #include <cinttypes>
19 #include <hitrace_meter.h>
20 #include <vector>
21 #include <new>
22 #include "js_runtime_utils.h"
23 #include "js_screen.h"
24 #include "js_screen_listener.h"
25 
26 #include "native_engine/native_reference.h"
27 #include "screen_manager.h"
28 #include "singleton_container.h"
29 #include "surface_utils.h"
30 #include "window_manager_hilog.h"
31 #include "pixel_map_napi.h"
32 
33 namespace OHOS {
34 namespace Rosen {
35 using namespace AbilityRuntime;
36 constexpr size_t ARGC_ONE = 1;
37 constexpr size_t ARGC_TWO = 2;
38 constexpr size_t ARGC_THREE = 3;
39 constexpr size_t ARGC_FOUR = 4;
40 constexpr int32_t INDEX_ZERO = 0;
41 constexpr int32_t INDEX_ONE = 1;
42 constexpr int32_t INDEX_TWO = 2;
43 constexpr uint32_t MAX_SCREENS_NUM = 1000;
44 namespace {
45 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "JsScreenManager"};
46 }
47 
48 class JsScreenManager {
49 public:
JsScreenManager(napi_env env)50 explicit JsScreenManager(napi_env env) {
51 }
52 
53 ~JsScreenManager() = default;
54 
Finalizer(napi_env env,void * data,void * hint)55 static void Finalizer(napi_env env, void* data, void* hint)
56 {
57     WLOGI("JsScreenManager::Finalizer is called");
58     std::unique_ptr<JsScreenManager>(static_cast<JsScreenManager*>(data));
59 }
60 
GetAllScreens(napi_env env,napi_callback_info info)61 static napi_value GetAllScreens(napi_env env, napi_callback_info info)
62 {
63     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
64     return (me != nullptr) ? me->OnGetAllScreens(env, info) : nullptr;
65 }
66 
RegisterScreenManagerCallback(napi_env env,napi_callback_info info)67 static napi_value RegisterScreenManagerCallback(napi_env env, napi_callback_info info)
68 {
69     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
70     return (me != nullptr) ? me->OnRegisterScreenManagerCallback(env, info) : nullptr;
71 }
72 
UnregisterScreenMangerCallback(napi_env env,napi_callback_info info)73 static napi_value UnregisterScreenMangerCallback(napi_env env, napi_callback_info info)
74 {
75     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
76     return (me != nullptr) ? me->OnUnregisterScreenManagerCallback(env, info) : nullptr;
77 }
78 
MakeMirror(napi_env env,napi_callback_info info)79 static napi_value MakeMirror(napi_env env, napi_callback_info info)
80 {
81     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
82     return (me != nullptr) ? me->OnMakeMirror(env, info) : nullptr;
83 }
84 
MakeMirrorWithRegion(napi_env env,napi_callback_info info)85 static napi_value MakeMirrorWithRegion(napi_env env, napi_callback_info info)
86 {
87     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
88     return (me != nullptr) ? me->OnMakeMirrorWithRegion(env, info) : nullptr;
89 }
90 
SetMultiScreenMode(napi_env env,napi_callback_info info)91 static napi_value SetMultiScreenMode(napi_env env, napi_callback_info info)
92 {
93     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
94     return (me != nullptr) ? me->OnSetMultiScreenMode(env, info) : nullptr;
95 }
96 
SetMultiScreenRelativePosition(napi_env env,napi_callback_info info)97 static napi_value SetMultiScreenRelativePosition(napi_env env, napi_callback_info info)
98 {
99     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
100     return (me != nullptr) ? me->OnSetMultiScreenRelativePosition(env, info) : nullptr;
101 }
102 
MakeExpand(napi_env env,napi_callback_info info)103 static napi_value MakeExpand(napi_env env, napi_callback_info info)
104 {
105     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
106     return (me != nullptr) ? me->OnMakeExpand(env, info) : nullptr;
107 }
108 
StopMirror(napi_env env,napi_callback_info info)109 static napi_value StopMirror(napi_env env, napi_callback_info info)
110 {
111     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
112     return (me != nullptr) ? me->OnStopMirror(env, info) : nullptr;
113 }
114 
StopExpand(napi_env env,napi_callback_info info)115 static napi_value StopExpand(napi_env env, napi_callback_info info)
116 {
117     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
118     return (me != nullptr) ? me->OnStopExpand(env, info) : nullptr;
119 }
120 
CreateVirtualScreen(napi_env env,napi_callback_info info)121 static napi_value CreateVirtualScreen(napi_env env, napi_callback_info info)
122 {
123     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
124     return (me != nullptr) ? me->OnCreateVirtualScreen(env, info) : nullptr;
125 }
126 
DestroyVirtualScreen(napi_env env,napi_callback_info info)127 static napi_value DestroyVirtualScreen(napi_env env, napi_callback_info info)
128 {
129     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
130     return (me != nullptr) ? me->OnDestroyVirtualScreen(env, info) : nullptr;
131 }
132 
SetVirtualScreenSurface(napi_env env,napi_callback_info info)133 static napi_value SetVirtualScreenSurface(napi_env env, napi_callback_info info)
134 {
135     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
136     return (me != nullptr) ? me->OnSetVirtualScreenSurface(env, info) : nullptr;
137 }
138 
SetScreenPrivacyMaskImage(napi_env env,napi_callback_info info)139 static napi_value SetScreenPrivacyMaskImage(napi_env env, napi_callback_info info)
140 {
141     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
142     return (me != nullptr) ? me->OnSetScreenPrivacyMaskImage(env, info) : nullptr;
143 }
144 
IsScreenRotationLocked(napi_env env,napi_callback_info info)145 static napi_value IsScreenRotationLocked(napi_env env, napi_callback_info info)
146 {
147     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
148     return (me != nullptr) ? me->OnIsScreenRotationLocked(env, info) : nullptr;
149 }
150 
SetScreenRotationLocked(napi_env env,napi_callback_info info)151 static napi_value SetScreenRotationLocked(napi_env env, napi_callback_info info)
152 {
153     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
154     return (me != nullptr) ? me->OnSetScreenRotationLocked(env, info) : nullptr;
155 }
156 
MakeUnique(napi_env env,napi_callback_info info)157 static napi_value MakeUnique(napi_env env, napi_callback_info info)
158 {
159     JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
160     return (me != nullptr) ? me->OnMakeUnique(env, info) : nullptr;
161 }
162 
163 private:
164 std::map<std::string, std::map<std::unique_ptr<NativeReference>, sptr<JsScreenListener>>> jsCbMap_;
165 std::mutex mtx_;
166 
OnGetAllScreens(napi_env env,napi_callback_info info)167 napi_value OnGetAllScreens(napi_env env, napi_callback_info info)
168 {
169     WLOGI("OnGetAllScreens is called");
170     size_t argc = 4;
171     napi_value argv[4] = {nullptr};
172     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
173     napi_value lastParam = nullptr;
174     if (argc >= ARGC_ONE && argv[ARGC_ONE - 1] != nullptr &&
175         GetType(env, argv[ARGC_ONE - 1]) == napi_function) {
176         lastParam = argv[ARGC_ONE - 1];
177     }
178     napi_value result = nullptr;
179     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
180     auto asyncTask = [this, env, task = napiAsyncTask.get()]() {
181         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnGetAllScreens");
182         std::vector<sptr<Screen>> screens;
183         auto res = DM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<ScreenManager>().GetAllScreens(screens));
184         if (res != DmErrorCode::DM_OK) {
185             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
186                 "JsScreenManager::OnGetAllScreens failed."));
187         } else if (!screens.empty()) {
188             task->Resolve(env, CreateJsScreenVectorObject(env, screens));
189             WLOGI("JsScreenManager::OnGetAllScreens success");
190         } else {
191             task->Reject(env, CreateJsError(env,
192                 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN),
193                 "JsScreenManager::OnGetAllScreens failed."));
194         }
195         delete task;
196     };
197     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
198     return result;
199 }
200 
CreateJsDisplayIdVectorObject(napi_env env,std::vector<DisplayId> & displayIds)201 napi_value CreateJsDisplayIdVectorObject(napi_env env, std::vector<DisplayId>& displayIds)
202 {
203     napi_value arrayValue = nullptr;
204     napi_create_array_with_length(env, displayIds.size(), &arrayValue);
205     if (arrayValue == nullptr) {
206         WLOGFE("Failed to get screens");
207         return NapiGetUndefined(env);
208     }
209     size_t i = 0;
210     for (auto& displayId : displayIds) {
211         napi_set_element(env, arrayValue, i++, CreateJsValue(env, static_cast<uint32_t>(displayId)));
212     }
213     return arrayValue;
214 }
215 
CreateJsScreenVectorObject(napi_env env,std::vector<sptr<Screen>> & screens)216 napi_value CreateJsScreenVectorObject(napi_env env, std::vector<sptr<Screen>>& screens)
217 {
218     napi_value arrayValue = nullptr;
219     napi_create_array_with_length(env, screens.size(), &arrayValue);
220     if (arrayValue == nullptr) {
221         WLOGFE("Failed to get screens");
222         return NapiGetUndefined(env);
223     }
224     size_t i = 0;
225     for (auto& screen : screens) {
226         if (screen == nullptr) {
227             continue;
228         }
229         napi_set_element(env, arrayValue, i++, CreateJsScreenObject(env, screen));
230     }
231     return arrayValue;
232 }
233 
IfCallbackRegistered(napi_env env,const std::string & type,napi_value jsListenerObject)234 bool IfCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject)
235 {
236     if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
237         WLOGI("JsScreenManager::IfCallbackRegistered methodName %{public}s not registered!", type.c_str());
238         return false;
239     }
240 
241     for (auto& iter : jsCbMap_[type]) {
242         bool isEquals = false;
243         napi_strict_equals(env, jsListenerObject, iter.first->GetNapiValue(), &isEquals);
244         if (isEquals) {
245             WLOGFE("JsScreenManager::IfCallbackRegistered callback already registered!");
246             return true;
247         }
248     }
249     return false;
250 }
251 
RegisterScreenListenerWithType(napi_env env,const std::string & type,napi_value value)252 DmErrorCode RegisterScreenListenerWithType(napi_env env, const std::string& type, napi_value value)
253 {
254     if (IfCallbackRegistered(env, type, value)) {
255         WLOGFE("JsScreenManager::RegisterScreenListenerWithType callback already registered!");
256         return DmErrorCode::DM_ERROR_INVALID_CALLING;
257     }
258     std::unique_ptr<NativeReference> callbackRef;
259     napi_ref result = nullptr;
260     napi_create_reference(env, value, 1, &result);
261     callbackRef.reset(reinterpret_cast<NativeReference*>(result));
262     sptr<JsScreenListener> screenListener = new(std::nothrow) JsScreenListener(env);
263     if (screenListener == nullptr) {
264         WLOGFE("screenListener is nullptr");
265         return DmErrorCode::DM_ERROR_INVALID_SCREEN;
266     }
267     if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
268         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
269             SingletonContainer::Get<ScreenManager>().RegisterScreenListener(screenListener));
270         if (ret != DmErrorCode::DM_OK) {
271             return ret;
272         }
273         WLOGI("JsScreenManager::RegisterScreenListenerWithType success");
274     } else {
275         WLOGFE("JsScreenManager::RegisterScreenListenerWithType failed method: %{public}s not support!",
276             type.c_str());
277         return DmErrorCode::DM_ERROR_INVALID_CALLING;
278     }
279     screenListener->AddCallback(type, value);
280     jsCbMap_[type][std::move(callbackRef)] = screenListener;
281     return DmErrorCode::DM_OK;
282 }
283 
UnregisterAllScreenListenerWithType(const std::string & type)284 DmErrorCode UnregisterAllScreenListenerWithType(const std::string& type)
285 {
286     if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
287         WLOGFE("JsScreenManager::UnregisterAllScreenListenerWithType methodName %{public}s not registered!",
288             type.c_str());
289         return DmErrorCode::DM_OK;
290     }
291     for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
292         it->second->RemoveAllCallback();
293         if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
294             sptr<ScreenManager::IScreenListener> thisListener(it->second);
295             SingletonContainer::Get<ScreenManager>().UnregisterScreenListener(thisListener);
296             WLOGI("JsScreenManager::UnregisterAllScreenListenerWithType success");
297         }
298         jsCbMap_[type].erase(it++);
299     }
300     jsCbMap_.erase(type);
301     return DmErrorCode::DM_OK;
302 }
303 
UnRegisterScreenListenerWithType(napi_env env,const std::string & type,napi_value value)304 DmErrorCode UnRegisterScreenListenerWithType(napi_env env, const std::string& type, napi_value value)
305 {
306     if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
307         WLOGI("JsScreenManager::UnRegisterScreenListenerWithType methodName %{public}s not registered!",
308             type.c_str());
309         return DmErrorCode::DM_OK;
310     }
311     if (value == nullptr) {
312         WLOGFE("JsScreenManager::UnRegisterScreenListenerWithType value is nullptr");
313         return DmErrorCode::DM_ERROR_INVALID_SCREEN;
314     }
315     DmErrorCode ret = DmErrorCode::DM_OK;
316     for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
317         bool isEquals = false;
318         napi_strict_equals(env, value, it->first->GetNapiValue(), &isEquals);
319         if (isEquals) {
320             it->second->RemoveCallback(env, type, value);
321             if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
322                 sptr<ScreenManager::IScreenListener> thisListener(it->second);
323                 ret = DM_JS_TO_ERROR_CODE_MAP.at(
324                     SingletonContainer::Get<ScreenManager>().UnregisterScreenListener(thisListener));
325             }
326             jsCbMap_[type].erase(it++);
327             break;
328         } else {
329             it++;
330         }
331     }
332     if (jsCbMap_[type].empty()) {
333         jsCbMap_.erase(type);
334     }
335     if (ret == DmErrorCode::DM_OK) {
336         WLOGFI("JsScreenManager::UnRegisterScreenListenerWithType success");
337     }
338     return ret;
339 }
340 
NapiIsCallable(napi_env env,napi_value value)341 bool NapiIsCallable(napi_env env, napi_value value)
342 {
343     bool result = false;
344     napi_is_callable(env, value, &result);
345     return result;
346 }
347 
NapiThrowError(napi_env env,DmErrorCode errCode,std::string msg="")348 napi_value NapiThrowError(napi_env env, DmErrorCode errCode, std::string msg = "")
349 {
350     napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode), msg));
351     return NapiGetUndefined(env);
352 }
353 
OnRegisterScreenManagerCallback(napi_env env,napi_callback_info info)354 napi_value OnRegisterScreenManagerCallback(napi_env env, napi_callback_info info)
355 {
356     WLOGI("JsScreenManager::OnRegisterScreenManagerCallback is called");
357     size_t argc = 4;
358     napi_value argv[4] = {nullptr};
359     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
360     if (argc < ARGC_TWO) {
361         WLOGFE("Invalid args count, need 2 args!");
362         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, 2 args is needed.");
363     }
364     std::string cbType;
365     if (!ConvertFromJsValue(env, argv[0], cbType)) {
366         WLOGFE("Failed to convert parameter to eventType");
367         std::string errMsg = "Failed to convert parameter to eventType";
368         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
369     }
370     napi_value value = argv[INDEX_ONE];
371     if (value == nullptr) {
372         WLOGI("JsScreenManager::OnRegisterScreenManagerCallback argv[1] is nullptr");
373         std::string errMsg = "OnRegisterScreenManagerCallback error, argv[1] is nullptr";
374         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
375     }
376     if (!NapiIsCallable(env, value)) {
377         WLOGI("JsScreenManager::OnRegisterScreenManagerCallback argv[1] is not callable");
378         std::string errMsg = "OnRegisterScreenManagerCallback error, argv[1] is not callable";
379         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
380     }
381     std::lock_guard<std::mutex> lock(mtx_);
382     DmErrorCode ret = RegisterScreenListenerWithType(env, cbType, value);
383     if (ret != DmErrorCode::DM_OK) {
384         WLOGFE("JsScreenManager::OnRegisterScreenManagerCallback failed");
385         napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
386     }
387     return NapiGetUndefined(env);
388 }
389 
OnUnregisterScreenManagerCallback(napi_env env,napi_callback_info info)390 napi_value OnUnregisterScreenManagerCallback(napi_env env, napi_callback_info info)
391 {
392     WLOGI("JsScreenManager::OnUnregisterScreenCallback is called");
393     size_t argc = 4;
394     napi_value argv[4] = {nullptr};
395     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
396     if (argc < ARGC_ONE) {
397         WLOGFE("Invalid args count, need one arg at least!");
398         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
399     }
400     std::string cbType;
401     if (!ConvertFromJsValue(env, argv[0], cbType)) {
402         WLOGFE("Failed to convert parameter to eventType");
403         std::string errMsg = "Failed to convert parameter to eventType";
404         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
405     }
406     std::lock_guard<std::mutex> lock(mtx_);
407     if (argc == ARGC_ONE) {
408         DmErrorCode ret = UnregisterAllScreenListenerWithType(cbType);
409         if (ret != DmErrorCode::DM_OK) {
410             WLOGFE("unregister all callback failed");
411             napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
412         }
413     } else {
414         napi_value value = argv[INDEX_ONE];
415         if ((value == nullptr) || (!NapiIsCallable(env, value))) {
416             DmErrorCode ret = UnregisterAllScreenListenerWithType(cbType);
417             if (ret != DmErrorCode::DM_OK) {
418                 WLOGFE("JsScreenManager::OnUnRegisterAllScreenManagerCallback failed");
419                 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
420             }
421         } else {
422             DmErrorCode ret = UnRegisterScreenListenerWithType(env, cbType, value);
423             if (ret != DmErrorCode::DM_OK) {
424                 WLOGFE("JsScreenManager::OnUnRegisterScreenManagerCallback failed");
425                 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
426             }
427         }
428     }
429     return NapiGetUndefined(env);
430 }
431 
OnMakeMirror(napi_env env,napi_callback_info info)432 napi_value OnMakeMirror(napi_env env, napi_callback_info info)
433 {
434     WLOGI("OnMakeMirror is called");
435     size_t argc = 4;
436     napi_value argv[4] = {nullptr};
437     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
438     if (argc < ARGC_TWO) {
439         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need 2 args at least!");
440     }
441 
442     int64_t mainScreenId;
443     if (!ConvertFromJsValue(env, argv[0], mainScreenId)) {
444         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
445     }
446     napi_value array = argv[INDEX_ONE];
447     if (array == nullptr) {
448         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
449     }
450     uint32_t size = 0;
451     napi_get_array_length(env, array, &size);
452     std::vector<ScreenId> screenIds;
453     for (uint32_t i = 0; i < size; i++) {
454         uint32_t screenId;
455         napi_value value = nullptr;
456         napi_get_element(env, array, i, &value);
457         if (!ConvertFromJsValue(env, value, screenId)) {
458             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
459         }
460         screenIds.emplace_back(static_cast<ScreenId>(screenId));
461     }
462     napi_value lastParam = nullptr;
463     if (argc >= ARGC_THREE && argv[ARGC_THREE - 1] != nullptr &&
464         GetType(env, argv[ARGC_THREE - 1]) == napi_function) {
465         lastParam = argv[ARGC_THREE - 1];
466     }
467     napi_value result = nullptr;
468     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
469     auto asyncTask = [mainScreenId, screenIds, env, task = napiAsyncTask.get()]() {
470         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeMirror");
471         ScreenId screenGroupId = INVALID_SCREEN_ID;
472         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
473             SingletonContainer::Get<ScreenManager>().MakeMirror(mainScreenId, screenIds, screenGroupId));
474         if (ret == DmErrorCode::DM_OK) {
475             task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
476         } else {
477             task->Reject(env,
478                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeMirror failed."));
479         }
480     };
481     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
482     return result;
483 }
484 
OnMakeMirrorWithRegion(napi_env env,napi_callback_info info)485 napi_value OnMakeMirrorWithRegion(napi_env env, napi_callback_info info)
486 {
487     WLOGI("OnMakeMirrorWithRegion is called");
488     size_t argc = 4;
489     napi_value argv[4] = {nullptr};
490     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
491     if (argc < ARGC_THREE) {
492         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need 3 args at least!");
493     }
494     int64_t mainScreenId;
495     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], mainScreenId)) {
496         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to mainScreenId");
497     }
498     napi_value array = argv[INDEX_ONE];
499     if (array == nullptr) {
500         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
501     }
502     uint32_t size = 0;
503     napi_get_array_length(env, array, &size);
504     std::vector<ScreenId> mirrorScreenIds;
505     for (uint32_t i = 0; i < size; i++) {
506         uint32_t screenId;
507         napi_value value = nullptr;
508         napi_get_element(env, array, i, &value);
509         if (!ConvertFromJsValue(env, value, screenId)) {
510             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
511         }
512         mirrorScreenIds.emplace_back(static_cast<ScreenId>(screenId));
513     }
514     DMRect mainScreenRegion;
515     if (GetRectFromJs(env, argv[INDEX_TWO], mainScreenRegion) == -1) {
516         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert to mainScreenRegion");
517     }
518     napi_value lastParam = nullptr;
519     napi_value result = nullptr;
520     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
521     auto asyncTask = [mainScreenId, mirrorScreenIds, mainScreenRegion, env, task = napiAsyncTask.get()]() {
522         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeMirrorWithRegion");
523         ScreenId screenGroupId = INVALID_SCREEN_ID;
524         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<ScreenManager>().MakeMirror(mainScreenId,
525             mirrorScreenIds, mainScreenRegion, screenGroupId));
526         if (ret == DmErrorCode::DM_OK) {
527             task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
528         } else {
529             task->Reject(env,
530                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeMirrorWithRegion failed."));
531         }
532     };
533     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
534     return result;
535 }
536 
OnSetMultiScreenMode(napi_env env,napi_callback_info info)537 napi_value OnSetMultiScreenMode(napi_env env, napi_callback_info info)
538 {
539     size_t argc = ARGC_FOUR;
540     napi_value argv[ARGC_FOUR] = {nullptr};
541     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
542     if (argc < ARGC_THREE) {
543         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need three args");
544     }
545     int64_t mainScreenId;
546     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], mainScreenId)) {
547         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
548     }
549     int64_t secondaryScreenId;
550     if (!ConvertFromJsValue(env, argv[INDEX_ONE], secondaryScreenId)) {
551         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
552     }
553     MultiScreenMode screenMode;
554     if (!ConvertFromJsValue(env, argv[INDEX_TWO], screenMode)) {
555         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter");
556     }
557     napi_value lastParam = nullptr;
558     napi_value result = nullptr;
559     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
560     auto asyncTask = [mainScreenId, secondaryScreenId, env, screenMode,
561         task = napiAsyncTask.get()]() {
562         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetMultiScreenMode");
563         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
564             SingletonContainer::Get<ScreenManager>().SetMultiScreenMode(mainScreenId, secondaryScreenId,
565                 screenMode));
566         if (ret == DmErrorCode::DM_OK) {
567             task->Resolve(env, NapiGetUndefined(env));
568         } else {
569             task->Reject(env,
570                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnSetMultiScreenMode failed."));
571         }
572         delete task;
573     };
574     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
575     return result;
576 }
577 
OnSetMultiScreenRelativePosition(napi_env env,napi_callback_info info)578 napi_value OnSetMultiScreenRelativePosition(napi_env env, napi_callback_info info)
579 {
580     size_t argc = ARGC_FOUR;
581     napi_value argv[ARGC_FOUR] = {nullptr};
582     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
583     if (argc < ARGC_TWO) {
584         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need two args");
585     }
586     MultiScreenPositionOptions mainScreenOptions;
587     if (GetMultiScreenPositionOptionsFromJs(env, argv[INDEX_ZERO], mainScreenOptions) == -1) {
588         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
589     }
590     MultiScreenPositionOptions secondScreenOption;
591     if (GetMultiScreenPositionOptionsFromJs(env, argv[INDEX_ONE], secondScreenOption) == -1) {
592         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
593     }
594     napi_value lastParam = nullptr;
595     napi_value result = nullptr;
596     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
597     auto asyncTask = [mainScreenOptions, secondScreenOption, env,
598         task = napiAsyncTask.get()]() {
599         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetMultiScreenRelativePosition");
600         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
601             SingletonContainer::Get<ScreenManager>().SetMultiScreenRelativePosition(mainScreenOptions,
602                 secondScreenOption));
603         if (ret == DmErrorCode::DM_OK) {
604             task->Resolve(env, NapiGetUndefined(env));
605         } else {
606             task->Reject(env,
607                 CreateJsError(env, static_cast<int32_t>(ret), "OnSetMultiScreenRelativePosition failed."));
608         }
609         delete task;
610     };
611     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
612     return result;
613 }
614 
OnMakeExpand(napi_env env,napi_callback_info info)615 napi_value OnMakeExpand(napi_env env, napi_callback_info info)
616 {
617     WLOGI("OnMakeExpand is called");
618     size_t argc = 4;
619     napi_value argv[4] = {nullptr};
620     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
621     if (argc < ARGC_ONE) {
622         WLOGFE("Invalid args count, need one arg at least!");
623         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
624     }
625 
626     napi_value array = argv[0];
627     if (array == nullptr) {
628         WLOGFE("Failed to get options, options is nullptr");
629         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get options, options is nullptr");
630     }
631     uint32_t size = 0;
632     napi_get_array_length(env, array, &size);
633     std::vector<ExpandOption> options;
634     for (uint32_t i = 0; i < size; ++i) {
635         napi_value object = nullptr;
636         napi_get_element(env, array, i, &object);
637         ExpandOption expandOption;
638         int32_t res = GetExpandOptionFromJs(env, object, expandOption);
639         if (res == -1) {
640             WLOGE("expandoption param %{public}d error!", i);
641             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "expandoption param error!");
642         }
643         options.emplace_back(expandOption);
644     }
645     napi_value lastParam = nullptr;
646     if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
647         lastParam = argv[ARGC_TWO - 1];
648     }
649     napi_value result = nullptr;
650     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
651     auto asyncTask = [options, env, task = napiAsyncTask.get()]() {
652         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeExpand");
653         ScreenId screenGroupId = INVALID_SCREEN_ID;
654         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
655             SingletonContainer::Get<ScreenManager>().MakeExpand(options, screenGroupId));
656         if (ret == DmErrorCode::DM_OK) {
657             task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
658             WLOGI("MakeExpand success");
659         } else {
660             task->Reject(env,
661                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeExpand failed."));
662             WLOGFE("MakeExpand failed");
663         }
664         delete task;
665     };
666     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
667     return result;
668 }
669 
OnStopMirror(napi_env env,napi_callback_info info)670 napi_value OnStopMirror(napi_env env, napi_callback_info info)
671 {
672     WLOGI("OnStopMirror is called");
673     size_t argc = 4;
674     napi_value argv[4] = {nullptr};
675     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
676     if (argc < ARGC_ONE) {
677         WLOGFE("Invalid args count, need one arg at least!");
678         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
679     }
680 
681     napi_value array = argv[0];
682     if (array == nullptr) {
683         WLOGFE("Failed to get mirrorScreen, mirrorScreen is nullptr");
684         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
685     }
686     uint32_t size = 0;
687     napi_get_array_length(env, array, &size);
688     if (size > MAX_SCREENS_NUM) {
689         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "size of mirrorScreen is greater than 1000");
690     }
691     std::vector<ScreenId> screenIds;
692     for (uint32_t i = 0; i < size; i++) {
693         uint32_t screenId;
694         napi_value value = nullptr;
695         napi_get_element(env, array, i, &value);
696         if (!ConvertFromJsValue(env, value, screenId)) {
697             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
698         }
699         screenIds.emplace_back(static_cast<ScreenId>(screenId));
700     }
701     napi_value lastParam = nullptr;
702     if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
703         lastParam = argv[ARGC_TWO - 1];
704     }
705     napi_value result = nullptr;
706     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
707     auto asyncTask = [screenIds, env, task = napiAsyncTask.get()]() {
708         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnStopMirror");
709         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
710             SingletonContainer::Get<ScreenManager>().StopMirror(screenIds));
711         if (ret == DmErrorCode::DM_OK) {
712             task->Resolve(env, NapiGetUndefined(env));
713         } else {
714             task->Reject(env,
715                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnStopMirror failed."));
716         }
717         delete task;
718     };
719     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
720     return result;
721 }
722 
OnStopExpand(napi_env env,napi_callback_info info)723 napi_value OnStopExpand(napi_env env, napi_callback_info info)
724 {
725     WLOGI("OnStopExpand is called");
726     size_t argc = 4;
727     napi_value argv[4] = {nullptr};
728     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
729     if (argc < ARGC_ONE) {
730         WLOGFE("Invalid args count, need one arg at least!");
731         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
732     }
733 
734     napi_value array = argv[0];
735     if (array == nullptr) {
736         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get expandScreen, is nullptr");
737     }
738     uint32_t size = 0;
739     napi_get_array_length(env, array, &size);
740     if (size > MAX_SCREENS_NUM) {
741         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "size of expandScreen is greater than 1000");
742     }
743     std::vector<ScreenId> screenIds;
744     for (uint32_t i = 0; i < size; i++) {
745         uint32_t screenId;
746         napi_value value = nullptr;
747         napi_get_element(env, array, i, &value);
748         if (!ConvertFromJsValue(env, value, screenId)) {
749             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
750         }
751         screenIds.emplace_back(static_cast<ScreenId>(screenId));
752     }
753     napi_value lastParam = nullptr;
754     if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
755         lastParam = argv[ARGC_TWO - 1];
756     }
757     napi_value result = nullptr;
758     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
759     auto asyncTask = [screenIds, env, task = napiAsyncTask.get()]() {
760         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnStopExpand");
761         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
762             SingletonContainer::Get<ScreenManager>().StopExpand(screenIds));
763         if (ret == DmErrorCode::DM_OK) {
764             task->Resolve(env, NapiGetUndefined(env));
765             WLOGI("MakeExpand success");
766         } else {
767             task->Reject(env,
768                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnStopExpand failed."));
769         }
770         delete task;
771     };
772     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
773     return result;
774 }
775 
OnMakeUnique(napi_env env,napi_callback_info info)776 napi_value OnMakeUnique(napi_env env, napi_callback_info info)
777 {
778     WLOGI("OnMakeUnique is called");
779     size_t argc = 4;
780     napi_value argv[4] = {nullptr};
781     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
782     if (argc < ARGC_ONE) {
783         WLOGFE("Invalid args count, need one arg at least!");
784         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
785     }
786     napi_value array = argv[0];
787     if (array == nullptr) {
788         WLOGFE("Failed to get options, options is nullptr");
789         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get options, options is nullptr");
790     }
791     uint32_t size = 0;
792     napi_get_array_length(env, array, &size);
793     std::vector<ScreenId> screenIds;
794     for (uint32_t i = 0; i < size; i++) {
795         uint32_t screenId;
796         napi_value value = nullptr;
797         napi_get_element(env, array, i, &value);
798         if (!ConvertFromJsValue(env, value, screenId)) {
799             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
800         }
801         if (static_cast<int32_t>(screenId) < 0) {
802             return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "ScreenId cannot be a negative number");
803         }
804         screenIds.emplace_back(static_cast<ScreenId>(screenId));
805     }
806     napi_value lastParam = nullptr;
807     napi_value result = nullptr;
808     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
809     auto asyncTask = [this, screenIds, env, task = napiAsyncTask.get()]() {
810         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeUnique");
811         std::vector<DisplayId> displayIds;
812         DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
813             SingletonContainer::Get<ScreenManager>().MakeUniqueScreen(screenIds, displayIds));
814         if (ret == DmErrorCode::DM_OK) {
815             task->Resolve(env, CreateJsDisplayIdVectorObject(env, displayIds));
816             WLOGI("makeUnique success");
817         } else {
818             task->Reject(env,
819                 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeUnique failed."));
820         }
821         delete task;
822     };
823     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
824     return result;
825 }
826 
GetExpandOptionFromJs(napi_env env,napi_value optionObject,ExpandOption & option)827 static int32_t GetExpandOptionFromJs(napi_env env, napi_value optionObject, ExpandOption& option)
828 {
829     napi_value screedIdValue = nullptr;
830     napi_value startXValue = nullptr;
831     napi_value startYValue = nullptr;
832     uint32_t screenId;
833     uint32_t startX;
834     uint32_t startY;
835     napi_get_named_property(env, optionObject, "screenId", &screedIdValue);
836     napi_get_named_property(env, optionObject, "startX", &startXValue);
837     napi_get_named_property(env, optionObject, "startY", &startYValue);
838     if (!ConvertFromJsValue(env, screedIdValue, screenId)) {
839         WLOGFE("Failed to convert screedIdValue to callbackType");
840         return -1;
841     }
842     if (!ConvertFromJsValue(env, startXValue, startX)) {
843         WLOGFE("Failed to convert startXValue to callbackType");
844         return -1;
845     }
846     if (!ConvertFromJsValue(env, startYValue, startY)) {
847         WLOGFE("Failed to convert startYValue to callbackType");
848         return -1;
849     }
850     option = {screenId, startX, startY};
851     return 0;
852 }
853 
GetMultiScreenPositionOptionsFromJs(napi_env env,napi_value optionObject,MultiScreenPositionOptions & option)854 static int32_t GetMultiScreenPositionOptionsFromJs(napi_env env, napi_value optionObject,
855     MultiScreenPositionOptions& option)
856 {
857     napi_value screedIdValue = nullptr;
858     napi_value startXValue = nullptr;
859     napi_value startYValue = nullptr;
860     uint32_t screenId;
861     uint32_t startX;
862     uint32_t startY;
863     napi_get_named_property(env, optionObject, "id", &screedIdValue);
864     napi_get_named_property(env, optionObject, "startX", &startXValue);
865     napi_get_named_property(env, optionObject, "startY", &startYValue);
866     if (!ConvertFromJsValue(env, screedIdValue, screenId)) {
867         WLOGFE("Failed to convert screedIdValue to callbackType");
868         return -1;
869     }
870     if (!ConvertFromJsValue(env, startXValue, startX)) {
871         WLOGFE("Failed to convert startXValue to callbackType");
872         return -1;
873     }
874     if (!ConvertFromJsValue(env, startYValue, startY)) {
875         WLOGFE("Failed to convert startYValue to callbackType");
876         return -1;
877     }
878     option = {screenId, startX, startY};
879     return 0;
880 }
881 
GetRectFromJs(napi_env env,napi_value optionObject,DMRect & rect)882 static int32_t GetRectFromJs(napi_env env, napi_value optionObject, DMRect& rect)
883 {
884     napi_value leftValue = nullptr;
885     napi_value topValue = nullptr;
886     napi_value widthValue = nullptr;
887     napi_value heightValue = nullptr;
888     int32_t left;
889     int32_t top;
890     uint32_t width;
891     uint32_t height;
892     napi_get_named_property(env, optionObject, "left", &leftValue);
893     napi_get_named_property(env, optionObject, "top", &topValue);
894     napi_get_named_property(env, optionObject, "width", &widthValue);
895     napi_get_named_property(env, optionObject, "height", &heightValue);
896     if (!ConvertFromJsValue(env, leftValue, left)) {
897         WLOGFE("Failed to convert leftValue to callbackType");
898         return -1;
899     }
900     if (!ConvertFromJsValue(env, topValue, top)) {
901         WLOGFE("Failed to convert topValue to callbackType");
902         return -1;
903     }
904     if (!ConvertFromJsValue(env, widthValue, width)) {
905         WLOGFE("Failed to convert widthValue to callbackType");
906         return -1;
907     }
908     if (!ConvertFromJsValue(env, heightValue, height)) {
909         WLOGFE("Failed to convert heightValue to callbackType");
910         return -1;
911     }
912     rect = {left, top, width, height};
913     return 0;
914 }
915 
OnCreateVirtualScreen(napi_env env,napi_callback_info info)916 napi_value OnCreateVirtualScreen(napi_env env, napi_callback_info info)
917 {
918     WLOGI("JsScreenManager::OnCreateVirtualScreen is called");
919     DmErrorCode errCode = DmErrorCode::DM_OK;
920     VirtualScreenOption option;
921     size_t argc = 4;
922     std::string errMsg = "";
923     napi_value argv[4] = {nullptr};
924     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
925     if (argc < ARGC_ONE) {
926         errMsg = "Invalid args count, need one arg at least!";
927         errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
928     } else {
929         napi_value object = argv[0];
930         if (object == nullptr) {
931             errMsg = "Failed to get options, options is nullptr";
932             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
933         } else {
934             errCode = GetVirtualScreenOptionFromJs(env, object, option);
935         }
936     }
937     if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM) {
938         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
939     }
940     napi_value lastParam = nullptr;
941     if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
942         GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
943         lastParam = argv[ARGC_TWO - 1];
944     }
945     napi_value result = nullptr;
946     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
947     auto asyncTask = [option, env, task = napiAsyncTask.get()]() {
948         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnCreateVirtualScreen");
949         auto screenId = SingletonContainer::Get<ScreenManager>().CreateVirtualScreen(option);
950         auto screen = SingletonContainer::Get<ScreenManager>().GetScreenById(screenId);
951         if (screen == nullptr) {
952             DmErrorCode ret = DmErrorCode::DM_ERROR_INVALID_SCREEN;
953             if (screenId == ERROR_ID_NOT_SYSTEM_APP) {
954                 ret = DmErrorCode::DM_ERROR_NOT_SYSTEM_APP;
955             }
956             task->Reject(env, CreateJsError(env, static_cast<int32_t>(ret), "CreateVirtualScreen failed."));
957             WLOGFE("ScreenManager::CreateVirtualScreen failed.");
958         } else {
959             task->Resolve(env, CreateJsScreenObject(env, screen));
960             WLOGI("JsScreenManager::OnCreateVirtualScreen success");
961         }
962         delete task;
963     };
964     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
965     return result;
966 }
967 
GetVirtualScreenOptionFromJs(napi_env env,napi_value optionObject,VirtualScreenOption & option)968 DmErrorCode GetVirtualScreenOptionFromJs(napi_env env, napi_value optionObject, VirtualScreenOption& option)
969 {
970     napi_value name = nullptr;
971     napi_get_named_property(env, optionObject, "name", &name);
972     if (!ConvertFromJsValue(env, name, option.name_)) {
973         WLOGFE("Failed to convert parameter to name.");
974         return DmErrorCode::DM_ERROR_INVALID_PARAM;
975     }
976     napi_value width = nullptr;
977     napi_get_named_property(env, optionObject, "width", &width);
978     if (!ConvertFromJsValue(env, width, option.width_)) {
979         WLOGFE("Failed to convert parameter to width.");
980         return DmErrorCode::DM_ERROR_INVALID_PARAM;
981     }
982     napi_value height = nullptr;
983     napi_get_named_property(env, optionObject, "height", &height);
984     if (!ConvertFromJsValue(env, height, option.height_)) {
985         WLOGFE("Failed to convert parameter to height.");
986         return DmErrorCode::DM_ERROR_INVALID_PARAM;
987     }
988     napi_value density = nullptr;
989     napi_get_named_property(env, optionObject, "density", &density);
990     double densityValue;
991     if (!ConvertFromJsValue(env, density, densityValue)) {
992         WLOGFE("Failed to convert parameter to density.");
993         return DmErrorCode::DM_ERROR_INVALID_PARAM;
994     }
995     option.density_ = static_cast<float>(densityValue);
996 
997     napi_value surfaceIdNapiValue = nullptr;
998     napi_get_named_property(env, optionObject, "surfaceId", &surfaceIdNapiValue);
999     if (!GetSurfaceFromJs(env, surfaceIdNapiValue, option.surface_)) {
1000         return DmErrorCode::DM_ERROR_INVALID_PARAM;
1001     }
1002     return DmErrorCode::DM_OK;
1003 }
1004 
GetSurfaceFromJs(napi_env env,napi_value surfaceIdNapiValue,sptr<Surface> & surface)1005 bool GetSurfaceFromJs(napi_env env, napi_value surfaceIdNapiValue, sptr<Surface>& surface)
1006 {
1007     if (surfaceIdNapiValue == nullptr || GetType(env, surfaceIdNapiValue) != napi_string) {
1008         WLOGFE("Failed to convert parameter to surface. Invalidate params.");
1009         return false;
1010     }
1011 
1012     char buffer[PATH_MAX];
1013     size_t length = 0;
1014     uint64_t surfaceId = 0;
1015     if (napi_get_value_string_utf8(env, surfaceIdNapiValue, buffer, PATH_MAX, &length) != napi_ok) {
1016         WLOGFE("Failed to convert parameter to surface.");
1017         return false;
1018     }
1019     std::istringstream inputStream(buffer);
1020     inputStream >> surfaceId;
1021     surface = SurfaceUtils::GetInstance()->GetSurface(surfaceId);
1022     if (surface == nullptr) {
1023         WLOGI("GetSurfaceFromJs failed, surfaceId:%{public}" PRIu64"", surfaceId);
1024     }
1025     return true;
1026 }
1027 
OnDestroyVirtualScreen(napi_env env,napi_callback_info info)1028 napi_value OnDestroyVirtualScreen(napi_env env, napi_callback_info info)
1029 {
1030     WLOGI("JsScreenManager::OnDestroyVirtualScreen is called");
1031     DmErrorCode errCode = DmErrorCode::DM_OK;
1032     int64_t screenId = -1LL;
1033     std::string errMsg = "";
1034     size_t argc = 4;
1035     napi_value argv[4] = {nullptr};
1036     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1037     if (argc < ARGC_ONE) {
1038         WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1039         errMsg = "Invalid args count, need one arg at least!";
1040         errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1041     } else {
1042         if (!ConvertFromJsValue(env, argv[0], screenId)) {
1043             WLOGFE("Failed to convert parameter to screen id.");
1044             errMsg = "Failed to convert parameter to screen id.";
1045             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1046         }
1047     }
1048     if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || screenId == -1LL) {
1049         WLOGFE("JsScreenManager::OnDestroyVirtualScreen failed, Invalidate params.");
1050         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1051     }
1052     napi_value lastParam = nullptr;
1053     if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
1054         GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
1055         lastParam = argv[ARGC_TWO - 1];
1056     }
1057     napi_value result = nullptr;
1058     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1059     auto asyncTask = [screenId, env, task = napiAsyncTask.get()]() {
1060         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnDestroyVirtualScreen");
1061         auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1062             SingletonContainer::Get<ScreenManager>().DestroyVirtualScreen(screenId));
1063         if (res != DmErrorCode::DM_OK) {
1064             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1065                 "ScreenManager::DestroyVirtualScreen failed."));
1066             WLOGFE("ScreenManager::DestroyVirtualScreen failed.");
1067             delete task;
1068             return;
1069         }
1070         task->Resolve(env, NapiGetUndefined(env));
1071         WLOGI("JsScreenManager::OnDestroyVirtualScreen success");
1072         delete task;
1073     };
1074     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1075     return result;
1076 }
1077 
OnSetVirtualScreenSurface(napi_env env,napi_callback_info info)1078 napi_value OnSetVirtualScreenSurface(napi_env env, napi_callback_info info)
1079 {
1080     WLOGI("JsScreenManager::OnSetVirtualScreenSurface is called");
1081     DmErrorCode errCode = DmErrorCode::DM_OK;
1082     int64_t screenId = -1LL;
1083     sptr<Surface> surface;
1084     size_t argc = 4;
1085     std::string errMsg = "";
1086     napi_value argv[4] = {nullptr};
1087     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1088     if (argc < ARGC_TWO) {
1089         WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1090         errMsg = "Invalid args count, need 2 args at least!";
1091         errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1092     } else {
1093         if (!ConvertFromJsValue(env, argv[0], screenId)) {
1094             errMsg = "Failed to convert parameter to screen id.";
1095             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1096         }
1097         if (!GetSurfaceFromJs(env, argv[1], surface)) {
1098             errMsg = "Failed to convert parameter.";
1099             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1100         }
1101     }
1102     if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || surface == nullptr) {
1103         WLOGFE("JsScreenManager::OnSetVirtualScreenSurface failed, Invalidate params.");
1104         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1105     }
1106     napi_value lastParam = nullptr;
1107     if (argc >= ARGC_THREE && argv[ARGC_THREE - 1] != nullptr &&
1108         GetType(env, argv[ARGC_THREE - 1]) == napi_function) {
1109         lastParam = argv[ARGC_THREE - 1];
1110     }
1111     napi_value result = nullptr;
1112     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1113     auto asyncTask = [screenId, surface, env, task = napiAsyncTask.get()]() {
1114         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetVirtualScreenSurface");
1115         auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1116             SingletonContainer::Get<ScreenManager>().SetVirtualScreenSurface(screenId, surface));
1117         if (res != DmErrorCode::DM_OK) {
1118             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1119                 "ScreenManager::SetVirtualScreenSurface failed."));
1120             WLOGFE("ScreenManager::SetVirtualScreenSurface failed.");
1121         } else {
1122             task->Resolve(env, NapiGetUndefined(env));
1123         }
1124         delete task;
1125     };
1126     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1127     return result;
1128 }
1129 
OnSetScreenPrivacyMaskImage(napi_env env,napi_callback_info info)1130 napi_value OnSetScreenPrivacyMaskImage(napi_env env, napi_callback_info info)
1131 {
1132     WLOGI("JsScreenManager::OnSetScreenPrivacyMaskImage is called");
1133     DmErrorCode errCode = DmErrorCode::DM_OK;
1134     int64_t screenId = -1LL;
1135     size_t argc = 4;
1136     std::string errMsg = "";
1137     napi_value argv[4] = {nullptr};
1138     std::shared_ptr<Media::PixelMap> privacyMaskImg;
1139     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1140     if (argc < ARGC_ONE) {
1141         WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1142         errMsg = "Invalid args count, need 1 args at least!";
1143         errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1144     } else {
1145         if (!ConvertFromJsValue(env, argv[0], screenId)) {
1146             errMsg = "Failed to convert parameter to screen id.";
1147             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1148         }
1149         if (argc > ARGC_ONE && GetType(env, argv[1]) == napi_object) {
1150             privacyMaskImg = OHOS::Media::PixelMapNapi::GetPixelMap(env, argv[1]);
1151             if (privacyMaskImg == nullptr) {
1152                 errMsg = "Failed to convert parameter to pixelmap.";
1153                 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1154             }
1155         }
1156     }
1157     if (errCode != DmErrorCode::DM_OK) {
1158         WLOGFE("JsScreenManager::OnSetScreenPrivacyMaskImage failed, Invalidate params.");
1159         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1160     }
1161     napi_value lastParam = nullptr;
1162     lastParam = (argc >= ARGC_THREE && GetType(env, argv[ARGC_THREE - 1]) ==
1163         napi_function) ? argv[ARGC_THREE - 1] : argv[ARGC_TWO - 1];
1164     napi_value result = nullptr;
1165     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1166     auto asyncTask = [screenId, privacyMaskImg, env, task = napiAsyncTask.get()]() {
1167         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetScreenPrivacyMaskImage");
1168         auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1169             SingletonContainer::Get<ScreenManager>().SetScreenPrivacyMaskImage(screenId, privacyMaskImg));
1170         if (res != DmErrorCode::DM_OK) {
1171             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res), "OnSetScreenPrivacyMaskImage failed."));
1172             WLOGFE("OnSetScreenPrivacyMaskImage failed.");
1173         } else {
1174             task->Resolve(env, NapiGetUndefined(env));
1175         }
1176         delete task;
1177     };
1178     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1179     return result;
1180 }
1181 
OnIsScreenRotationLocked(napi_env env,napi_callback_info info)1182 napi_value OnIsScreenRotationLocked(napi_env env, napi_callback_info info)
1183 {
1184     size_t argc = 4;
1185     napi_value argv[4] = {nullptr};
1186     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1187     WLOGI("OnIsScreenRotationLocked is called");
1188     napi_value lastParam = nullptr;
1189     if (argc >= ARGC_ONE && argv[ARGC_ONE - 1] != nullptr &&
1190         GetType(env, argv[ARGC_ONE - 1]) == napi_function) {
1191         lastParam = argv[ARGC_ONE - 1];
1192     }
1193     napi_value result = nullptr;
1194     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1195     auto asyncTask = [env, task = napiAsyncTask.get()]() {
1196         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnIsScreenRotationLocked");
1197         bool isLocked = false;
1198         auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1199             SingletonContainer::Get<ScreenManager>().IsScreenRotationLocked(isLocked));
1200         if (res == DmErrorCode::DM_OK) {
1201             task->Resolve(env, CreateJsValue(env, isLocked));
1202             WLOGFI("OnIsScreenRotationLocked success");
1203         } else {
1204             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1205                                             "JsScreenManager::OnIsScreenRotationLocked failed."));
1206             WLOGFE("OnIsScreenRotationLocked failed");
1207         }
1208         delete task;
1209     };
1210     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1211     return result;
1212 }
1213 
OnSetScreenRotationLocked(napi_env env,napi_callback_info info)1214 napi_value OnSetScreenRotationLocked(napi_env env, napi_callback_info info)
1215 {
1216     WLOGI("JsScreenManager::OnSetScreenRotationLocked is called");
1217     DmErrorCode errCode = DmErrorCode::DM_OK;
1218     size_t argc = 4;
1219     std::string errMsg = "";
1220     napi_value argv[4] = {nullptr};
1221     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1222     if (argc < ARGC_ONE) {
1223         WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1224         errMsg = "Invalid args count, need one arg at least!";
1225         errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1226     }
1227     bool isLocked = false;
1228     if (errCode == DmErrorCode::DM_OK) {
1229         napi_value nativeVal = argv[0];
1230         if (nativeVal == nullptr) {
1231             WLOGFE("[NAPI]Failed to convert parameter to isLocked");
1232             errMsg = "Failed to convert parameter to isLocked.";
1233             errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1234         } else {
1235             napi_get_value_bool(env, nativeVal, &isLocked);
1236         }
1237     }
1238     if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM) {
1239         WLOGFE("JsScreenManager::OnSetScreenRotationLocked failed, Invalidate params.");
1240         return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1241     }
1242     napi_value lastParam = (argc <= ARGC_ONE) ? nullptr :
1243         ((argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) ?
1244         argv[1] : nullptr);
1245     napi_value result = nullptr;
1246     std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1247     auto asyncTask = [isLocked, env, task = napiAsyncTask.get()]() {
1248         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetScreenRotationLocked");
1249         auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1250             SingletonContainer::Get<ScreenManager>().SetScreenRotationLocked(isLocked));
1251         if (res == DmErrorCode::DM_OK) {
1252             task->Resolve(env, NapiGetUndefined(env));
1253             WLOGFI("OnSetScreenRotationLocked success");
1254         } else {
1255             task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1256                                                 "JsScreenManager::OnSetScreenRotationLocked failed."));
1257             WLOGFE("OnSetScreenRotationLocked failed");
1258         }
1259         delete task;
1260     };
1261     NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1262     return result;
1263 }
1264 
NapiSendDmsEvent(napi_env env,std::function<void ()> asyncTask,std::unique_ptr<AbilityRuntime::NapiAsyncTask> & napiAsyncTask)1265 void NapiSendDmsEvent(napi_env env, std::function<void()> asyncTask,
1266     std::unique_ptr<AbilityRuntime::NapiAsyncTask>& napiAsyncTask)
1267 {
1268     if (!env) {
1269         WLOGFE("env is null");
1270         return;
1271     }
1272     if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_immediate)) {
1273         napiAsyncTask->Reject(env, CreateJsError(env,
1274                 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN), "Send event failed!"));
1275     } else {
1276         napiAsyncTask.release();
1277         WLOGFE("send event success");
1278     }
1279 }
1280 };
1281 
InitScreenOrientation(napi_env env)1282 napi_value InitScreenOrientation(napi_env env)
1283 {
1284     WLOGD("JsScreenManager::InitScreenOrientation called");
1285 
1286     if (env == nullptr) {
1287         WLOGFE("env is nullptr");
1288         return nullptr;
1289     }
1290 
1291     napi_value objValue = nullptr;
1292     napi_create_object(env, &objValue);
1293     if (objValue == nullptr) {
1294         WLOGFE("Failed to get object");
1295         return nullptr;
1296     }
1297 
1298     napi_set_named_property(env, objValue, "UNSPECIFIED",
1299         CreateJsValue(env, static_cast<int32_t>(Orientation::UNSPECIFIED)));
1300     napi_set_named_property(env, objValue, "VERTICAL",
1301         CreateJsValue(env, static_cast<int32_t>(Orientation::VERTICAL)));
1302     napi_set_named_property(env, objValue, "HORIZONTAL",
1303         CreateJsValue(env, static_cast<int32_t>(Orientation::HORIZONTAL)));
1304     napi_set_named_property(env, objValue, "REVERSE_VERTICAL",
1305         CreateJsValue(env, static_cast<int32_t>(Orientation::REVERSE_VERTICAL)));
1306     napi_set_named_property(env, objValue, "REVERSE_HORIZONTAL",
1307         CreateJsValue(env, static_cast<int32_t>(Orientation::REVERSE_HORIZONTAL)));
1308     return objValue;
1309 }
1310 
InitScreenSourceMode(napi_env env)1311 napi_value InitScreenSourceMode(napi_env env)
1312 {
1313     WLOGD("JsScreenManager::InitScreenSourceMode called");
1314 
1315     if (env == nullptr) {
1316         WLOGFE("env is nullptr");
1317         return nullptr;
1318     }
1319 
1320     napi_value objValue = nullptr;
1321     napi_create_object(env, &objValue);
1322     if (objValue == nullptr) {
1323         WLOGFE("Failed to get object");
1324         return nullptr;
1325     }
1326 
1327     napi_set_named_property(env, objValue, "SCREEN_MAIN",
1328         CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_MAIN)));
1329     napi_set_named_property(env, objValue, "SCREEN_MIRROR",
1330         CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_MIRROR)));
1331     napi_set_named_property(env, objValue, "SCREEN_EXTEND",
1332         CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_EXTEND)));
1333     napi_set_named_property(env, objValue, "SCREEN_ALONE",
1334         CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_ALONE)));
1335     return objValue;
1336 }
1337 
InitMultiScreenMode(napi_env env)1338 napi_value InitMultiScreenMode(napi_env env)
1339 {
1340     WLOGD("JsScreenManager::InitMultiScreenMode called");
1341 
1342     if (env == nullptr) {
1343         WLOGFE("env is nullptr");
1344         return nullptr;
1345     }
1346 
1347     napi_value objValue = nullptr;
1348     napi_create_object(env, &objValue);
1349     if (objValue == nullptr) {
1350         WLOGFE("Failed to get object");
1351         return nullptr;
1352     }
1353 
1354     napi_set_named_property(env, objValue, "SCREEN_MIRROR",
1355         CreateJsValue(env, static_cast<uint32_t>(MultiScreenMode::SCREEN_MIRROR)));
1356     napi_set_named_property(env, objValue, "SCREEN_EXTEND",
1357         CreateJsValue(env, static_cast<uint32_t>(MultiScreenMode::SCREEN_EXTEND)));
1358     return objValue;
1359 }
1360 
InitDisplayErrorCode(napi_env env)1361 napi_value InitDisplayErrorCode(napi_env env)
1362 {
1363     WLOGD("JsDisplayManager::InitDisplayErrorCode called");
1364 
1365     if (env == nullptr) {
1366         WLOGFE("env is nullptr");
1367         return nullptr;
1368     }
1369 
1370     napi_value objValue = nullptr;
1371     napi_create_object(env, &objValue);
1372     if (objValue == nullptr) {
1373         WLOGFE("Failed to get object");
1374         return nullptr;
1375     }
1376 
1377     napi_set_named_property(env, objValue, "DM_ERROR_NO_PERMISSION",
1378         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_NO_PERMISSION)));
1379     napi_set_named_property(env, objValue, "DM_ERROR_NOT_SYSTEM_APP",
1380         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_NOT_SYSTEM_APP)));
1381     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1382         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
1383     napi_set_named_property(env, objValue, "DM_ERROR_DEVICE_NOT_SUPPORT",
1384         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_DEVICE_NOT_SUPPORT)));
1385     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_SCREEN",
1386         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN)));
1387     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1388         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_CALLING)));
1389     napi_set_named_property(env, objValue, "DM_ERROR_SYSTEM_INNORMAL",
1390         CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_SYSTEM_INNORMAL)));
1391     return objValue;
1392 }
1393 
InitDisplayError(napi_env env)1394 napi_value InitDisplayError(napi_env env)
1395 {
1396     WLOGD("JsDisplayManager::InitDisplayError called");
1397 
1398     if (env == nullptr) {
1399         WLOGFE("env is nullptr");
1400         return nullptr;
1401     }
1402 
1403     napi_value objValue = nullptr;
1404     napi_create_object(env, &objValue);
1405     if (objValue == nullptr) {
1406         WLOGFE("Failed to get object");
1407         return nullptr;
1408     }
1409 
1410     napi_set_named_property(env, objValue, "DM_ERROR_INIT_DMS_PROXY_LOCKED",
1411         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED)));
1412     napi_set_named_property(env, objValue, "DM_ERROR_IPC_FAILED",
1413         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_IPC_FAILED)));
1414     napi_set_named_property(env, objValue, "DM_ERROR_REMOTE_CREATE_FAILED",
1415         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_REMOTE_CREATE_FAILED)));
1416     napi_set_named_property(env, objValue, "DM_ERROR_NULLPTR",
1417         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_NULLPTR)));
1418     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1419         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_PARAM)));
1420     napi_set_named_property(env, objValue, "DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED",
1421         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED)));
1422     napi_set_named_property(env, objValue, "DM_ERROR_DEATH_RECIPIENT",
1423         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_DEATH_RECIPIENT)));
1424     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_MODE_ID",
1425         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_MODE_ID)));
1426     napi_set_named_property(env, objValue, "DM_ERROR_WRITE_DATA_FAILED",
1427         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_DATA_FAILED)));
1428     napi_set_named_property(env, objValue, "DM_ERROR_RENDER_SERVICE_FAILED",
1429         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_RENDER_SERVICE_FAILED)));
1430     napi_set_named_property(env, objValue, "DM_ERROR_UNREGISTER_AGENT_FAILED",
1431         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNREGISTER_AGENT_FAILED)));
1432     napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1433         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_CALLING)));
1434     napi_set_named_property(env, objValue, "DM_ERROR_UNKNOWN",
1435         CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNKNOWN)));
1436     return objValue;
1437 }
1438 
JsScreenManagerInit(napi_env env,napi_value exportObj)1439 napi_value JsScreenManagerInit(napi_env env, napi_value exportObj)
1440 {
1441     WLOGD("JsScreenManagerInit is called");
1442 
1443     if (env == nullptr || exportObj == nullptr) {
1444         WLOGFE("JsScreenManagerInit env or exportObj is nullptr");
1445         return nullptr;
1446     }
1447 
1448     std::unique_ptr<JsScreenManager> jsScreenManager = std::make_unique<JsScreenManager>(env);
1449     napi_wrap(env, exportObj, jsScreenManager.release(), JsScreenManager::Finalizer, nullptr, nullptr);
1450     napi_set_named_property(env, exportObj, "Orientation", InitScreenOrientation(env));
1451     napi_set_named_property(env, exportObj, "ScreenSourceMode", InitScreenSourceMode(env));
1452     napi_set_named_property(env, exportObj, "DmErrorCode", InitDisplayErrorCode(env));
1453     napi_set_named_property(env, exportObj, "DMError", InitDisplayError(env));
1454     napi_set_named_property(env, exportObj, "MultiScreenMode", InitMultiScreenMode(env));
1455 
1456     const char *moduleName = "JsScreenManager";
1457     BindNativeFunction(env, exportObj, "getAllScreens", moduleName, JsScreenManager::GetAllScreens);
1458     BindNativeFunction(env, exportObj, "on", moduleName, JsScreenManager::RegisterScreenManagerCallback);
1459     BindNativeFunction(env, exportObj, "off", moduleName, JsScreenManager::UnregisterScreenMangerCallback);
1460     BindNativeFunction(env, exportObj, "makeMirror", moduleName, JsScreenManager::MakeMirror);
1461     BindNativeFunction(env, exportObj, "makeMirrorWithRegion", moduleName, JsScreenManager::MakeMirrorWithRegion);
1462     BindNativeFunction(env, exportObj, "setMultiScreenMode", moduleName, JsScreenManager::SetMultiScreenMode);
1463     BindNativeFunction(env, exportObj, "setMultiScreenRelativePosition", moduleName,
1464         JsScreenManager::SetMultiScreenRelativePosition);
1465     BindNativeFunction(env, exportObj, "makeExpand", moduleName, JsScreenManager::MakeExpand);
1466     BindNativeFunction(env, exportObj, "stopMirror", moduleName, JsScreenManager::StopMirror);
1467     BindNativeFunction(env, exportObj, "stopExpand", moduleName, JsScreenManager::StopExpand);
1468     BindNativeFunction(env, exportObj, "createVirtualScreen", moduleName, JsScreenManager::CreateVirtualScreen);
1469     BindNativeFunction(env, exportObj, "destroyVirtualScreen", moduleName, JsScreenManager::DestroyVirtualScreen);
1470     BindNativeFunction(env, exportObj, "setVirtualScreenSurface", moduleName,
1471         JsScreenManager::SetVirtualScreenSurface);
1472     BindNativeFunction(env, exportObj, "setScreenPrivacyMaskImage", moduleName,
1473         JsScreenManager::SetScreenPrivacyMaskImage);
1474     BindNativeFunction(env, exportObj, "setScreenRotationLocked", moduleName,
1475         JsScreenManager::SetScreenRotationLocked);
1476     BindNativeFunction(env, exportObj, "isScreenRotationLocked", moduleName,
1477         JsScreenManager::IsScreenRotationLocked);
1478     BindNativeFunction(env, exportObj, "makeUnique", moduleName, JsScreenManager::MakeUnique);
1479     return NapiGetUndefined(env);
1480 }
1481 }  // namespace Rosen
1482 }  // namespace OHOS
1483