1/* 2 * Copyright (c) 2023 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 "JsAppImpl.h" 17 18#include "CommandParser.h" 19#include "FileSystem.h" 20#include "JsonReader.h" 21#include "PreviewerEngineLog.h" 22#include "SharedData.h" 23#include "TraceTool.h" 24#include "VirtualScreenImpl.h" 25#include "external/EventHandler.h" 26#include "external/StageContext.h" 27#include "viewport_config.h" 28#include "glfw_render_context.h" 29#if defined(REPLACE_WINDOW_HEADER) 30#include "window.h" 31#endif 32#include "window_model.h" 33#include "window_display.h" 34#include "ace_preview_helper.h" 35#include "ClipboardHelper.h" 36#include "CommandLineInterface.h" 37#if defined(__APPLE__) || defined(_WIN32) 38#include "options.h" 39#include "simulator.h" 40#endif 41#include <fstream> 42 43using namespace OHOS; 44using namespace OHOS::Ace; 45 46namespace { 47ScreenInfo screenInfo; 48CommandInfo commandInfo; 49} 50 51class PreviewerListener : public OHOS::Rosen::IWindowSystemBarEnableListener { 52public: 53 OHOS::Rosen::WMError OnSetSpecificBarProperty(OHOS::Rosen::WindowType type, 54 const OHOS::Rosen::SystemBarProperty& property) 55 { 56 JsAppImpl::GetInstance().CalculateAvoidAreaByType(type, property); 57 return OHOS::Rosen::WMError::WM_OK; 58 } 59}; 60 61namespace { 62OHOS::sptr<PreviewerListener> listener = nullptr; 63} 64 65JsAppImpl::JsAppImpl() noexcept : ability(nullptr), isStop(false) 66{ 67#if defined(__APPLE__) || defined(_WIN32) 68 windowModel = std::make_shared<OHOS::Previewer::PreviewerWindowModel>(); 69#endif 70} 71 72JsAppImpl::~JsAppImpl() {} 73 74JsAppImpl& JsAppImpl::GetInstance() 75{ 76 static JsAppImpl instance; 77 return instance; 78} 79 80void JsAppImpl::Start() 81{ 82 VirtualScreenImpl::GetInstance().InitVirtualScreen(); 83 VirtualScreenImpl::GetInstance().InitAll(pipeName, pipePort); 84 isFinished = false; 85 ILOG("Start run js app"); 86 OHOS::AppExecFwk::EventHandler::SetMainThreadId(std::this_thread::get_id()); 87 RunJsApp(); 88 ILOG("Js app run finished"); 89 while (!isStop) { 90 // Execute all tasks in the main thread 91 OHOS::AppExecFwk::EventHandler::Run(); 92 glfwRenderContext->PollEvents(); 93 std::this_thread::sleep_for(std::chrono::milliseconds(1)); 94 } 95 StopAbility(); // start and stop ability at the same thread 96 ILOG("JsAppImpl::Interrupt finished"); 97 isFinished = true; 98} 99 100void JsAppImpl::Restart() 101{ 102 StopAbility(); 103} 104 105std::string JsAppImpl::GetJSONTree() 106{ 107 std::string jsonTree = ability->GetJSONTree(); 108 return jsonTree; 109} 110 111std::string JsAppImpl::GetDefaultJSONTree() 112{ 113 ILOG("Start getDefaultJsontree."); 114 std::string jsonTree = ability->GetDefaultJSONTree(); 115 ILOG("GetDefaultJsontree finished."); 116 return jsonTree; 117} 118 119void JsAppImpl::OrientationChanged(std::string commandOrientation) 120{ 121 aceRunArgs.deviceWidth = height; 122 aceRunArgs.deviceHeight = width; 123 VirtualScreenImpl::GetInstance().WidthAndHeightReverse(); 124 AdaptDeviceType(aceRunArgs, commandInfo.deviceType, aceRunArgs.deviceWidth); 125 if (commandOrientation == "portrait") { 126 aceRunArgs.deviceConfig.orientation = DeviceOrientation::PORTRAIT; 127 } else { 128 aceRunArgs.deviceConfig.orientation = DeviceOrientation::LANDSCAPE; 129 } 130 131 orientation = commandOrientation; 132 ILOG("OrientationChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth, 133 aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density); 134 if (ability != nullptr) { 135 OHOS::AppExecFwk::EventHandler::PostTask([this]() { 136 glfwRenderContext->SetWindowSize(width, height); 137 }); 138 ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density, 139 aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); 140 } 141} 142 143void JsAppImpl::ColorModeChanged(const std::string commandColorMode) 144{ 145 if (commandColorMode == "light") { 146 aceRunArgs.deviceConfig.colorMode = ColorMode::LIGHT; 147 } else { 148 aceRunArgs.deviceConfig.colorMode = ColorMode::DARK; 149 } 150 151 if (ability != nullptr) { 152 ability->OnConfigurationChanged(aceRunArgs.deviceConfig); 153 } 154} 155 156void JsAppImpl::Interrupt() 157{ 158 isStop = true; 159} 160 161void JsAppImpl::SetJsAppArgs(OHOS::Ace::Platform::AceRunArgs& args) 162{ 163 ILOG("foldStatus:%s foldWidth:%d foldHeight:%d", 164 screenInfo.foldStatus.c_str(), screenInfo.foldWidth, screenInfo.foldHeight); 165 SetAssetPath(args, jsAppPath); 166 SetProjectModel(args); 167 SetPageProfile(args, commandInfo.pages); 168 SetDeviceWidth(args, ConvertFoldStatus(screenInfo.foldStatus) == 169 OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldWidth : screenInfo.orignalResolutionWidth); 170 SetDeviceHeight(args, ConvertFoldStatus(screenInfo.foldStatus) == 171 OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldHeight : screenInfo.orignalResolutionHeight); 172 SetWindowTitle(args, "Ace"); 173 SetUrl(args, urlPath); 174 SetConfigChanges(args, configChanges); 175 SetColorMode(args, colorMode); 176 SetOrientation(args, orientation); 177 SetAceVersionArgs(args, aceVersion); 178 SetDeviceScreenDensity(atoi(screenDensity.c_str()), commandInfo.deviceType); 179 SetLanguage(args, SharedData<std::string>::GetData(SharedDataType::LAN)); 180 SetRegion(args, SharedData<std::string>::GetData(SharedDataType::REGION)); 181 SetScript(args, ""); 182 SetSystemResourcesPath(args); 183 SetAppResourcesPath(args, commandInfo.appResourcePath); 184 SetFormsEnabled(args, commandInfo.isCardDisplay); 185 SetContainerSdkPath(args, commandInfo.containerSdkPath); 186 AdaptDeviceType(args, commandInfo.deviceType, ConvertFoldStatus(screenInfo.foldStatus) == 187 OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldWidth : screenInfo.orignalResolutionWidth); 188 SetOnRouterChange(args); 189 SetOnError(args); 190 SetComponentModeEnabled(args, commandInfo.isComponentMode); 191 SetPkgContextInfo(); 192#ifdef COMPONENT_TEST_ENABLED 193 SetComponentTestConfig(args, componentTestModeConfig); 194#endif // COMPONENT_TEST_ENABLED 195 ILOG("start ability: %d %d %f", args.deviceWidth, args.deviceHeight, args.deviceConfig.density); 196} 197 198void JsAppImpl::RunJsApp() 199{ 200 ILOG("RunJsApp 1"); 201 InitScreenInfo(); 202 AssignValueForWidthAndHeight(screenInfo.orignalResolutionWidth, screenInfo.orignalResolutionHeight, 203 screenInfo.compressionResolutionWidth, screenInfo.compressionResolutionHeight); 204 SetJsAppArgs(aceRunArgs); 205 OHOS::Ide::StageContext::GetInstance().SetLoaderJsonPath(commandInfo.loaderJsonPath); 206 OHOS::Ide::StageContext::GetInstance().SetHosSdkPath(commandInfo.containerSdkPath); 207 OHOS::Ide::StageContext::GetInstance().GetModulePathMapFromLoaderJson(); 208 OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldable(screenInfo.foldable); 209 OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(ConvertFoldStatus(screenInfo.foldStatus)); 210 InitGlfwEnv(); 211 Platform::AcePreviewHelper::GetInstance()->SetCallbackOfPostTask(AppExecFwk::EventHandler::PostTask); 212 Platform::AcePreviewHelper::GetInstance()-> 213 SetCallbackOfIsCurrentRunnerThread(AppExecFwk::EventHandler::IsCurrentRunnerThread); 214 Platform::AcePreviewHelper::GetInstance()->SetCallbackOfSetClipboardData(ClipboardHelper::SetClipboardData); 215 Platform::AcePreviewHelper::GetInstance()->SetCallbackOfGetClipboardData(ClipboardHelper::GetClipboardData); 216 listener = new(std::nothrow) PreviewerListener(); 217 if (!listener) { 218 ELOG("Memory allocation failed: listener."); 219 return; 220 } 221 if (isDebug && debugServerPort >= 0) { 222 RunDebugAbility(); // for debug preview 223 } else { 224 RunNormalAbility(); // for normal preview 225 } 226} 227 228void JsAppImpl::RunNormalAbility() 229{ 230 Platform::AcePreviewHelper::GetInstance()->SetCallbackOfHspBufferTracker( 231 [](const std::string& inputPath, uint8_t** buff, size_t* buffSize, std::string &errorMsg) -> bool { 232 if (!buff || !buffSize || inputPath.empty()) { 233 return false; 234 } 235 auto data = OHOS::Ide::StageContext::GetInstance().GetModuleBuffer(inputPath); 236 if (!data) { 237 return false; 238 } 239 *buff = data->data(); 240 *buffSize = data->size(); 241 return true; 242 }); 243 if (ability != nullptr) { 244 ability.reset(); 245 } 246 TraceTool::GetInstance().HandleTrace("Launch Js App"); 247 ability = Platform::AceAbility::CreateInstance(aceRunArgs); 248 if (ability == nullptr) { 249 ELOG("JsApp::Run ability create failed."); 250 return; 251 } 252 SetMockJsonInfo(); 253 OHOS::Rosen::WMError errCode; 254 OHOS::sptr<OHOS::Rosen::WindowOption> sp = nullptr; 255 auto window = OHOS::Rosen::Window::Create("previewer", sp, nullptr, errCode); 256 window->RegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener)); 257 window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallback)); 258 window->CreateSurfaceNode("preview_surface", std::move(VirtualScreenImpl::Callback)); 259 ability->SetWindow(window); 260 InitAvoidAreas(window); 261 ability->InitEnv(); 262} 263 264#if defined(__APPLE__) || defined(_WIN32) 265void JsAppImpl::RunDebugAbility() 266{ 267 // init window params 268 SetWindowParams(); 269 OHOS::Previewer::PreviewerWindow::GetInstance().SetWindowParams(*windowModel); 270 // start ability 271 OHOS::AbilityRuntime::Options options; 272 SetSimulatorParams(options); 273 simulator = OHOS::AbilityRuntime::Simulator::Create(options); 274 if (!simulator) { 275 ELOG("JsApp::Run simulator create failed."); 276 return; 277 } 278 simulator->SetHostResolveBufferTracker( 279 [](const std::string &inputPath, uint8_t **buff, size_t *buffSize, std::string &errorMsg) -> bool { 280 if (inputPath.empty() || buff == nullptr || buffSize == nullptr) { 281 ELOG("Param invalid."); 282 return false; 283 } 284 285 DLOG("Get module buffer, input path: %{public}s.", inputPath.c_str()); 286 auto data = Ide::StageContext::GetInstance().GetModuleBuffer(inputPath); 287 if (data == nullptr) { 288 ELOG("Get module buffer failed, input path: %{public}s.", inputPath.c_str()); 289 return false; 290 } 291 292 *buff = data->data(); 293 *buffSize = data->size(); 294 return true; 295 }); 296 SetMockJsonInfo(); 297 std::string abilitySrcPath = commandInfo.abilityPath; 298 std::string abilityName = commandInfo.abilityName; 299 debugAbilityId = simulator->StartAbility(abilitySrcPath, [](int64_t abilityId) {}, abilityName); 300 if (debugAbilityId < 0) { 301 ELOG("JsApp::Run ability start failed. abilitySrcPath:%s abilityName:%s", abilitySrcPath.c_str(), 302 abilityName.c_str()); 303 return; 304 } 305 // set onRender callback 306 OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); 307 if (!window) { 308 ELOG("JsApp::Run get window failed."); 309 return; 310 } 311 window->RegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener)); 312 window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallback)); 313 window->CreateSurfaceNode(options.moduleName, std::move(VirtualScreenImpl::Callback)); 314 InitAvoidAreas(window); 315} 316 317void JsAppImpl::SetSimulatorParams(OHOS::AbilityRuntime::Options& options) 318{ 319 const std::string path = commandInfo.appResourcePath + FileSystem::GetSeparator() + "module.json"; 320 if (!FileSystem::IsFileExists(path)) { 321 ELOG("The module.json file is not exist."); 322 return; 323 } 324 std::optional<std::vector<uint8_t>> ctx = OHOS::Ide::StageContext::GetInstance().ReadFileContents(path); 325 if (ctx.has_value()) { 326 options.moduleJsonBuffer = ctx.value(); 327 } else { 328 ELOG("get module.json content failed"); 329 } 330 SetSimulatorCommonParams(options); 331 ILOG("setted bundleName:%s moduleName:%s", options.modulePath.c_str(), options.resourcePath.c_str()); 332} 333 334void JsAppImpl::SetSimulatorCommonParams(OHOS::AbilityRuntime::Options& options) 335{ 336 options.modulePath = aceRunArgs.assetPath + FileSystem::GetSeparator() + "modules.abc"; 337 options.resourcePath = commandInfo.appResourcePath + FileSystem::GetSeparator() + "resources.index"; 338 if (debugServerPort > 0) { 339 options.debugPort = debugServerPort; 340 } 341 options.assetPath = aceRunArgs.assetPath; 342 options.systemResourcePath = aceRunArgs.systemResourcesPath; 343 options.appResourcePath = aceRunArgs.appResourcesPath; 344 options.containerSdkPath = aceRunArgs.containerSdkPath; 345 options.url = aceRunArgs.url; 346 options.language = aceRunArgs.language; 347 options.region = aceRunArgs.region; 348 options.script = aceRunArgs.script; 349 options.themeId = aceRunArgs.themeId; 350 options.deviceWidth = aceRunArgs.deviceWidth; 351 options.deviceHeight = aceRunArgs.deviceHeight; 352 options.isRound = aceRunArgs.isRound; 353 options.onRouterChange = aceRunArgs.onRouterChange; 354 options.pkgContextInfoJsonStringMap = aceRunArgs.pkgContextInfoJsonStringMap; 355 options.packageNameList = aceRunArgs.packageNameList; 356 OHOS::AbilityRuntime::DeviceConfig deviceCfg; 357 deviceCfg.deviceType = SetDevice<OHOS::AbilityRuntime::DeviceType>(aceRunArgs.deviceConfig.deviceType); 358 deviceCfg.orientation = SetOrientation<OHOS::AbilityRuntime::DeviceOrientation>( 359 aceRunArgs.deviceConfig.orientation); 360 deviceCfg.colorMode = SetColorMode<OHOS::AbilityRuntime::ColorMode>(aceRunArgs.deviceConfig.colorMode); 361 deviceCfg.density = aceRunArgs.deviceConfig.density; 362 options.deviceConfig = deviceCfg; 363 std::string fPath = commandInfo.configPath; 364 options.configuration = UpdateConfiguration(aceRunArgs); 365 std::size_t pos = fPath.find(".idea"); 366 if (pos == std::string::npos) { 367 ELOG("previewPath error:%s", fPath.c_str()); 368 } else { 369 options.previewPath = fPath.substr(0, pos) + ".idea" + FileSystem::GetSeparator() + "previewer"; 370 ILOG("previewPath info:%s", options.previewPath.c_str()); 371 } 372 options.postTask = AppExecFwk::EventHandler::PostTask; 373} 374 375std::shared_ptr<AppExecFwk::Configuration> JsAppImpl::UpdateConfiguration(OHOS::Ace::Platform::AceRunArgs& args) 376{ 377 std::shared_ptr<AppExecFwk::Configuration> configuration = std::make_shared<AppExecFwk::Configuration>(); 378 configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, 379 SharedData<std::string>::GetData(SharedDataType::LANGUAGE)); 380 std::string colorMode = "light"; 381 if (aceRunArgs.deviceConfig.colorMode == ColorMode::DARK) { 382 colorMode = "dark"; 383 } 384 configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, colorMode); 385 std::string direction = "portrait"; 386 if (aceRunArgs.deviceConfig.orientation == DeviceOrientation::LANDSCAPE) { 387 orientation = "landscape"; 388 } 389 configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, direction); 390 std::string density = std::to_string(aceRunArgs.deviceConfig.density); 391 configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, density); 392 return configuration; 393} 394 395 396void JsAppImpl::SetWindowParams() const 397{ 398 windowModel->isRound = aceRunArgs.isRound; 399 windowModel->originWidth = aceRunArgs.deviceWidth; 400 windowModel->originHeight = aceRunArgs.deviceHeight; 401 windowModel->compressWidth = aceRunArgs.deviceWidth; 402 windowModel->compressHeight = aceRunArgs.deviceHeight; 403 windowModel->density = aceRunArgs.deviceConfig.density; 404 windowModel->deviceType = SetDevice<OHOS::Previewer::DeviceType>(aceRunArgs.deviceConfig.deviceType); 405 windowModel->orientation = SetOrientation<OHOS::Previewer::Orientation>(aceRunArgs.deviceConfig.orientation); 406 windowModel->colorMode = SetColorMode<OHOS::Previewer::ColorMode>(aceRunArgs.deviceConfig.colorMode); 407} 408#else 409 void JsAppImpl::RunDebugAbility() 410 { 411 ELOG("JsApp::Run ability start failed.Linux is not supported."); 412 return; 413 } 414#endif 415 416void JsAppImpl::AdaptDeviceType(Platform::AceRunArgs& args, const std::string type, 417 const int32_t realDeviceWidth, double screenDendity) const 418{ 419 if (type == "wearable") { 420 args.deviceConfig.deviceType = DeviceType::WATCH; 421 double density = screenDendity > 0 ? screenDendity : watchScreenDensity; 422 double adaptWidthWatch = realDeviceWidth * BASE_SCREEN_DENSITY / density; 423 args.deviceConfig.density = args.deviceWidth / adaptWidthWatch; 424 return; 425 } 426 if (type == "tv") { 427 args.deviceConfig.deviceType = DeviceType::TV; 428 double density = screenDendity > 0 ? screenDendity : tvScreenDensity; 429 double adaptWidthTv = realDeviceWidth * BASE_SCREEN_DENSITY / density; 430 args.deviceConfig.density = args.deviceWidth / adaptWidthTv; 431 return; 432 } 433 if (type == "phone" || type == "default") { 434 args.deviceConfig.deviceType = DeviceType::PHONE; 435 double density = screenDendity > 0 ? screenDendity : phoneScreenDensity; 436 double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density; 437 args.deviceConfig.density = args.deviceWidth / adaptWidthPhone; 438 return; 439 } 440 if (type == "2in1") { 441 args.deviceConfig.deviceType = DeviceType::TWO_IN_ONE; 442 double density = screenDendity > 0 ? screenDendity : twoInOneScreenDensity; 443 double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density; 444 args.deviceConfig.density = args.deviceWidth / adaptWidthPhone; 445 return; 446 } 447 if (type == "tablet") { 448 args.deviceConfig.deviceType = DeviceType::TABLET; 449 double density = screenDendity > 0 ? screenDendity : tabletScreenDensity; 450 double adaptWidthTablet = realDeviceWidth * BASE_SCREEN_DENSITY / density; 451 args.deviceConfig.density = args.deviceWidth / adaptWidthTablet; 452 return; 453 } 454 if (type == "car") { 455 args.deviceConfig.deviceType = DeviceType::CAR; 456 double density = screenDendity > 0 ? screenDendity : carScreenDensity; 457 double adaptWidthCar = realDeviceWidth * BASE_SCREEN_DENSITY / density; 458 args.deviceConfig.density = args.deviceWidth / adaptWidthCar; 459 return; 460 } 461 ELOG("DeviceType not supported : %s", type.c_str()); 462 return; 463} 464 465void JsAppImpl::SetAssetPath(Platform::AceRunArgs& args, const std::string assetPath) const 466{ 467 args.assetPath = assetPath; 468} 469 470void JsAppImpl::SetProjectModel(Platform::AceRunArgs& args) const 471{ 472 int idxVal = CommandParser::GetInstance().GetProjectModelEnumValue(); 473 ILOG("ProjectModel: %s", CommandParser::GetInstance().GetProjectModelEnumName(idxVal).c_str()); 474 args.projectModel = Platform::ProjectModel(idxVal); 475} 476 477void JsAppImpl::SetPageProfile(Platform::AceRunArgs& args, const std::string pageProfile) const 478{ 479 args.pageProfile = pageProfile; 480} 481 482void JsAppImpl::SetDeviceWidth(Platform::AceRunArgs& args, const int32_t deviceWidth) const 483{ 484 args.deviceWidth = deviceWidth; 485} 486 487void JsAppImpl::SetDeviceHeight(Platform::AceRunArgs& args, const int32_t deviceHeight) const 488{ 489 args.deviceHeight = deviceHeight; 490} 491 492void JsAppImpl::SetWindowTitle(Platform::AceRunArgs& args, const std::string windowTitle) const 493{ 494 args.windowTitle = windowTitle; 495} 496 497void JsAppImpl::SetUrl(Platform::AceRunArgs& args, const std::string urlPath) const 498{ 499 args.url = urlPath; 500} 501 502void JsAppImpl::SetConfigChanges(Platform::AceRunArgs& args, const std::string configChanges) const 503{ 504 args.configChanges = configChanges; 505} 506 507void JsAppImpl::SetColorMode(Platform::AceRunArgs& args, const std::string colorMode) const 508{ 509 ILOG("JsAppImpl::RunJsApp SetColorMode: %s", colorMode.c_str()); 510 if (colorMode == "dark") { 511 args.deviceConfig.colorMode = ColorMode::DARK; 512 } else { 513 args.deviceConfig.colorMode = ColorMode::LIGHT; 514 } 515} 516 517void JsAppImpl::SetOrientation(Platform::AceRunArgs& args, const std::string orientation) const 518{ 519 ILOG("JsAppImpl::RunJsApp SetOrientation: %s", orientation.c_str()); 520 if (orientation == "landscape") { 521 args.deviceConfig.orientation = DeviceOrientation::LANDSCAPE; 522 } else { 523 args.deviceConfig.orientation = DeviceOrientation::PORTRAIT; 524 } 525} 526 527void JsAppImpl::SetAceVersionArgs(Platform::AceRunArgs& args, const std::string aceVersion) const 528{ 529 ILOG("JsAppImpl::RunJsApp SetAceVersionArgs: %s", aceVersion.c_str()); 530 if (aceVersion == "ACE_2_0") { 531 args.aceVersion = Platform::AceVersion::ACE_2_0; 532 } else { 533 args.aceVersion = Platform::AceVersion::ACE_1_0; 534 } 535} 536 537void JsAppImpl::SetLanguage(Platform::AceRunArgs& args, const std::string language) const 538{ 539 args.language = language; 540} 541 542void JsAppImpl::SetRegion(Platform::AceRunArgs& args, const std::string region) const 543{ 544 args.region = region; 545} 546 547void JsAppImpl::SetScript(Platform::AceRunArgs& args, const std::string script) const 548{ 549 args.script = script; 550} 551 552void JsAppImpl::SetSystemResourcesPath(Platform::AceRunArgs& args) const 553{ 554 std::string sep = FileSystem::GetSeparator(); 555 std::string rPath = FileSystem::GetApplicationPath(); 556 rPath = FileSystem::NormalizePath(rPath); 557 int idx = rPath.find_last_of(sep); 558 rPath = rPath.substr(0, idx + 1) + "resources"; 559 args.systemResourcesPath = rPath; 560} 561 562void JsAppImpl::SetAppResourcesPath(Platform::AceRunArgs& args, const std::string appResourcesPath) const 563{ 564 args.appResourcesPath = appResourcesPath; 565} 566 567void JsAppImpl::SetFormsEnabled(Platform::AceRunArgs& args, bool formsEnabled) const 568{ 569 args.formsEnabled = formsEnabled; 570} 571 572void JsAppImpl::SetContainerSdkPath(Platform::AceRunArgs& args, const std::string containerSdkPath) const 573{ 574 args.containerSdkPath = containerSdkPath; 575} 576 577void JsAppImpl::SetOnRouterChange(Platform::AceRunArgs& args) const 578{ 579 args.onRouterChange = std::move(VirtualScreenImpl::PageCallback); 580} 581 582void JsAppImpl::SetOnError(Platform::AceRunArgs& args) const 583{ 584 args.onError = std::move(VirtualScreenImpl::FastPreviewCallback); 585} 586 587void JsAppImpl::SetComponentModeEnabled(Platform::AceRunArgs& args, bool isComponentMode) const 588{ 589 args.isComponentMode = isComponentMode; 590} 591 592void JsAppImpl::AssignValueForWidthAndHeight(const int32_t origWidth, 593 const int32_t origHeight, 594 const int32_t compWidth, 595 const int32_t compHeight) 596{ 597 orignalWidth = origWidth; 598 orignalHeight = origHeight; 599 width = compWidth; 600 height = compHeight; 601 ILOG("AssignValueForWidthAndHeight: %d %d %d %d", orignalWidth, orignalHeight, width, height); 602} 603 604void JsAppImpl::ResolutionChanged(ResolutionParam& param, int32_t screenDensity, std::string reason) 605{ 606 SetResolutionParams(param.orignalWidth, param.orignalHeight, param.compressionWidth, 607 param.compressionHeight, screenDensity); 608 if (isDebug && debugServerPort >= 0) { 609#if defined(__APPLE__) || defined(_WIN32) 610 SetWindowParams(); 611 OHOS::Ace::ViewportConfig config; 612 config.SetSize(windowModel->originWidth, windowModel->originHeight); 613 config.SetPosition(0, 0); 614 config.SetOrientation(static_cast<int32_t>( 615 OHOS::Previewer::PreviewerWindow::TransOrientation(windowModel->orientation))); 616 config.SetDensity(windowModel->density); 617 OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); 618 if (!window) { 619 ELOG("JsApp::Run get window failed."); 620 return; 621 } 622 InitAvoidAreas(window); 623 OHOS::AppExecFwk::EventHandler::PostTask([this]() { 624 glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); 625 }); 626 simulator->UpdateConfiguration(*(UpdateConfiguration(aceRunArgs).get())); 627 window->SetViewportConfig(config); 628#endif 629 } else { 630 if (ability != nullptr) { 631 InitAvoidAreas(ability->GetWindow()); 632 OHOS::AppExecFwk::EventHandler::PostTask([this]() { 633 glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); 634 }); 635 ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density, 636 aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, ConvertResizeReason(reason)); 637 } 638 } 639} 640 641WindowSizeChangeReason JsAppImpl::ConvertResizeReason(std::string reason) 642{ 643 if (reason == "undefined") { 644 return WindowSizeChangeReason::UNDEFINED; 645 } else if (reason == "rotation") { 646 return WindowSizeChangeReason::ROTATION; 647 } else { 648 return WindowSizeChangeReason::RESIZE; 649 } 650} 651 652void JsAppImpl::SetResolutionParams(int32_t changedOriginWidth, int32_t changedOriginHeight, int32_t changedWidth, 653 int32_t changedHeight, int32_t screenDensity) 654{ 655 SetDeviceWidth(aceRunArgs, changedWidth); 656 SetDeviceHeight(aceRunArgs, changedHeight); 657 orignalWidth = changedOriginWidth; 658 orignalHeight = changedOriginHeight; 659 SetDeviceScreenDensity(screenDensity, commandInfo.deviceType); 660 AdaptDeviceType(aceRunArgs, commandInfo.deviceType, changedOriginWidth); 661 AssignValueForWidthAndHeight(changedOriginWidth, changedOriginHeight, changedWidth, changedHeight); 662 if (changedWidth <= changedHeight) { 663 JsAppImpl::GetInstance().SetDeviceOrentation("portrait"); 664 } else { 665 JsAppImpl::GetInstance().SetDeviceOrentation("landscape"); 666 } 667 SetOrientation(aceRunArgs, orientation); 668 VirtualScreenImpl::GetInstance().SetCurrentResolution(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); 669 ILOG("ResolutionChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth, 670 aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density); 671} 672 673void JsAppImpl::SetArgsColorMode(const std::string& value) 674{ 675 colorMode = value; 676} 677 678void JsAppImpl::SetArgsAceVersion(const std::string& value) 679{ 680 aceVersion = value; 681} 682 683void JsAppImpl::SetDeviceOrentation(const std::string& value) 684{ 685 orientation = value; 686} 687 688std::string JsAppImpl::GetOrientation() const 689{ 690 return orientation; 691} 692 693std::string JsAppImpl::GetColorMode() const 694{ 695 return colorMode; 696} 697 698void JsAppImpl::SetDeviceScreenDensity(const int32_t screenDensity, const std::string type) 699{ 700 if (type == "wearable" && screenDensity != 0) { 701 watchScreenDensity = screenDensity; 702 return; 703 } 704 if (type == "tv" && screenDensity != 0) { 705 tvScreenDensity = screenDensity; 706 return; 707 } 708 if ((type == "phone" || type == "default") && screenDensity != 0) { 709 phoneScreenDensity = screenDensity; 710 return; 711 } 712 if (type == "2in1" && screenDensity != 0) { 713 twoInOneScreenDensity = screenDensity; 714 return; 715 } 716 if (type == "tablet" && screenDensity != 0) { 717 tabletScreenDensity = screenDensity; 718 return; 719 } 720 if (type == "car" && screenDensity != 0) { 721 carScreenDensity = screenDensity; 722 return; 723 } 724 ILOG("DeviceType not supported to SetDeviceScreenDensity: %s", type.c_str()); 725 return; 726} 727 728void JsAppImpl::ReloadRuntimePage(const std::string currentPage) 729{ 730 std::string params = ""; 731 if (ability != nullptr) { 732 ability->ReplacePage(currentPage, params); 733 } 734} 735 736void JsAppImpl::SetScreenDensity(const std::string value) 737{ 738 screenDensity = value; 739} 740 741void JsAppImpl::SetConfigChanges(const std::string value) 742{ 743 configChanges = value; 744} 745 746bool JsAppImpl::MemoryRefresh(const std::string memoryRefreshArgs) const 747{ 748 ILOG("MemoryRefresh."); 749 if (ability != nullptr) { 750 return ability->OperateComponent(memoryRefreshArgs); 751 } 752 return false; 753} 754 755void JsAppImpl::ParseSystemParams(OHOS::Ace::Platform::AceRunArgs& args, const Json2::Value& paramObj) 756{ 757 if (paramObj.IsNull()) { 758 SetDeviceWidth(args, VirtualScreenImpl::GetInstance().GetCompressionWidth()); 759 SetDeviceHeight(args, VirtualScreenImpl::GetInstance().GetCompressionHeight()); 760 AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight, 761 args.deviceWidth, args.deviceHeight); 762 SetColorMode(args, colorMode); 763 SetOrientation(args, orientation); 764 SetDeviceScreenDensity(atoi(screenDensity.c_str()), commandInfo.deviceType); 765 AdaptDeviceType(args, commandInfo.deviceType, aceRunArgs.deviceWidth); 766 SetLanguage(args, SharedData<std::string>::GetData(SharedDataType::LAN)); 767 SetRegion(args, SharedData<std::string>::GetData(SharedDataType::REGION)); 768 } else { 769 SetDeviceWidth(args, paramObj["width"].AsInt()); 770 SetDeviceHeight(args, paramObj["height"].AsInt()); 771 AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight, 772 args.deviceWidth, args.deviceHeight); 773 SetColorMode(args, paramObj["colorMode"].AsString()); 774 SetOrientation(args, paramObj["orientation"].AsString()); 775 std::string deviceType = paramObj["deviceType"].AsString(); 776 SetDeviceScreenDensity(atoi(screenDensity.c_str()), deviceType); 777 AdaptDeviceType(args, deviceType, args.deviceWidth, paramObj["dpi"].AsDouble()); 778 std::string lanInfo = paramObj["locale"].AsString(); 779 SetLanguage(args, lanInfo.substr(0, lanInfo.find("_"))); 780 SetRegion(args, lanInfo.substr(lanInfo.find("_") + 1, lanInfo.length() - 1)); 781 } 782} 783 784void JsAppImpl::SetSystemParams(OHOS::Ace::Platform::SystemParams& params, const Json2::Value& paramObj) 785{ 786 ParseSystemParams(aceRunArgs, paramObj); 787 params.deviceWidth = aceRunArgs.deviceWidth; 788 params.deviceHeight = aceRunArgs.deviceHeight; 789 params.language = aceRunArgs.language; 790 params.region = aceRunArgs.region; 791 params.colorMode = aceRunArgs.deviceConfig.colorMode; 792 params.orientation = aceRunArgs.deviceConfig.orientation; 793 params.deviceType = aceRunArgs.deviceConfig.deviceType; 794 params.density = aceRunArgs.deviceConfig.density; 795 params.isRound = (paramObj.IsNull()) ? (commandInfo.screenShape == "circle") : 796 paramObj["roundScreen"].AsBool(); 797} 798 799void JsAppImpl::LoadDocument(const std::string filePath, 800 const std::string componentName, 801 const Json2::Value& previewContext) 802{ 803 ILOG("LoadDocument."); 804 if (ability != nullptr) { 805 OHOS::Ace::Platform::SystemParams params; 806 SetSystemParams(params, previewContext); 807 ILOG("LoadDocument params is density: %f region: %s language: %s deviceWidth: %d\ 808 deviceHeight: %d isRound:%d colorMode:%s orientation: %s deviceType: %s", 809 params.density, 810 params.region.c_str(), 811 params.language.c_str(), 812 params.deviceWidth, 813 params.deviceHeight, 814 (params.isRound ? "true" : "false"), 815 ((params.colorMode == ColorMode::DARK) ? "dark" : "light"), 816 ((params.orientation == DeviceOrientation::LANDSCAPE) ? "landscape" : "portrait"), 817 GetDeviceTypeName(params.deviceType).c_str()); 818 OHOS::AppExecFwk::EventHandler::PostTask([this]() { 819 glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); 820 }); 821 ability->LoadDocument(filePath, componentName, params); 822 } 823} 824 825void JsAppImpl::DispatchBackPressedEvent() const 826{ 827 ability->OnBackPressed(); 828} 829void JsAppImpl::DispatchKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent) const 830{ 831 if (isDebug && debugServerPort >= 0) { 832#if defined(__APPLE__) || defined(_WIN32) 833 OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); 834 if (!window) { 835 ELOG("JsApp::Run get window failed."); 836 return; 837 } 838 window->ConsumeKeyEvent(keyEvent); 839#endif 840 } else { 841 ability->OnInputEvent(keyEvent); 842 } 843} 844void JsAppImpl::DispatchPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) const 845{ 846 if (isDebug && debugServerPort >= 0) { 847#if defined(__APPLE__) || defined(_WIN32) 848 OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); 849 if (!window) { 850 ELOG("JsApp::Run get window failed."); 851 return; 852 } 853 window->ConsumePointerEvent(pointerEvent); 854#endif 855 } else { 856 ability->OnInputEvent(pointerEvent); 857 } 858} 859void JsAppImpl::DispatchAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) const 860{ 861 ability->OnInputEvent(axisEvent); 862} 863void JsAppImpl::DispatchInputMethodEvent(const unsigned int codePoint) const 864{ 865 ability->OnInputMethodEvent(codePoint); 866} 867 868std::string JsAppImpl::GetDeviceTypeName(const OHOS::Ace::DeviceType type) const 869{ 870 switch (type) { 871 case DeviceType::WATCH: 872 return "watch"; 873 case DeviceType::TV: 874 return "tv"; 875 case DeviceType::PHONE: 876 return "phone"; 877 case DeviceType::TABLET: 878 return "tablet"; 879 case DeviceType::CAR: 880 return "car"; 881 default: 882 return ""; 883 } 884} 885 886void JsAppImpl::InitGlfwEnv() 887{ 888 ILOG("InitGlfwEnv started"); 889 glfwRenderContext = OHOS::Rosen::GlfwRenderContext::GetGlobal(); 890 if (!glfwRenderContext->Init()) { 891 ELOG("Could not create window: InitGlfwEnv failed."); 892 return; 893 } 894 glfwRenderContext->CreateGlfwWindow(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, false); 895 ILOG("InitGlfwEnv finished"); 896} 897 898void JsAppImpl::SetMockJsonInfo() 899{ 900 std::string filePath = commandInfo.appResourcePath + FileSystem::GetSeparator() + "mock-config.json"; 901 if (isDebug && debugServerPort >= 0) { 902#if defined(__APPLE__) || defined(_WIN32) 903 simulator->SetMockList(Ide::StageContext::GetInstance().ParseMockJsonFile(filePath)); 904#endif 905 } else { 906 ability->SetMockModuleList(Ide::StageContext::GetInstance().ParseMockJsonFile(filePath)); 907 } 908} 909 910void JsAppImpl::SetPkgContextInfo() 911{ 912 Ide::StageContext::GetInstance().SetPkgContextInfo(aceRunArgs.pkgContextInfoJsonStringMap, 913 aceRunArgs.packageNameList); 914} 915 916void JsAppImpl::FoldStatusChanged(const std::string commandFoldStatus, int32_t currentWidth, int32_t currentHeight) 917{ 918 std::string reason = "resize"; 919 ILOG("FoldStatusChanged commandFoldStatus:%s", commandFoldStatus.c_str()); 920 VirtualScreenImpl::GetInstance().SetFoldStatus(commandFoldStatus); 921 OHOS::Rosen::FoldStatus status = ConvertFoldStatus(commandFoldStatus); 922 // execute callback 923 OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(status); 924 OHOS::Previewer::PreviewerDisplay::GetInstance().ExecStatusChangedCallback(); 925 if (status == OHOS::Rosen::FoldStatus::UNKNOWN) { 926 return; // unknown status do nothing 927 } 928 // change resolution 929 ResolutionParam param(currentWidth, currentHeight, currentWidth, currentHeight); 930 ResolutionChanged(param, atoi(screenDensity.c_str()), reason); 931} 932 933OHOS::Rosen::FoldStatus JsAppImpl::ConvertFoldStatus(std::string value) const 934{ 935 OHOS::Rosen::FoldStatus foldStatus = OHOS::Rosen::FoldStatus::EXPAND; 936 if (value == "fold") { 937 foldStatus = OHOS::Rosen::FoldStatus::FOLDED; 938 } else if (value == "unfold") { 939 foldStatus = OHOS::Rosen::FoldStatus::EXPAND; 940 } else if (value == "half_fold") { 941 foldStatus = OHOS::Rosen::FoldStatus::HALF_FOLD; 942 } else { 943 foldStatus = OHOS::Rosen::FoldStatus::UNKNOWN; 944 } 945 return foldStatus; 946} 947 948void JsAppImpl::SetAvoidArea(const AvoidAreas& areas) 949{ 950 avoidInitialAreas = areas; 951} 952 953void JsAppImpl::CalculateAvoidAreaByType(OHOS::Rosen::WindowType type, 954 const OHOS::Rosen::SystemBarProperty& property) 955{ 956 uint32_t deviceWidth = static_cast<uint32_t>(aceRunArgs.deviceWidth); 957 uint32_t deviceHeight = static_cast<uint32_t>(aceRunArgs.deviceHeight); 958 OHOS::Rosen::Window* window = GetWindow(); 959 if (!window) { 960 ELOG("GetWindow failed"); 961 return; 962 } 963 sptr<OHOS::Rosen::AvoidArea> statusArea(new(std::nothrow) OHOS::Rosen::AvoidArea()); 964 if (!statusArea) { 965 ELOG("new OHOS::Rosen::AvoidArea failed"); 966 return; 967 } 968 if (OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR == type) { 969 if (property.enable_) { 970 statusArea->topRect_ = {0, 0, deviceWidth, avoidInitialAreas.topRect.height}; 971 window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM); 972 } else { 973 statusArea->topRect_ = {0, 0, 0, 0}; 974 window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM); 975 } 976 UpdateAvoidArea2Ide("topRect", statusArea->topRect_); 977 } else if (OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR == type) { 978 if (property.enable_) { 979 statusArea->bottomRect_ = {0, deviceHeight - avoidInitialAreas.bottomRect.height, 980 deviceWidth, avoidInitialAreas.bottomRect.height}; 981 window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR); 982 } else { 983 statusArea->bottomRect_ = {0, 0, 0, 0}; 984 window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR); 985 } 986 UpdateAvoidArea2Ide("bottomRect", statusArea->bottomRect_); 987 } else { 988 return; // currently not support 989 } 990} 991 992void JsAppImpl::UpdateAvoidArea2Ide(const std::string& key, const OHOS::Rosen::Rect& value) 993{ 994 Json2::Value son = JsonReader::CreateObject(); 995 son.Add("posX", value.posX_); 996 son.Add("posY", value.posY_); 997 son.Add("width", value.width_); 998 son.Add("height", value.height_); 999 Json2::Value val = JsonReader::CreateObject(); 1000 val.Add(key.c_str(), son); 1001 CommandLineInterface::GetInstance().CreatCommandToSendData("AvoidAreaChanged", val, "get"); 1002} 1003 1004OHOS::Rosen::Window* JsAppImpl::GetWindow() const 1005{ 1006 if (isDebug && debugServerPort >= 0) { 1007#if defined(__APPLE__) || defined(_WIN32) 1008 return OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); 1009#else 1010 return nullptr; 1011#endif 1012 } else { 1013 return ability->GetWindow(); 1014 } 1015} 1016 1017void JsAppImpl::InitAvoidAreas(OHOS::Rosen::Window* window) 1018{ 1019 CalculateAvoidAreaByType(OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR, 1020 window->GetSystemBarPropertyByType(OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR)); 1021 CalculateAvoidAreaByType(OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR, 1022 window->GetSystemBarPropertyByType(OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR)); 1023} 1024 1025void JsAppImpl::InitJsApp() 1026{ 1027 CommandParser& parser = CommandParser::GetInstance(); 1028 InitCommandInfo(); 1029 SetJsAppPath(parser.Value("j")); 1030 if (parser.IsSet("s")) { 1031 SetPipeName(parser.Value("s")); 1032 } 1033 if (parser.IsSet("url")) { 1034 SetUrlPath(parser.Value("url")); 1035 } 1036 if (parser.IsSet("lws")) { 1037 SetPipePort(parser.Value("lws")); 1038 } 1039 if (parser.IsSet("cm")) { 1040 SetArgsColorMode(parser.Value("cm")); 1041 } 1042 if (parser.IsSet("av")) { 1043 SetArgsAceVersion(parser.Value("av")); 1044 } 1045 if (parser.IsSet("sd")) { 1046 SetScreenDensity(parser.Value("sd")); 1047 } 1048 if (parser.IsSet("cc")) { 1049 SetConfigChanges(parser.Value("cc")); 1050 } 1051 if (commandInfo.compressionResolutionWidth <= commandInfo.compressionResolutionHeight) { 1052 SetDeviceOrentation("portrait"); 1053 } else { 1054 SetDeviceOrentation("landscape"); 1055 } 1056 if (parser.IsSet("d")) { 1057 SetIsDebug(true); 1058 if (parser.IsSet("p")) { 1059 SetDebugServerPort(static_cast<uint16_t>(atoi(parser.Value("p").c_str()))); 1060 } 1061 } 1062#ifdef COMPONENT_TEST_ENABLED 1063 if (parser.IsSet("componentTest")) { 1064 JsAppImpl::GetInstance().SetComponentTestModeConfig(parser.Value("componentTest")); 1065 } 1066#endif // COMPONENT_TEST_ENABLED 1067 VirtualScreenImpl::GetInstance().InitFoldParams(); 1068 Start(); 1069} 1070 1071#ifdef COMPONENT_TEST_ENABLED 1072void JsAppImpl::SetComponentTestConfig(Platform::AceRunArgs& args, const std::string componentTest) const 1073{ 1074 args.componentTestConfig = componentTest; 1075 args.isComponentTestMode = true; 1076} 1077 1078void JsAppImpl::SetComponentTestModeConfig(const std::string value) 1079{ 1080 componentTestModeConfig = value; 1081} 1082#endif // COMPONENT_TEST_ENABLED 1083 1084void JsAppImpl::StopAbility() 1085{ 1086 if (listener) { 1087 OHOS::Rosen::Window* window = GetWindow(); 1088 if (window) { 1089 window->UnRegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener)); 1090 listener = nullptr; 1091 } 1092 } 1093 if (isDebug && debugServerPort >= 0) { 1094#if defined(__APPLE__) || defined(_WIN32) 1095 if (simulator) { 1096 simulator->TerminateAbility(debugAbilityId); 1097 } 1098#endif 1099 } else { 1100 ability = nullptr; 1101 } 1102 OHOS::Ide::StageContext::GetInstance().ReleaseHspBuffers(); 1103 if (glfwRenderContext != nullptr) { 1104 glfwRenderContext->DestroyWindow(); 1105 glfwRenderContext->Terminate(); 1106 ILOG("glfw Terminate finished"); 1107 } 1108} 1109 1110void JsAppImpl::InitCommandInfo() 1111{ 1112 CommandParser::GetInstance().GetCommandInfo(commandInfo); 1113} 1114 1115void JsAppImpl::InitScreenInfo() 1116{ 1117 screenInfo = VirtualScreenImpl::GetInstance().GetScreenInfo(); 1118} 1119