1 /*
2 * Copyright (c) 2021-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_window_stage.h"
17 #include <string>
18 #include "js_runtime_utils.h"
19 #include "js_window.h"
20 #include "js_window_register_manager.h"
21 #include "js_window_utils.h"
22 #include "window_manager_hilog.h"
23 namespace OHOS {
24 namespace Rosen {
25 using namespace AbilityRuntime;
26 namespace {
27 const int CONTENT_STORAGE_ARG = 2;
28 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "JsWindowStage"};
29 } // namespace
30
31 std::unique_ptr<JsWindowRegisterManager> g_listenerManager = std::make_unique<JsWindowRegisterManager>();
JsWindowStage(const std::shared_ptr<Rosen::WindowScene> & windowScene)32 JsWindowStage::JsWindowStage(const std::shared_ptr<Rosen::WindowScene>& windowScene)
33 : windowScene_(windowScene)
34 {
35 }
36
~JsWindowStage()37 JsWindowStage::~JsWindowStage()
38 {
39 }
Finalizer(NativeEngine * engine,void * data,void * hint)40 void JsWindowStage::Finalizer(NativeEngine* engine, void* data, void* hint)
41 {
42 WLOGFI("JsWindowStage::Finalizer is called");
43 std::unique_ptr<JsWindowStage>(static_cast<JsWindowStage*>(data));
44 }
45
SetUIContent(NativeEngine * engine,NativeCallbackInfo * info)46 NativeValue* JsWindowStage::SetUIContent(NativeEngine* engine, NativeCallbackInfo* info)
47 {
48 WLOGFI("JsWindowStage::SetUIContent is called");
49 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
50 return (me != nullptr) ? me->OnSetUIContent(*engine, *info) : nullptr;
51 }
52
GetMainWindow(NativeEngine * engine,NativeCallbackInfo * info)53 NativeValue* JsWindowStage::GetMainWindow(NativeEngine* engine, NativeCallbackInfo* info)
54 {
55 WLOGFI("JsWindowStage::GetMainWindow is called");
56 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
57 return (me != nullptr) ? me->OnGetMainWindow(*engine, *info) : nullptr;
58 }
59
On(NativeEngine * engine,NativeCallbackInfo * info)60 NativeValue* JsWindowStage::On(NativeEngine* engine, NativeCallbackInfo* info)
61 {
62 WLOGFI("JsWindowStage::On is called");
63 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
64 return (me != nullptr) ? me->OnEvent(*engine, *info) : nullptr;
65 }
66
Off(NativeEngine * engine,NativeCallbackInfo * info)67 NativeValue* JsWindowStage::Off(NativeEngine* engine, NativeCallbackInfo* info)
68 {
69 WLOGFI("JsWindowStage::Off is called");
70 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
71 return (me != nullptr) ? me->OffEvent(*engine, *info) : nullptr;
72 }
73
LoadContent(NativeEngine * engine,NativeCallbackInfo * info)74 NativeValue* JsWindowStage::LoadContent(NativeEngine* engine, NativeCallbackInfo* info)
75 {
76 WLOGFI("JsWindowStage::LoadContent is called");
77 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
78 return (me != nullptr) ? me->OnLoadContent(*engine, *info) : nullptr;
79 }
80
GetWindowMode(NativeEngine * engine,NativeCallbackInfo * info)81 NativeValue* JsWindowStage::GetWindowMode(NativeEngine* engine, NativeCallbackInfo* info)
82 {
83 WLOGFI("JsWindowStage::GetWindowMode is called");
84 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
85 return (me != nullptr) ? me->OnGetWindowMode(*engine, *info) : nullptr;
86 }
87
CreateSubWindow(NativeEngine * engine,NativeCallbackInfo * info)88 NativeValue* JsWindowStage::CreateSubWindow(NativeEngine* engine, NativeCallbackInfo* info)
89 {
90 WLOGFI("JsWindowStage::CreateSubWindow is called");
91 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
92 return (me != nullptr) ? me->OnCreateSubWindow(*engine, *info) : nullptr;
93 }
94
GetSubWindow(NativeEngine * engine,NativeCallbackInfo * info)95 NativeValue* JsWindowStage::GetSubWindow(NativeEngine* engine, NativeCallbackInfo* info)
96 {
97 WLOGFI("JsWindowStage::GetSubWindow is called");
98 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
99 return (me != nullptr) ? me->OnGetSubWindow(*engine, *info) : nullptr;
100 }
101
SetShowOnLockScreen(NativeEngine * engine,NativeCallbackInfo * info)102 NativeValue* JsWindowStage::SetShowOnLockScreen(NativeEngine* engine, NativeCallbackInfo* info)
103 {
104 WLOGFI("[NAPI]SetShowOnLockScreen");
105 JsWindowStage* me = CheckParamsAndGetThis<JsWindowStage>(engine, info);
106 return (me != nullptr) ? me->OnSetShowOnLockScreen(*engine, *info) : nullptr;
107 }
108
OnSetUIContent(NativeEngine & engine,NativeCallbackInfo & info)109 NativeValue* JsWindowStage::OnSetUIContent(NativeEngine& engine, NativeCallbackInfo& info)
110 {
111 WLOGFI("JsWindowStage::OnSetUIContent is called");
112 if (info.argc < 2) { // 2: minimum param num
113 WLOGFE("JsWindowStage::OnSetUIContent Not enough params");
114 return engine.CreateUndefined();
115 }
116 if (windowScene_ == nullptr || windowScene_->GetMainWindow() == nullptr) {
117 WLOGFE("JsWindowStage::OnSetUIContent windowScene_ or MainWindow is nullptr");
118 return engine.CreateUndefined();
119 }
120
121 // Parse info->argv[0] as abilitycontext
122 auto objContext = ConvertNativeValueTo<NativeObject>(info.argv[0]);
123 if (objContext == nullptr) {
124 WLOGFE("JsWindowStage::OnSetUIContent info->argv[0] InValid");
125 return engine.CreateUndefined();
126 }
127
128 // Parse info->argv[1] as url
129 std::string contextUrl;
130 if (!ConvertFromJsValue(engine, info.argv[1], contextUrl)) {
131 WLOGFE("JsWindowStage::OnSetUIContent failed to convert parameter to url");
132 return engine.CreateUndefined();
133 }
134 WLOGFI("JsWindowStage::OnSetUIContent Get url: %{public}s", contextUrl.c_str());
135
136 windowScene_->GetMainWindow()->SetUIContent(contextUrl, &engine, info.argv[CONTENT_STORAGE_ARG]);
137
138 return engine.CreateUndefined();
139 }
140
OnGetMainWindow(NativeEngine & engine,NativeCallbackInfo & info)141 NativeValue* JsWindowStage::OnGetMainWindow(NativeEngine& engine, NativeCallbackInfo& info)
142 {
143 WLOGFI("JsWindowStage::OnGetMainWindow is called");
144 AsyncTask::CompleteCallback complete =
145 [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
146 if (windowScene_ == nullptr) {
147 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
148 WLOGFE("JsWindowStage windowScene_ is nullptr!");
149 return;
150 }
151 auto window = windowScene_->GetMainWindow();
152 if (window != nullptr) {
153 task.Resolve(engine, OHOS::Rosen::CreateJsWindowObject(engine, window));
154 WLOGFI("JsWindowStage::OnGetMainWindow success");
155 } else {
156 task.Reject(engine, CreateJsError(engine,
157 static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
158 "JsWindowStage::OnGetMainWindow failed."));
159 }
160 };
161 NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
162 NativeValue* result = nullptr;
163 AsyncTask::Schedule(
164 engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
165 return result;
166 }
167
OnEvent(NativeEngine & engine,NativeCallbackInfo & info)168 NativeValue* JsWindowStage::OnEvent(NativeEngine& engine, NativeCallbackInfo& info)
169 {
170 WLOGFI("JsWindowStage::OnEvent is called");
171 if (windowScene_ == nullptr || info.argc < 2) { // 2: minimum param nums
172 WLOGFE("JsWindowStage::OnEvent windowScene_ is nullptr or params not match");
173 return engine.CreateUndefined();
174 }
175 // Parse info->argv[0] as string
176 std::string eventString;
177 if (!ConvertFromJsValue(engine, info.argv[0], eventString)) {
178 WLOGFE("JsWindowStage::OnEvent info->argv[0] Failed to convert parameter to string");
179 return engine.CreateUndefined();
180 }
181 NativeValue* value = info.argv[1];
182 if (!value->IsCallable()) {
183 WLOGFE("JsWindowStage::OnEvent info->argv[1] is not callable");
184 return engine.CreateUndefined();
185 }
186
187 auto window = windowScene_->GetMainWindow();
188 if (window == nullptr) {
189 WLOGFE("JsWindowStage::OnEvent GetMainWindow failed");
190 return engine.CreateUndefined();
191 }
192 g_listenerManager->RegisterListener(window, eventString, CaseType::CASE_STAGE, engine, value);
193 return engine.CreateUndefined();
194 }
195
OffEvent(NativeEngine & engine,NativeCallbackInfo & info)196 NativeValue* JsWindowStage::OffEvent(NativeEngine& engine, NativeCallbackInfo& info)
197 {
198 WLOGFI("JsWindowStage::OffEvent is called");
199 if (windowScene_ == nullptr) {
200 WLOGFE("JsWindowStage::OffEvent windowScene_ is nullptr");
201 return engine.CreateUndefined();
202 }
203
204 // Parse info->argv[0] as string
205 std::string eventString;
206 if (!ConvertFromJsValue(engine, info.argv[0], eventString)) {
207 WLOGFE("JsWindowStage::OffEvent info->argv[0] Failed to convert parameter to string");
208 return engine.CreateUndefined();
209 }
210 if (eventString.compare("windowStageEvent") != 0) {
211 WLOGFE("JsWindowStage::OffEvent info->argv[0] is InValid");
212 return engine.CreateUndefined();
213 }
214
215 NativeValue* value = info.argv[1];
216 auto window = windowScene_->GetMainWindow();
217 if (window == nullptr) {
218 WLOGFE("JsWindowStage::OnEvent GetMainWindow failed");
219 return engine.CreateUndefined();
220 }
221 if (value->TypeOf() == NATIVE_FUNCTION) {
222 WLOGFI("JsWindowStage::OffEvent info->argv[1] is callable type");
223 g_listenerManager->UnregisterListener(window, eventString, CaseType::CASE_STAGE, value);
224 } else if (value->TypeOf() == NativeValueType::NATIVE_UNDEFINED) {
225 WLOGFI("JsWindowStage::OffEvent info->argv[1] is native undefined type");
226 g_listenerManager->UnregisterListener(window, eventString, CaseType::CASE_STAGE, nullptr);
227 } else {
228 WLOGFE("JsWindowStage::OffEvent info->argv[1] is InValid param");
229 }
230 return engine.CreateUndefined();
231 }
232
OnLoadContent(NativeEngine & engine,NativeCallbackInfo & info)233 NativeValue* JsWindowStage::OnLoadContent(NativeEngine& engine, NativeCallbackInfo& info)
234 {
235 WLOGFI("JsWindowStage::OnLoadContent is called");
236 WMError errCode = WMError::WM_OK;
237 std::string contextUrl;
238 if (!ConvertFromJsValue(engine, info.argv[0], contextUrl)) {
239 WLOGFE("Failed to convert parameter to context url");
240 errCode = WMError::WM_ERROR_INVALID_PARAM;
241 }
242 NativeValue* storage = nullptr;
243 NativeValue* callBack = nullptr;
244 NativeValue* value1 = info.argv[1];
245 NativeValue* value2 = info.argv[2]; // 2: param index
246 if (value1->TypeOf() == NATIVE_FUNCTION) {
247 callBack = value1;
248 } else if (value1->TypeOf() == NATIVE_OBJECT) {
249 storage = value1;
250 }
251 if (value2->TypeOf() == NATIVE_FUNCTION) {
252 callBack = value2;
253 }
254 std::shared_ptr<NativeReference> contentStorage = (storage == nullptr) ? nullptr :
255 std::shared_ptr<NativeReference>(engine.CreateReference(storage, 1));
256 AsyncTask::CompleteCallback complete =
257 [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
258 if (windowScene_ == nullptr) {
259 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
260 WLOGFE("JsWindowStage windowScene_ is nullptr!");
261 return;
262 }
263 auto win = windowScene_->GetMainWindow();
264 if (win == nullptr) {
265 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
266 return;
267 }
268 NativeValue* nativeStorage = (contentStorage == nullptr) ? nullptr : contentStorage->Get();
269 Rosen::WMError ret = win->SetUIContent(contextUrl, &engine, nativeStorage, false);
270 if (ret != Rosen::WMError::WM_OK) {
271 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(ret)));
272 return;
273 }
274 task.Resolve(engine, engine.CreateUndefined());
275 WLOGFI("JsWindowStage::OnLoadContent success");
276 };
277 NativeValue* result = nullptr;
278 AsyncTask::Schedule(
279 engine, CreateAsyncTaskWithLastParam(engine, callBack, nullptr, std::move(complete), &result));
280 return result;
281 }
282
OnGetWindowMode(NativeEngine & engine,NativeCallbackInfo & info)283 NativeValue* JsWindowStage::OnGetWindowMode(NativeEngine& engine, NativeCallbackInfo& info)
284 {
285 WLOGFI("JsWindowStage::OnGetWindowMode is called");
286 AsyncTask::CompleteCallback complete =
287 [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
288 if (windowScene_ == nullptr) {
289 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
290 WLOGFE("JsWindowStage windowScene_ is nullptr!");
291 return;
292 }
293 auto window = windowScene_->GetMainWindow();
294 if (window == nullptr) {
295 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
296 "JsWindowStage::OnGetWindowMode failed."));
297 WLOGFE("JsWindowStage window is nullptr");
298 return;
299 }
300 Rosen::WindowMode mode = window->GetMode();
301 if (NATIVE_TO_JS_WINDOW_MODE_MAP.count(mode) != 0) {
302 task.Resolve(engine, CreateJsValue(engine, NATIVE_TO_JS_WINDOW_MODE_MAP.at(mode)));
303 WLOGFI("JsWindowStage OnGetWindowMode success");
304 } else {
305 task.Resolve(engine, CreateJsValue(engine, mode));
306 WLOGFI("JsWindowStage OnGetWindowMode success, but not in apimode");
307 }
308 };
309 NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
310 NativeValue* result = nullptr;
311 AsyncTask::Schedule(
312 engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
313 return result;
314 }
315
OnCreateSubWindow(NativeEngine & engine,NativeCallbackInfo & info)316 NativeValue* JsWindowStage::OnCreateSubWindow(NativeEngine& engine, NativeCallbackInfo& info)
317 {
318 WLOGFI("JsWindowStage::OnCreateSubWindow is called");
319 WMError errCode = WMError::WM_OK;
320 std::string windowName;
321 if (!ConvertFromJsValue(engine, info.argv[0], windowName)) {
322 WLOGFE("Failed to convert parameter to windowName");
323 errCode = WMError::WM_ERROR_INVALID_PARAM;
324 }
325 AsyncTask::CompleteCallback complete =
326 [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
327 if (windowScene_ == nullptr || errCode != WMError::WM_OK) {
328 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(errCode)));
329 WLOGFE("JsWindowStage windowScene_ is nullptr or invaliad params!");
330 return;
331 }
332 sptr<Rosen::WindowOption> windowOption = new Rosen::WindowOption();
333 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
334 windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
335 auto window = windowScene_->CreateWindow(windowName, windowOption);
336 if (window == nullptr) {
337 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(Rosen::WMError::WM_ERROR_NULLPTR),
338 "JsWindowStage::OnCreateSubWindow failed."));
339 WLOGFE("JsWindowStage window is nullptr");
340 return;
341 }
342 task.Resolve(engine, CreateJsWindowObject(engine, window));
343 WLOGFI("JsWindowStage OnCreateSubWindow success");
344 };
345 NativeValue* callback = (info.argv[1]->TypeOf() == NATIVE_FUNCTION) ? info.argv[1] : nullptr;
346 NativeValue* result = nullptr;
347 AsyncTask::Schedule(
348 engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
349 return result;
350 }
351
CreateJsSubWindowArrayObject(NativeEngine & engine,std::vector<sptr<Window>> subWinVec)352 NativeValue* JsWindowStage::CreateJsSubWindowArrayObject(NativeEngine& engine,
353 std::vector<sptr<Window>> subWinVec)
354 {
355 WLOGFI("JsWindowUtils::CreateJsSubWindowArrayObject is called");
356 NativeValue* objValue = engine.CreateArray(subWinVec.size());
357 NativeArray* array = ConvertNativeValueTo<NativeArray>(objValue);
358 if (array == nullptr) {
359 WLOGFE("Failed to convert subWinVec to jsArrayObject");
360 return nullptr;
361 }
362 uint32_t index = 0;
363 for (size_t i = 0; i < subWinVec.size(); i++) {
364 array->SetElement(index++, CreateJsWindowObject(engine, subWinVec[i]));
365 }
366 return objValue;
367 }
368
OnGetSubWindow(NativeEngine & engine,NativeCallbackInfo & info)369 NativeValue* JsWindowStage::OnGetSubWindow(NativeEngine& engine, NativeCallbackInfo& info)
370 {
371 WLOGFI("JsWindowStage::OnGetSubWindow is called");
372 AsyncTask::CompleteCallback complete =
373 [=](NativeEngine& engine, AsyncTask& task, int32_t status) {
374 if (windowScene_ == nullptr) {
375 task.Reject(engine, CreateJsError(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR)));
376 WLOGFE("JsWindowStage windowScene_ is nullptr!");
377 return;
378 }
379 std::vector<sptr<Window>> subWindowVec = windowScene_->GetSubWindow();
380 task.Resolve(engine, CreateJsSubWindowArrayObject(engine, subWindowVec));
381 WLOGFI("JsWindowStage OnGetSubWindow success");
382 };
383 NativeValue* callback = (info.argv[0]->TypeOf() == NATIVE_FUNCTION) ? info.argv[0] : nullptr;
384 NativeValue* result = nullptr;
385 AsyncTask::Schedule(
386 engine, CreateAsyncTaskWithLastParam(engine, callback, nullptr, std::move(complete), &result));
387 return result;
388 }
389
OnSetShowOnLockScreen(NativeEngine & engine,NativeCallbackInfo & info)390 NativeValue* JsWindowStage::OnSetShowOnLockScreen(NativeEngine& engine, NativeCallbackInfo& info)
391 {
392 if (info.argc != 1) {
393 WLOGFE("[NAPI]Argc is invalid: %{public}zu", info.argc);
394 return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_INVALID_PARAM));
395 }
396 if (windowScene_ == nullptr || windowScene_->GetMainWindow() == nullptr) {
397 WLOGFE("[NAPI]WindowScene is null or window is null");
398 return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_NULLPTR));
399 }
400
401 bool showOnLockScreen = false;
402 NativeBoolean* nativeVal = ConvertNativeValueTo<NativeBoolean>(info.argv[0]);
403 if (nativeVal == nullptr) {
404 WLOGFE("[NAPI]Failed to convert parameter to boolean");
405 return CreateJsValue(engine, static_cast<int32_t>(WMError::WM_ERROR_INVALID_PARAM));
406 } else {
407 showOnLockScreen = static_cast<bool>(*nativeVal);
408 }
409
410 auto window = windowScene_->GetMainWindow();
411 WMError ret;
412 if (showOnLockScreen) {
413 ret = window->AddWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
414 } else {
415 ret = window->RemoveWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
416 }
417 WLOGFI("[NAPI]Window [%{public}u, %{public}s] SetShowOnLockScreen %{public}u, ret = %{public}u",
418 window->GetWindowId(), window->GetWindowName().c_str(), showOnLockScreen, ret);
419
420 return CreateJsValue(engine, static_cast<int32_t>(ret));
421 }
422
CreateJsWindowStage(NativeEngine & engine,std::shared_ptr<Rosen::WindowScene> windowScene)423 NativeValue* CreateJsWindowStage(NativeEngine& engine,
424 std::shared_ptr<Rosen::WindowScene> windowScene)
425 {
426 WLOGFI("JsWindowStage::CreateJsWindowStage is called");
427 NativeValue* objValue = engine.CreateObject();
428 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
429
430 std::unique_ptr<JsWindowStage> jsWindowStage = std::make_unique<JsWindowStage>(windowScene);
431 object->SetNativePointer(jsWindowStage.release(), JsWindowStage::Finalizer, nullptr);
432
433 BindNativeFunction(engine,
434 *object, "setUIContent", JsWindowStage::SetUIContent);
435 BindNativeFunction(engine,
436 *object, "loadContent", JsWindowStage::LoadContent);
437 BindNativeFunction(engine,
438 *object, "getMainWindow", JsWindowStage::GetMainWindow);
439 BindNativeFunction(engine,
440 *object, "getWindowMode", JsWindowStage::GetWindowMode);
441 BindNativeFunction(engine,
442 *object, "createSubWindow", JsWindowStage::CreateSubWindow);
443 BindNativeFunction(engine,
444 *object, "getSubWindow", JsWindowStage::GetSubWindow);
445 BindNativeFunction(engine, *object, "on", JsWindowStage::On);
446 BindNativeFunction(engine, *object, "off", JsWindowStage::Off);
447 BindNativeFunction(engine,
448 *object, "setShowOnLockScreen", JsWindowStage::SetShowOnLockScreen);
449
450 return objValue;
451 }
452 } // namespace Rosen
453 } // namespace OHOS
454