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