17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "JsAppImpl.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include "CommandParser.h"
197c804472Sopenharmony_ci#include "FileSystem.h"
207c804472Sopenharmony_ci#include "JsonReader.h"
217c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
227c804472Sopenharmony_ci#include "SharedData.h"
237c804472Sopenharmony_ci#include "TraceTool.h"
247c804472Sopenharmony_ci#include "VirtualScreenImpl.h"
257c804472Sopenharmony_ci#include "external/EventHandler.h"
267c804472Sopenharmony_ci#include "external/StageContext.h"
277c804472Sopenharmony_ci#include "viewport_config.h"
287c804472Sopenharmony_ci#include "glfw_render_context.h"
297c804472Sopenharmony_ci#if defined(REPLACE_WINDOW_HEADER)
307c804472Sopenharmony_ci#include "window.h"
317c804472Sopenharmony_ci#endif
327c804472Sopenharmony_ci#include "window_model.h"
337c804472Sopenharmony_ci#include "window_display.h"
347c804472Sopenharmony_ci#include "ace_preview_helper.h"
357c804472Sopenharmony_ci#include "ClipboardHelper.h"
367c804472Sopenharmony_ci#include "CommandLineInterface.h"
377c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
387c804472Sopenharmony_ci#include "options.h"
397c804472Sopenharmony_ci#include "simulator.h"
407c804472Sopenharmony_ci#endif
417c804472Sopenharmony_ci#include <fstream>
427c804472Sopenharmony_ci
437c804472Sopenharmony_ciusing namespace OHOS;
447c804472Sopenharmony_ciusing namespace OHOS::Ace;
457c804472Sopenharmony_ci
467c804472Sopenharmony_cinamespace {
477c804472Sopenharmony_ciScreenInfo screenInfo;
487c804472Sopenharmony_ciCommandInfo commandInfo;
497c804472Sopenharmony_ci}
507c804472Sopenharmony_ci
517c804472Sopenharmony_ciclass PreviewerListener : public OHOS::Rosen::IWindowSystemBarEnableListener {
527c804472Sopenharmony_cipublic:
537c804472Sopenharmony_ci    OHOS::Rosen::WMError OnSetSpecificBarProperty(OHOS::Rosen::WindowType type,
547c804472Sopenharmony_ci        const OHOS::Rosen::SystemBarProperty& property)
557c804472Sopenharmony_ci    {
567c804472Sopenharmony_ci        JsAppImpl::GetInstance().CalculateAvoidAreaByType(type, property);
577c804472Sopenharmony_ci        return OHOS::Rosen::WMError::WM_OK;
587c804472Sopenharmony_ci    }
597c804472Sopenharmony_ci};
607c804472Sopenharmony_ci
617c804472Sopenharmony_cinamespace {
627c804472Sopenharmony_ciOHOS::sptr<PreviewerListener> listener = nullptr;
637c804472Sopenharmony_ci}
647c804472Sopenharmony_ci
657c804472Sopenharmony_ciJsAppImpl::JsAppImpl() noexcept : ability(nullptr), isStop(false)
667c804472Sopenharmony_ci{
677c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
687c804472Sopenharmony_ci    windowModel = std::make_shared<OHOS::Previewer::PreviewerWindowModel>();
697c804472Sopenharmony_ci#endif
707c804472Sopenharmony_ci}
717c804472Sopenharmony_ci
727c804472Sopenharmony_ciJsAppImpl::~JsAppImpl() {}
737c804472Sopenharmony_ci
747c804472Sopenharmony_ciJsAppImpl& JsAppImpl::GetInstance()
757c804472Sopenharmony_ci{
767c804472Sopenharmony_ci    static JsAppImpl instance;
777c804472Sopenharmony_ci    return instance;
787c804472Sopenharmony_ci}
797c804472Sopenharmony_ci
807c804472Sopenharmony_civoid JsAppImpl::Start()
817c804472Sopenharmony_ci{
827c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().InitVirtualScreen();
837c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().InitAll(pipeName, pipePort);
847c804472Sopenharmony_ci    isFinished = false;
857c804472Sopenharmony_ci    ILOG("Start run js app");
867c804472Sopenharmony_ci    OHOS::AppExecFwk::EventHandler::SetMainThreadId(std::this_thread::get_id());
877c804472Sopenharmony_ci    RunJsApp();
887c804472Sopenharmony_ci    ILOG("Js app run finished");
897c804472Sopenharmony_ci    while (!isStop) {
907c804472Sopenharmony_ci        // Execute all tasks in the main thread
917c804472Sopenharmony_ci        OHOS::AppExecFwk::EventHandler::Run();
927c804472Sopenharmony_ci        glfwRenderContext->PollEvents();
937c804472Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(1));
947c804472Sopenharmony_ci    }
957c804472Sopenharmony_ci    StopAbility(); // start and stop ability at the same thread
967c804472Sopenharmony_ci    ILOG("JsAppImpl::Interrupt finished");
977c804472Sopenharmony_ci    isFinished = true;
987c804472Sopenharmony_ci}
997c804472Sopenharmony_ci
1007c804472Sopenharmony_civoid JsAppImpl::Restart()
1017c804472Sopenharmony_ci{
1027c804472Sopenharmony_ci    StopAbility();
1037c804472Sopenharmony_ci}
1047c804472Sopenharmony_ci
1057c804472Sopenharmony_cistd::string JsAppImpl::GetJSONTree()
1067c804472Sopenharmony_ci{
1077c804472Sopenharmony_ci    std::string jsonTree = ability->GetJSONTree();
1087c804472Sopenharmony_ci    return jsonTree;
1097c804472Sopenharmony_ci}
1107c804472Sopenharmony_ci
1117c804472Sopenharmony_cistd::string JsAppImpl::GetDefaultJSONTree()
1127c804472Sopenharmony_ci{
1137c804472Sopenharmony_ci    ILOG("Start getDefaultJsontree.");
1147c804472Sopenharmony_ci    std::string jsonTree = ability->GetDefaultJSONTree();
1157c804472Sopenharmony_ci    ILOG("GetDefaultJsontree finished.");
1167c804472Sopenharmony_ci    return jsonTree;
1177c804472Sopenharmony_ci}
1187c804472Sopenharmony_ci
1197c804472Sopenharmony_civoid JsAppImpl::OrientationChanged(std::string commandOrientation)
1207c804472Sopenharmony_ci{
1217c804472Sopenharmony_ci    aceRunArgs.deviceWidth = height;
1227c804472Sopenharmony_ci    aceRunArgs.deviceHeight = width;
1237c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().WidthAndHeightReverse();
1247c804472Sopenharmony_ci    AdaptDeviceType(aceRunArgs, commandInfo.deviceType, aceRunArgs.deviceWidth);
1257c804472Sopenharmony_ci    if (commandOrientation == "portrait") {
1267c804472Sopenharmony_ci        aceRunArgs.deviceConfig.orientation = DeviceOrientation::PORTRAIT;
1277c804472Sopenharmony_ci    } else {
1287c804472Sopenharmony_ci        aceRunArgs.deviceConfig.orientation = DeviceOrientation::LANDSCAPE;
1297c804472Sopenharmony_ci    }
1307c804472Sopenharmony_ci
1317c804472Sopenharmony_ci    orientation = commandOrientation;
1327c804472Sopenharmony_ci    ILOG("OrientationChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth,
1337c804472Sopenharmony_ci         aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density);
1347c804472Sopenharmony_ci    if (ability != nullptr) {
1357c804472Sopenharmony_ci        OHOS::AppExecFwk::EventHandler::PostTask([this]() {
1367c804472Sopenharmony_ci            glfwRenderContext->SetWindowSize(width, height);
1377c804472Sopenharmony_ci        });
1387c804472Sopenharmony_ci        ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density,
1397c804472Sopenharmony_ci                                aceRunArgs.deviceWidth, aceRunArgs.deviceHeight);
1407c804472Sopenharmony_ci    }
1417c804472Sopenharmony_ci}
1427c804472Sopenharmony_ci
1437c804472Sopenharmony_civoid JsAppImpl::ColorModeChanged(const std::string commandColorMode)
1447c804472Sopenharmony_ci{
1457c804472Sopenharmony_ci    if (commandColorMode == "light") {
1467c804472Sopenharmony_ci        aceRunArgs.deviceConfig.colorMode = ColorMode::LIGHT;
1477c804472Sopenharmony_ci    } else {
1487c804472Sopenharmony_ci        aceRunArgs.deviceConfig.colorMode = ColorMode::DARK;
1497c804472Sopenharmony_ci    }
1507c804472Sopenharmony_ci
1517c804472Sopenharmony_ci    if (ability != nullptr) {
1527c804472Sopenharmony_ci        ability->OnConfigurationChanged(aceRunArgs.deviceConfig);
1537c804472Sopenharmony_ci    }
1547c804472Sopenharmony_ci}
1557c804472Sopenharmony_ci
1567c804472Sopenharmony_civoid JsAppImpl::Interrupt()
1577c804472Sopenharmony_ci{
1587c804472Sopenharmony_ci    isStop = true;
1597c804472Sopenharmony_ci}
1607c804472Sopenharmony_ci
1617c804472Sopenharmony_civoid JsAppImpl::SetJsAppArgs(OHOS::Ace::Platform::AceRunArgs& args)
1627c804472Sopenharmony_ci{
1637c804472Sopenharmony_ci    ILOG("foldStatus:%s foldWidth:%d foldHeight:%d",
1647c804472Sopenharmony_ci        screenInfo.foldStatus.c_str(), screenInfo.foldWidth, screenInfo.foldHeight);
1657c804472Sopenharmony_ci    SetAssetPath(args, jsAppPath);
1667c804472Sopenharmony_ci    SetProjectModel(args);
1677c804472Sopenharmony_ci    SetPageProfile(args, commandInfo.pages);
1687c804472Sopenharmony_ci    SetDeviceWidth(args, ConvertFoldStatus(screenInfo.foldStatus) ==
1697c804472Sopenharmony_ci        OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldWidth : screenInfo.orignalResolutionWidth);
1707c804472Sopenharmony_ci    SetDeviceHeight(args, ConvertFoldStatus(screenInfo.foldStatus) ==
1717c804472Sopenharmony_ci        OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldHeight : screenInfo.orignalResolutionHeight);
1727c804472Sopenharmony_ci    SetWindowTitle(args, "Ace");
1737c804472Sopenharmony_ci    SetUrl(args, urlPath);
1747c804472Sopenharmony_ci    SetConfigChanges(args, configChanges);
1757c804472Sopenharmony_ci    SetColorMode(args, colorMode);
1767c804472Sopenharmony_ci    SetOrientation(args, orientation);
1777c804472Sopenharmony_ci    SetAceVersionArgs(args, aceVersion);
1787c804472Sopenharmony_ci    SetDeviceScreenDensity(atoi(screenDensity.c_str()), commandInfo.deviceType);
1797c804472Sopenharmony_ci    SetLanguage(args, SharedData<std::string>::GetData(SharedDataType::LAN));
1807c804472Sopenharmony_ci    SetRegion(args, SharedData<std::string>::GetData(SharedDataType::REGION));
1817c804472Sopenharmony_ci    SetScript(args, "");
1827c804472Sopenharmony_ci    SetSystemResourcesPath(args);
1837c804472Sopenharmony_ci    SetAppResourcesPath(args, commandInfo.appResourcePath);
1847c804472Sopenharmony_ci    SetFormsEnabled(args, commandInfo.isCardDisplay);
1857c804472Sopenharmony_ci    SetContainerSdkPath(args, commandInfo.containerSdkPath);
1867c804472Sopenharmony_ci    AdaptDeviceType(args, commandInfo.deviceType, ConvertFoldStatus(screenInfo.foldStatus) ==
1877c804472Sopenharmony_ci        OHOS::Rosen::FoldStatus::FOLDED ? screenInfo.foldWidth : screenInfo.orignalResolutionWidth);
1887c804472Sopenharmony_ci    SetOnRouterChange(args);
1897c804472Sopenharmony_ci    SetOnError(args);
1907c804472Sopenharmony_ci    SetComponentModeEnabled(args, commandInfo.isComponentMode);
1917c804472Sopenharmony_ci    SetPkgContextInfo();
1927c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
1937c804472Sopenharmony_ci    SetComponentTestConfig(args, componentTestModeConfig);
1947c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
1957c804472Sopenharmony_ci    ILOG("start ability: %d %d %f", args.deviceWidth, args.deviceHeight, args.deviceConfig.density);
1967c804472Sopenharmony_ci}
1977c804472Sopenharmony_ci
1987c804472Sopenharmony_civoid JsAppImpl::RunJsApp()
1997c804472Sopenharmony_ci{
2007c804472Sopenharmony_ci    ILOG("RunJsApp 1");
2017c804472Sopenharmony_ci    InitScreenInfo();
2027c804472Sopenharmony_ci    AssignValueForWidthAndHeight(screenInfo.orignalResolutionWidth, screenInfo.orignalResolutionHeight,
2037c804472Sopenharmony_ci                                 screenInfo.compressionResolutionWidth, screenInfo.compressionResolutionHeight);
2047c804472Sopenharmony_ci    SetJsAppArgs(aceRunArgs);
2057c804472Sopenharmony_ci    OHOS::Ide::StageContext::GetInstance().SetLoaderJsonPath(commandInfo.loaderJsonPath);
2067c804472Sopenharmony_ci    OHOS::Ide::StageContext::GetInstance().SetHosSdkPath(commandInfo.containerSdkPath);
2077c804472Sopenharmony_ci    OHOS::Ide::StageContext::GetInstance().GetModulePathMapFromLoaderJson();
2087c804472Sopenharmony_ci    OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldable(screenInfo.foldable);
2097c804472Sopenharmony_ci    OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(ConvertFoldStatus(screenInfo.foldStatus));
2107c804472Sopenharmony_ci    InitGlfwEnv();
2117c804472Sopenharmony_ci    Platform::AcePreviewHelper::GetInstance()->SetCallbackOfPostTask(AppExecFwk::EventHandler::PostTask);
2127c804472Sopenharmony_ci    Platform::AcePreviewHelper::GetInstance()->
2137c804472Sopenharmony_ci        SetCallbackOfIsCurrentRunnerThread(AppExecFwk::EventHandler::IsCurrentRunnerThread);
2147c804472Sopenharmony_ci    Platform::AcePreviewHelper::GetInstance()->SetCallbackOfSetClipboardData(ClipboardHelper::SetClipboardData);
2157c804472Sopenharmony_ci    Platform::AcePreviewHelper::GetInstance()->SetCallbackOfGetClipboardData(ClipboardHelper::GetClipboardData);
2167c804472Sopenharmony_ci    listener = new(std::nothrow) PreviewerListener();
2177c804472Sopenharmony_ci    if (!listener) {
2187c804472Sopenharmony_ci        ELOG("Memory allocation failed: listener.");
2197c804472Sopenharmony_ci        return;
2207c804472Sopenharmony_ci    }
2217c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
2227c804472Sopenharmony_ci        RunDebugAbility(); // for debug preview
2237c804472Sopenharmony_ci    } else {
2247c804472Sopenharmony_ci        RunNormalAbility(); // for normal preview
2257c804472Sopenharmony_ci    }
2267c804472Sopenharmony_ci}
2277c804472Sopenharmony_ci
2287c804472Sopenharmony_civoid JsAppImpl::RunNormalAbility()
2297c804472Sopenharmony_ci{
2307c804472Sopenharmony_ci    Platform::AcePreviewHelper::GetInstance()->SetCallbackOfHspBufferTracker(
2317c804472Sopenharmony_ci        [](const std::string& inputPath, uint8_t** buff, size_t* buffSize, std::string &errorMsg) -> bool {
2327c804472Sopenharmony_ci            if (!buff || !buffSize || inputPath.empty()) {
2337c804472Sopenharmony_ci                return false;
2347c804472Sopenharmony_ci            }
2357c804472Sopenharmony_ci            auto data = OHOS::Ide::StageContext::GetInstance().GetModuleBuffer(inputPath);
2367c804472Sopenharmony_ci            if (!data) {
2377c804472Sopenharmony_ci                return false;
2387c804472Sopenharmony_ci            }
2397c804472Sopenharmony_ci            *buff = data->data();
2407c804472Sopenharmony_ci            *buffSize = data->size();
2417c804472Sopenharmony_ci            return true;
2427c804472Sopenharmony_ci        });
2437c804472Sopenharmony_ci    if (ability != nullptr) {
2447c804472Sopenharmony_ci        ability.reset();
2457c804472Sopenharmony_ci    }
2467c804472Sopenharmony_ci    TraceTool::GetInstance().HandleTrace("Launch Js App");
2477c804472Sopenharmony_ci    ability = Platform::AceAbility::CreateInstance(aceRunArgs);
2487c804472Sopenharmony_ci    if (ability == nullptr) {
2497c804472Sopenharmony_ci        ELOG("JsApp::Run ability create failed.");
2507c804472Sopenharmony_ci        return;
2517c804472Sopenharmony_ci    }
2527c804472Sopenharmony_ci    SetMockJsonInfo();
2537c804472Sopenharmony_ci    OHOS::Rosen::WMError errCode;
2547c804472Sopenharmony_ci    OHOS::sptr<OHOS::Rosen::WindowOption> sp = nullptr;
2557c804472Sopenharmony_ci    auto window = OHOS::Rosen::Window::Create("previewer", sp, nullptr, errCode);
2567c804472Sopenharmony_ci    window->RegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener));
2577c804472Sopenharmony_ci    window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallback));
2587c804472Sopenharmony_ci    window->CreateSurfaceNode("preview_surface", std::move(VirtualScreenImpl::Callback));
2597c804472Sopenharmony_ci    ability->SetWindow(window);
2607c804472Sopenharmony_ci    InitAvoidAreas(window);
2617c804472Sopenharmony_ci    ability->InitEnv();
2627c804472Sopenharmony_ci}
2637c804472Sopenharmony_ci
2647c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
2657c804472Sopenharmony_civoid JsAppImpl::RunDebugAbility()
2667c804472Sopenharmony_ci{
2677c804472Sopenharmony_ci    // init window params
2687c804472Sopenharmony_ci    SetWindowParams();
2697c804472Sopenharmony_ci    OHOS::Previewer::PreviewerWindow::GetInstance().SetWindowParams(*windowModel);
2707c804472Sopenharmony_ci    // start ability
2717c804472Sopenharmony_ci    OHOS::AbilityRuntime::Options options;
2727c804472Sopenharmony_ci    SetSimulatorParams(options);
2737c804472Sopenharmony_ci    simulator = OHOS::AbilityRuntime::Simulator::Create(options);
2747c804472Sopenharmony_ci    if (!simulator) {
2757c804472Sopenharmony_ci        ELOG("JsApp::Run simulator create failed.");
2767c804472Sopenharmony_ci        return;
2777c804472Sopenharmony_ci    }
2787c804472Sopenharmony_ci    simulator->SetHostResolveBufferTracker(
2797c804472Sopenharmony_ci        [](const std::string &inputPath, uint8_t **buff, size_t *buffSize, std::string &errorMsg) -> bool {
2807c804472Sopenharmony_ci            if (inputPath.empty() || buff == nullptr || buffSize == nullptr) {
2817c804472Sopenharmony_ci                ELOG("Param invalid.");
2827c804472Sopenharmony_ci                return false;
2837c804472Sopenharmony_ci            }
2847c804472Sopenharmony_ci
2857c804472Sopenharmony_ci            DLOG("Get module buffer, input path: %{public}s.", inputPath.c_str());
2867c804472Sopenharmony_ci            auto data = Ide::StageContext::GetInstance().GetModuleBuffer(inputPath);
2877c804472Sopenharmony_ci            if (data == nullptr) {
2887c804472Sopenharmony_ci                ELOG("Get module buffer failed, input path: %{public}s.", inputPath.c_str());
2897c804472Sopenharmony_ci                return false;
2907c804472Sopenharmony_ci            }
2917c804472Sopenharmony_ci
2927c804472Sopenharmony_ci            *buff = data->data();
2937c804472Sopenharmony_ci            *buffSize = data->size();
2947c804472Sopenharmony_ci            return true;
2957c804472Sopenharmony_ci        });
2967c804472Sopenharmony_ci    SetMockJsonInfo();
2977c804472Sopenharmony_ci    std::string abilitySrcPath = commandInfo.abilityPath;
2987c804472Sopenharmony_ci    std::string abilityName = commandInfo.abilityName;
2997c804472Sopenharmony_ci    debugAbilityId = simulator->StartAbility(abilitySrcPath, [](int64_t abilityId) {}, abilityName);
3007c804472Sopenharmony_ci    if (debugAbilityId < 0) {
3017c804472Sopenharmony_ci        ELOG("JsApp::Run ability start failed. abilitySrcPath:%s abilityName:%s", abilitySrcPath.c_str(),
3027c804472Sopenharmony_ci            abilityName.c_str());
3037c804472Sopenharmony_ci        return;
3047c804472Sopenharmony_ci    }
3057c804472Sopenharmony_ci    // set onRender callback
3067c804472Sopenharmony_ci    OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject();
3077c804472Sopenharmony_ci    if (!window) {
3087c804472Sopenharmony_ci        ELOG("JsApp::Run get window failed.");
3097c804472Sopenharmony_ci        return;
3107c804472Sopenharmony_ci    }
3117c804472Sopenharmony_ci    window->RegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener));
3127c804472Sopenharmony_ci    window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallback));
3137c804472Sopenharmony_ci    window->CreateSurfaceNode(options.moduleName, std::move(VirtualScreenImpl::Callback));
3147c804472Sopenharmony_ci    InitAvoidAreas(window);
3157c804472Sopenharmony_ci}
3167c804472Sopenharmony_ci
3177c804472Sopenharmony_civoid JsAppImpl::SetSimulatorParams(OHOS::AbilityRuntime::Options& options)
3187c804472Sopenharmony_ci{
3197c804472Sopenharmony_ci    const std::string path = commandInfo.appResourcePath + FileSystem::GetSeparator() + "module.json";
3207c804472Sopenharmony_ci    if (!FileSystem::IsFileExists(path)) {
3217c804472Sopenharmony_ci        ELOG("The module.json file is not exist.");
3227c804472Sopenharmony_ci        return;
3237c804472Sopenharmony_ci    }
3247c804472Sopenharmony_ci    std::optional<std::vector<uint8_t>> ctx = OHOS::Ide::StageContext::GetInstance().ReadFileContents(path);
3257c804472Sopenharmony_ci    if (ctx.has_value()) {
3267c804472Sopenharmony_ci        options.moduleJsonBuffer = ctx.value();
3277c804472Sopenharmony_ci    } else {
3287c804472Sopenharmony_ci        ELOG("get module.json content failed");
3297c804472Sopenharmony_ci    }
3307c804472Sopenharmony_ci    SetSimulatorCommonParams(options);
3317c804472Sopenharmony_ci    ILOG("setted bundleName:%s moduleName:%s", options.modulePath.c_str(), options.resourcePath.c_str());
3327c804472Sopenharmony_ci}
3337c804472Sopenharmony_ci
3347c804472Sopenharmony_civoid JsAppImpl::SetSimulatorCommonParams(OHOS::AbilityRuntime::Options& options)
3357c804472Sopenharmony_ci{
3367c804472Sopenharmony_ci    options.modulePath = aceRunArgs.assetPath + FileSystem::GetSeparator() + "modules.abc";
3377c804472Sopenharmony_ci    options.resourcePath = commandInfo.appResourcePath + FileSystem::GetSeparator() + "resources.index";
3387c804472Sopenharmony_ci    if (debugServerPort > 0) {
3397c804472Sopenharmony_ci        options.debugPort = debugServerPort;
3407c804472Sopenharmony_ci    }
3417c804472Sopenharmony_ci    options.assetPath = aceRunArgs.assetPath;
3427c804472Sopenharmony_ci    options.systemResourcePath = aceRunArgs.systemResourcesPath;
3437c804472Sopenharmony_ci    options.appResourcePath = aceRunArgs.appResourcesPath;
3447c804472Sopenharmony_ci    options.containerSdkPath = aceRunArgs.containerSdkPath;
3457c804472Sopenharmony_ci    options.url = aceRunArgs.url;
3467c804472Sopenharmony_ci    options.language = aceRunArgs.language;
3477c804472Sopenharmony_ci    options.region = aceRunArgs.region;
3487c804472Sopenharmony_ci    options.script = aceRunArgs.script;
3497c804472Sopenharmony_ci    options.themeId = aceRunArgs.themeId;
3507c804472Sopenharmony_ci    options.deviceWidth = aceRunArgs.deviceWidth;
3517c804472Sopenharmony_ci    options.deviceHeight = aceRunArgs.deviceHeight;
3527c804472Sopenharmony_ci    options.isRound = aceRunArgs.isRound;
3537c804472Sopenharmony_ci    options.onRouterChange = aceRunArgs.onRouterChange;
3547c804472Sopenharmony_ci    options.pkgContextInfoJsonStringMap = aceRunArgs.pkgContextInfoJsonStringMap;
3557c804472Sopenharmony_ci    options.packageNameList = aceRunArgs.packageNameList;
3567c804472Sopenharmony_ci    OHOS::AbilityRuntime::DeviceConfig deviceCfg;
3577c804472Sopenharmony_ci    deviceCfg.deviceType = SetDevice<OHOS::AbilityRuntime::DeviceType>(aceRunArgs.deviceConfig.deviceType);
3587c804472Sopenharmony_ci    deviceCfg.orientation = SetOrientation<OHOS::AbilityRuntime::DeviceOrientation>(
3597c804472Sopenharmony_ci        aceRunArgs.deviceConfig.orientation);
3607c804472Sopenharmony_ci    deviceCfg.colorMode = SetColorMode<OHOS::AbilityRuntime::ColorMode>(aceRunArgs.deviceConfig.colorMode);
3617c804472Sopenharmony_ci    deviceCfg.density = aceRunArgs.deviceConfig.density;
3627c804472Sopenharmony_ci    options.deviceConfig = deviceCfg;
3637c804472Sopenharmony_ci    std::string fPath = commandInfo.configPath;
3647c804472Sopenharmony_ci    options.configuration = UpdateConfiguration(aceRunArgs);
3657c804472Sopenharmony_ci    std::size_t pos = fPath.find(".idea");
3667c804472Sopenharmony_ci    if (pos == std::string::npos) {
3677c804472Sopenharmony_ci        ELOG("previewPath error:%s", fPath.c_str());
3687c804472Sopenharmony_ci    } else {
3697c804472Sopenharmony_ci        options.previewPath = fPath.substr(0, pos) + ".idea" + FileSystem::GetSeparator() + "previewer";
3707c804472Sopenharmony_ci        ILOG("previewPath info:%s", options.previewPath.c_str());
3717c804472Sopenharmony_ci    }
3727c804472Sopenharmony_ci    options.postTask = AppExecFwk::EventHandler::PostTask;
3737c804472Sopenharmony_ci}
3747c804472Sopenharmony_ci
3757c804472Sopenharmony_cistd::shared_ptr<AppExecFwk::Configuration> JsAppImpl::UpdateConfiguration(OHOS::Ace::Platform::AceRunArgs& args)
3767c804472Sopenharmony_ci{
3777c804472Sopenharmony_ci    std::shared_ptr<AppExecFwk::Configuration> configuration = std::make_shared<AppExecFwk::Configuration>();
3787c804472Sopenharmony_ci    configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE,
3797c804472Sopenharmony_ci        SharedData<std::string>::GetData(SharedDataType::LANGUAGE));
3807c804472Sopenharmony_ci    std::string colorMode = "light";
3817c804472Sopenharmony_ci    if (aceRunArgs.deviceConfig.colorMode == ColorMode::DARK) {
3827c804472Sopenharmony_ci        colorMode = "dark";
3837c804472Sopenharmony_ci    }
3847c804472Sopenharmony_ci    configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, colorMode);
3857c804472Sopenharmony_ci    std::string direction = "portrait";
3867c804472Sopenharmony_ci    if (aceRunArgs.deviceConfig.orientation == DeviceOrientation::LANDSCAPE) {
3877c804472Sopenharmony_ci        orientation = "landscape";
3887c804472Sopenharmony_ci    }
3897c804472Sopenharmony_ci    configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, direction);
3907c804472Sopenharmony_ci    std::string density = std::to_string(aceRunArgs.deviceConfig.density);
3917c804472Sopenharmony_ci    configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, density);
3927c804472Sopenharmony_ci    return configuration;
3937c804472Sopenharmony_ci}
3947c804472Sopenharmony_ci
3957c804472Sopenharmony_ci
3967c804472Sopenharmony_civoid JsAppImpl::SetWindowParams() const
3977c804472Sopenharmony_ci{
3987c804472Sopenharmony_ci    windowModel->isRound = aceRunArgs.isRound;
3997c804472Sopenharmony_ci    windowModel->originWidth = aceRunArgs.deviceWidth;
4007c804472Sopenharmony_ci    windowModel->originHeight = aceRunArgs.deviceHeight;
4017c804472Sopenharmony_ci    windowModel->compressWidth = aceRunArgs.deviceWidth;
4027c804472Sopenharmony_ci    windowModel->compressHeight = aceRunArgs.deviceHeight;
4037c804472Sopenharmony_ci    windowModel->density = aceRunArgs.deviceConfig.density;
4047c804472Sopenharmony_ci    windowModel->deviceType = SetDevice<OHOS::Previewer::DeviceType>(aceRunArgs.deviceConfig.deviceType);
4057c804472Sopenharmony_ci    windowModel->orientation = SetOrientation<OHOS::Previewer::Orientation>(aceRunArgs.deviceConfig.orientation);
4067c804472Sopenharmony_ci    windowModel->colorMode = SetColorMode<OHOS::Previewer::ColorMode>(aceRunArgs.deviceConfig.colorMode);
4077c804472Sopenharmony_ci}
4087c804472Sopenharmony_ci#else
4097c804472Sopenharmony_ci    void JsAppImpl::RunDebugAbility()
4107c804472Sopenharmony_ci    {
4117c804472Sopenharmony_ci        ELOG("JsApp::Run ability start failed.Linux is not supported.");
4127c804472Sopenharmony_ci        return;
4137c804472Sopenharmony_ci    }
4147c804472Sopenharmony_ci#endif
4157c804472Sopenharmony_ci
4167c804472Sopenharmony_civoid JsAppImpl::AdaptDeviceType(Platform::AceRunArgs& args, const std::string type,
4177c804472Sopenharmony_ci                                const int32_t realDeviceWidth, double screenDendity) const
4187c804472Sopenharmony_ci{
4197c804472Sopenharmony_ci    if (type == "wearable") {
4207c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::WATCH;
4217c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : watchScreenDensity;
4227c804472Sopenharmony_ci        double adaptWidthWatch = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4237c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthWatch;
4247c804472Sopenharmony_ci        return;
4257c804472Sopenharmony_ci    }
4267c804472Sopenharmony_ci    if (type == "tv") {
4277c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::TV;
4287c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : tvScreenDensity;
4297c804472Sopenharmony_ci        double adaptWidthTv = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4307c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthTv;
4317c804472Sopenharmony_ci        return;
4327c804472Sopenharmony_ci    }
4337c804472Sopenharmony_ci    if (type == "phone" || type == "default") {
4347c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::PHONE;
4357c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : phoneScreenDensity;
4367c804472Sopenharmony_ci        double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4377c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthPhone;
4387c804472Sopenharmony_ci        return;
4397c804472Sopenharmony_ci    }
4407c804472Sopenharmony_ci    if (type == "2in1") {
4417c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::TWO_IN_ONE;
4427c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : twoInOneScreenDensity;
4437c804472Sopenharmony_ci        double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4447c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthPhone;
4457c804472Sopenharmony_ci        return;
4467c804472Sopenharmony_ci    }
4477c804472Sopenharmony_ci    if (type == "tablet") {
4487c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::TABLET;
4497c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : tabletScreenDensity;
4507c804472Sopenharmony_ci        double adaptWidthTablet = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4517c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthTablet;
4527c804472Sopenharmony_ci        return;
4537c804472Sopenharmony_ci    }
4547c804472Sopenharmony_ci    if (type == "car") {
4557c804472Sopenharmony_ci        args.deviceConfig.deviceType = DeviceType::CAR;
4567c804472Sopenharmony_ci        double density = screenDendity > 0 ? screenDendity : carScreenDensity;
4577c804472Sopenharmony_ci        double adaptWidthCar = realDeviceWidth * BASE_SCREEN_DENSITY / density;
4587c804472Sopenharmony_ci        args.deviceConfig.density = args.deviceWidth / adaptWidthCar;
4597c804472Sopenharmony_ci        return;
4607c804472Sopenharmony_ci    }
4617c804472Sopenharmony_ci    ELOG("DeviceType not supported : %s", type.c_str());
4627c804472Sopenharmony_ci    return;
4637c804472Sopenharmony_ci}
4647c804472Sopenharmony_ci
4657c804472Sopenharmony_civoid JsAppImpl::SetAssetPath(Platform::AceRunArgs& args, const std::string assetPath) const
4667c804472Sopenharmony_ci{
4677c804472Sopenharmony_ci    args.assetPath = assetPath;
4687c804472Sopenharmony_ci}
4697c804472Sopenharmony_ci
4707c804472Sopenharmony_civoid JsAppImpl::SetProjectModel(Platform::AceRunArgs& args) const
4717c804472Sopenharmony_ci{
4727c804472Sopenharmony_ci    int idxVal = CommandParser::GetInstance().GetProjectModelEnumValue();
4737c804472Sopenharmony_ci    ILOG("ProjectModel: %s", CommandParser::GetInstance().GetProjectModelEnumName(idxVal).c_str());
4747c804472Sopenharmony_ci    args.projectModel = Platform::ProjectModel(idxVal);
4757c804472Sopenharmony_ci}
4767c804472Sopenharmony_ci
4777c804472Sopenharmony_civoid JsAppImpl::SetPageProfile(Platform::AceRunArgs& args, const std::string pageProfile) const
4787c804472Sopenharmony_ci{
4797c804472Sopenharmony_ci    args.pageProfile = pageProfile;
4807c804472Sopenharmony_ci}
4817c804472Sopenharmony_ci
4827c804472Sopenharmony_civoid JsAppImpl::SetDeviceWidth(Platform::AceRunArgs& args, const int32_t deviceWidth) const
4837c804472Sopenharmony_ci{
4847c804472Sopenharmony_ci    args.deviceWidth = deviceWidth;
4857c804472Sopenharmony_ci}
4867c804472Sopenharmony_ci
4877c804472Sopenharmony_civoid JsAppImpl::SetDeviceHeight(Platform::AceRunArgs& args, const int32_t deviceHeight) const
4887c804472Sopenharmony_ci{
4897c804472Sopenharmony_ci    args.deviceHeight = deviceHeight;
4907c804472Sopenharmony_ci}
4917c804472Sopenharmony_ci
4927c804472Sopenharmony_civoid JsAppImpl::SetWindowTitle(Platform::AceRunArgs& args, const std::string windowTitle) const
4937c804472Sopenharmony_ci{
4947c804472Sopenharmony_ci    args.windowTitle = windowTitle;
4957c804472Sopenharmony_ci}
4967c804472Sopenharmony_ci
4977c804472Sopenharmony_civoid JsAppImpl::SetUrl(Platform::AceRunArgs& args, const std::string urlPath) const
4987c804472Sopenharmony_ci{
4997c804472Sopenharmony_ci    args.url = urlPath;
5007c804472Sopenharmony_ci}
5017c804472Sopenharmony_ci
5027c804472Sopenharmony_civoid JsAppImpl::SetConfigChanges(Platform::AceRunArgs& args, const std::string configChanges) const
5037c804472Sopenharmony_ci{
5047c804472Sopenharmony_ci    args.configChanges = configChanges;
5057c804472Sopenharmony_ci}
5067c804472Sopenharmony_ci
5077c804472Sopenharmony_civoid JsAppImpl::SetColorMode(Platform::AceRunArgs& args, const std::string colorMode) const
5087c804472Sopenharmony_ci{
5097c804472Sopenharmony_ci    ILOG("JsAppImpl::RunJsApp SetColorMode: %s", colorMode.c_str());
5107c804472Sopenharmony_ci    if (colorMode == "dark") {
5117c804472Sopenharmony_ci        args.deviceConfig.colorMode = ColorMode::DARK;
5127c804472Sopenharmony_ci    } else {
5137c804472Sopenharmony_ci        args.deviceConfig.colorMode = ColorMode::LIGHT;
5147c804472Sopenharmony_ci    }
5157c804472Sopenharmony_ci}
5167c804472Sopenharmony_ci
5177c804472Sopenharmony_civoid JsAppImpl::SetOrientation(Platform::AceRunArgs& args, const std::string orientation) const
5187c804472Sopenharmony_ci{
5197c804472Sopenharmony_ci    ILOG("JsAppImpl::RunJsApp SetOrientation: %s", orientation.c_str());
5207c804472Sopenharmony_ci    if (orientation == "landscape") {
5217c804472Sopenharmony_ci        args.deviceConfig.orientation = DeviceOrientation::LANDSCAPE;
5227c804472Sopenharmony_ci    } else {
5237c804472Sopenharmony_ci        args.deviceConfig.orientation = DeviceOrientation::PORTRAIT;
5247c804472Sopenharmony_ci    }
5257c804472Sopenharmony_ci}
5267c804472Sopenharmony_ci
5277c804472Sopenharmony_civoid JsAppImpl::SetAceVersionArgs(Platform::AceRunArgs& args, const std::string aceVersion) const
5287c804472Sopenharmony_ci{
5297c804472Sopenharmony_ci    ILOG("JsAppImpl::RunJsApp SetAceVersionArgs: %s", aceVersion.c_str());
5307c804472Sopenharmony_ci    if (aceVersion == "ACE_2_0") {
5317c804472Sopenharmony_ci        args.aceVersion = Platform::AceVersion::ACE_2_0;
5327c804472Sopenharmony_ci    } else {
5337c804472Sopenharmony_ci        args.aceVersion = Platform::AceVersion::ACE_1_0;
5347c804472Sopenharmony_ci    }
5357c804472Sopenharmony_ci}
5367c804472Sopenharmony_ci
5377c804472Sopenharmony_civoid JsAppImpl::SetLanguage(Platform::AceRunArgs& args, const std::string language) const
5387c804472Sopenharmony_ci{
5397c804472Sopenharmony_ci    args.language = language;
5407c804472Sopenharmony_ci}
5417c804472Sopenharmony_ci
5427c804472Sopenharmony_civoid JsAppImpl::SetRegion(Platform::AceRunArgs& args, const std::string region) const
5437c804472Sopenharmony_ci{
5447c804472Sopenharmony_ci    args.region = region;
5457c804472Sopenharmony_ci}
5467c804472Sopenharmony_ci
5477c804472Sopenharmony_civoid JsAppImpl::SetScript(Platform::AceRunArgs& args, const std::string script) const
5487c804472Sopenharmony_ci{
5497c804472Sopenharmony_ci    args.script = script;
5507c804472Sopenharmony_ci}
5517c804472Sopenharmony_ci
5527c804472Sopenharmony_civoid JsAppImpl::SetSystemResourcesPath(Platform::AceRunArgs& args) const
5537c804472Sopenharmony_ci{
5547c804472Sopenharmony_ci    std::string sep = FileSystem::GetSeparator();
5557c804472Sopenharmony_ci    std::string rPath = FileSystem::GetApplicationPath();
5567c804472Sopenharmony_ci    rPath = FileSystem::NormalizePath(rPath);
5577c804472Sopenharmony_ci    int idx = rPath.find_last_of(sep);
5587c804472Sopenharmony_ci    rPath = rPath.substr(0, idx + 1) + "resources";
5597c804472Sopenharmony_ci    args.systemResourcesPath = rPath;
5607c804472Sopenharmony_ci}
5617c804472Sopenharmony_ci
5627c804472Sopenharmony_civoid JsAppImpl::SetAppResourcesPath(Platform::AceRunArgs& args, const std::string appResourcesPath) const
5637c804472Sopenharmony_ci{
5647c804472Sopenharmony_ci    args.appResourcesPath = appResourcesPath;
5657c804472Sopenharmony_ci}
5667c804472Sopenharmony_ci
5677c804472Sopenharmony_civoid JsAppImpl::SetFormsEnabled(Platform::AceRunArgs& args, bool formsEnabled) const
5687c804472Sopenharmony_ci{
5697c804472Sopenharmony_ci    args.formsEnabled = formsEnabled;
5707c804472Sopenharmony_ci}
5717c804472Sopenharmony_ci
5727c804472Sopenharmony_civoid JsAppImpl::SetContainerSdkPath(Platform::AceRunArgs& args, const std::string containerSdkPath) const
5737c804472Sopenharmony_ci{
5747c804472Sopenharmony_ci    args.containerSdkPath = containerSdkPath;
5757c804472Sopenharmony_ci}
5767c804472Sopenharmony_ci
5777c804472Sopenharmony_civoid JsAppImpl::SetOnRouterChange(Platform::AceRunArgs& args) const
5787c804472Sopenharmony_ci{
5797c804472Sopenharmony_ci    args.onRouterChange = std::move(VirtualScreenImpl::PageCallback);
5807c804472Sopenharmony_ci}
5817c804472Sopenharmony_ci
5827c804472Sopenharmony_civoid JsAppImpl::SetOnError(Platform::AceRunArgs& args) const
5837c804472Sopenharmony_ci{
5847c804472Sopenharmony_ci    args.onError = std::move(VirtualScreenImpl::FastPreviewCallback);
5857c804472Sopenharmony_ci}
5867c804472Sopenharmony_ci
5877c804472Sopenharmony_civoid JsAppImpl::SetComponentModeEnabled(Platform::AceRunArgs& args, bool isComponentMode) const
5887c804472Sopenharmony_ci{
5897c804472Sopenharmony_ci    args.isComponentMode = isComponentMode;
5907c804472Sopenharmony_ci}
5917c804472Sopenharmony_ci
5927c804472Sopenharmony_civoid JsAppImpl::AssignValueForWidthAndHeight(const int32_t origWidth,
5937c804472Sopenharmony_ci                                             const int32_t origHeight,
5947c804472Sopenharmony_ci                                             const int32_t compWidth,
5957c804472Sopenharmony_ci                                             const int32_t compHeight)
5967c804472Sopenharmony_ci{
5977c804472Sopenharmony_ci    orignalWidth = origWidth;
5987c804472Sopenharmony_ci    orignalHeight = origHeight;
5997c804472Sopenharmony_ci    width = compWidth;
6007c804472Sopenharmony_ci    height = compHeight;
6017c804472Sopenharmony_ci    ILOG("AssignValueForWidthAndHeight: %d %d %d %d", orignalWidth, orignalHeight, width, height);
6027c804472Sopenharmony_ci}
6037c804472Sopenharmony_ci
6047c804472Sopenharmony_civoid JsAppImpl::ResolutionChanged(ResolutionParam& param, int32_t screenDensity, std::string reason)
6057c804472Sopenharmony_ci{
6067c804472Sopenharmony_ci    SetResolutionParams(param.orignalWidth, param.orignalHeight, param.compressionWidth,
6077c804472Sopenharmony_ci        param.compressionHeight, screenDensity);
6087c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
6097c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
6107c804472Sopenharmony_ci        SetWindowParams();
6117c804472Sopenharmony_ci        OHOS::Ace::ViewportConfig config;
6127c804472Sopenharmony_ci        config.SetSize(windowModel->originWidth, windowModel->originHeight);
6137c804472Sopenharmony_ci        config.SetPosition(0, 0);
6147c804472Sopenharmony_ci        config.SetOrientation(static_cast<int32_t>(
6157c804472Sopenharmony_ci            OHOS::Previewer::PreviewerWindow::TransOrientation(windowModel->orientation)));
6167c804472Sopenharmony_ci        config.SetDensity(windowModel->density);
6177c804472Sopenharmony_ci        OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject();
6187c804472Sopenharmony_ci        if (!window) {
6197c804472Sopenharmony_ci            ELOG("JsApp::Run get window failed.");
6207c804472Sopenharmony_ci            return;
6217c804472Sopenharmony_ci        }
6227c804472Sopenharmony_ci        InitAvoidAreas(window);
6237c804472Sopenharmony_ci        OHOS::AppExecFwk::EventHandler::PostTask([this]() {
6247c804472Sopenharmony_ci            glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight);
6257c804472Sopenharmony_ci        });
6267c804472Sopenharmony_ci        simulator->UpdateConfiguration(*(UpdateConfiguration(aceRunArgs).get()));
6277c804472Sopenharmony_ci        window->SetViewportConfig(config);
6287c804472Sopenharmony_ci#endif
6297c804472Sopenharmony_ci    } else {
6307c804472Sopenharmony_ci        if (ability != nullptr) {
6317c804472Sopenharmony_ci            InitAvoidAreas(ability->GetWindow());
6327c804472Sopenharmony_ci            OHOS::AppExecFwk::EventHandler::PostTask([this]() {
6337c804472Sopenharmony_ci                glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight);
6347c804472Sopenharmony_ci            });
6357c804472Sopenharmony_ci            ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density,
6367c804472Sopenharmony_ci                aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, ConvertResizeReason(reason));
6377c804472Sopenharmony_ci        }
6387c804472Sopenharmony_ci    }
6397c804472Sopenharmony_ci}
6407c804472Sopenharmony_ci
6417c804472Sopenharmony_ciWindowSizeChangeReason JsAppImpl::ConvertResizeReason(std::string reason)
6427c804472Sopenharmony_ci{
6437c804472Sopenharmony_ci    if (reason == "undefined") {
6447c804472Sopenharmony_ci        return WindowSizeChangeReason::UNDEFINED;
6457c804472Sopenharmony_ci    } else if (reason == "rotation") {
6467c804472Sopenharmony_ci        return WindowSizeChangeReason::ROTATION;
6477c804472Sopenharmony_ci    } else {
6487c804472Sopenharmony_ci        return WindowSizeChangeReason::RESIZE;
6497c804472Sopenharmony_ci    }
6507c804472Sopenharmony_ci}
6517c804472Sopenharmony_ci
6527c804472Sopenharmony_civoid JsAppImpl::SetResolutionParams(int32_t changedOriginWidth, int32_t changedOriginHeight, int32_t changedWidth,
6537c804472Sopenharmony_ci    int32_t changedHeight, int32_t screenDensity)
6547c804472Sopenharmony_ci{
6557c804472Sopenharmony_ci    SetDeviceWidth(aceRunArgs, changedWidth);
6567c804472Sopenharmony_ci    SetDeviceHeight(aceRunArgs, changedHeight);
6577c804472Sopenharmony_ci    orignalWidth = changedOriginWidth;
6587c804472Sopenharmony_ci    orignalHeight = changedOriginHeight;
6597c804472Sopenharmony_ci    SetDeviceScreenDensity(screenDensity, commandInfo.deviceType);
6607c804472Sopenharmony_ci    AdaptDeviceType(aceRunArgs, commandInfo.deviceType, changedOriginWidth);
6617c804472Sopenharmony_ci    AssignValueForWidthAndHeight(changedOriginWidth, changedOriginHeight, changedWidth, changedHeight);
6627c804472Sopenharmony_ci    if (changedWidth <= changedHeight) {
6637c804472Sopenharmony_ci        JsAppImpl::GetInstance().SetDeviceOrentation("portrait");
6647c804472Sopenharmony_ci    } else {
6657c804472Sopenharmony_ci        JsAppImpl::GetInstance().SetDeviceOrentation("landscape");
6667c804472Sopenharmony_ci    }
6677c804472Sopenharmony_ci    SetOrientation(aceRunArgs, orientation);
6687c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().SetCurrentResolution(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight);
6697c804472Sopenharmony_ci    ILOG("ResolutionChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth,
6707c804472Sopenharmony_ci         aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density);
6717c804472Sopenharmony_ci}
6727c804472Sopenharmony_ci
6737c804472Sopenharmony_civoid JsAppImpl::SetArgsColorMode(const std::string& value)
6747c804472Sopenharmony_ci{
6757c804472Sopenharmony_ci    colorMode = value;
6767c804472Sopenharmony_ci}
6777c804472Sopenharmony_ci
6787c804472Sopenharmony_civoid JsAppImpl::SetArgsAceVersion(const std::string& value)
6797c804472Sopenharmony_ci{
6807c804472Sopenharmony_ci    aceVersion = value;
6817c804472Sopenharmony_ci}
6827c804472Sopenharmony_ci
6837c804472Sopenharmony_civoid JsAppImpl::SetDeviceOrentation(const std::string& value)
6847c804472Sopenharmony_ci{
6857c804472Sopenharmony_ci    orientation = value;
6867c804472Sopenharmony_ci}
6877c804472Sopenharmony_ci
6887c804472Sopenharmony_cistd::string JsAppImpl::GetOrientation() const
6897c804472Sopenharmony_ci{
6907c804472Sopenharmony_ci    return orientation;
6917c804472Sopenharmony_ci}
6927c804472Sopenharmony_ci
6937c804472Sopenharmony_cistd::string JsAppImpl::GetColorMode() const
6947c804472Sopenharmony_ci{
6957c804472Sopenharmony_ci    return colorMode;
6967c804472Sopenharmony_ci}
6977c804472Sopenharmony_ci
6987c804472Sopenharmony_civoid JsAppImpl::SetDeviceScreenDensity(const int32_t screenDensity, const std::string type)
6997c804472Sopenharmony_ci{
7007c804472Sopenharmony_ci    if (type == "wearable" && screenDensity != 0) {
7017c804472Sopenharmony_ci        watchScreenDensity = screenDensity;
7027c804472Sopenharmony_ci        return;
7037c804472Sopenharmony_ci    }
7047c804472Sopenharmony_ci    if (type == "tv" && screenDensity != 0) {
7057c804472Sopenharmony_ci        tvScreenDensity = screenDensity;
7067c804472Sopenharmony_ci        return;
7077c804472Sopenharmony_ci    }
7087c804472Sopenharmony_ci    if ((type == "phone" || type == "default") && screenDensity != 0) {
7097c804472Sopenharmony_ci        phoneScreenDensity = screenDensity;
7107c804472Sopenharmony_ci        return;
7117c804472Sopenharmony_ci    }
7127c804472Sopenharmony_ci    if (type == "2in1" && screenDensity != 0) {
7137c804472Sopenharmony_ci        twoInOneScreenDensity = screenDensity;
7147c804472Sopenharmony_ci        return;
7157c804472Sopenharmony_ci    }
7167c804472Sopenharmony_ci    if (type == "tablet" && screenDensity != 0) {
7177c804472Sopenharmony_ci        tabletScreenDensity = screenDensity;
7187c804472Sopenharmony_ci        return;
7197c804472Sopenharmony_ci    }
7207c804472Sopenharmony_ci    if (type == "car" && screenDensity != 0) {
7217c804472Sopenharmony_ci        carScreenDensity = screenDensity;
7227c804472Sopenharmony_ci        return;
7237c804472Sopenharmony_ci    }
7247c804472Sopenharmony_ci    ILOG("DeviceType not supported to SetDeviceScreenDensity: %s", type.c_str());
7257c804472Sopenharmony_ci    return;
7267c804472Sopenharmony_ci}
7277c804472Sopenharmony_ci
7287c804472Sopenharmony_civoid JsAppImpl::ReloadRuntimePage(const std::string currentPage)
7297c804472Sopenharmony_ci{
7307c804472Sopenharmony_ci    std::string params = "";
7317c804472Sopenharmony_ci    if (ability != nullptr) {
7327c804472Sopenharmony_ci        ability->ReplacePage(currentPage, params);
7337c804472Sopenharmony_ci    }
7347c804472Sopenharmony_ci}
7357c804472Sopenharmony_ci
7367c804472Sopenharmony_civoid JsAppImpl::SetScreenDensity(const std::string value)
7377c804472Sopenharmony_ci{
7387c804472Sopenharmony_ci    screenDensity = value;
7397c804472Sopenharmony_ci}
7407c804472Sopenharmony_ci
7417c804472Sopenharmony_civoid JsAppImpl::SetConfigChanges(const std::string value)
7427c804472Sopenharmony_ci{
7437c804472Sopenharmony_ci    configChanges = value;
7447c804472Sopenharmony_ci}
7457c804472Sopenharmony_ci
7467c804472Sopenharmony_cibool JsAppImpl::MemoryRefresh(const std::string memoryRefreshArgs) const
7477c804472Sopenharmony_ci{
7487c804472Sopenharmony_ci    ILOG("MemoryRefresh.");
7497c804472Sopenharmony_ci    if (ability != nullptr) {
7507c804472Sopenharmony_ci        return ability->OperateComponent(memoryRefreshArgs);
7517c804472Sopenharmony_ci    }
7527c804472Sopenharmony_ci    return false;
7537c804472Sopenharmony_ci}
7547c804472Sopenharmony_ci
7557c804472Sopenharmony_civoid JsAppImpl::ParseSystemParams(OHOS::Ace::Platform::AceRunArgs& args, const Json2::Value& paramObj)
7567c804472Sopenharmony_ci{
7577c804472Sopenharmony_ci    if (paramObj.IsNull()) {
7587c804472Sopenharmony_ci        SetDeviceWidth(args, VirtualScreenImpl::GetInstance().GetCompressionWidth());
7597c804472Sopenharmony_ci        SetDeviceHeight(args, VirtualScreenImpl::GetInstance().GetCompressionHeight());
7607c804472Sopenharmony_ci        AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight,
7617c804472Sopenharmony_ci                                     args.deviceWidth, args.deviceHeight);
7627c804472Sopenharmony_ci        SetColorMode(args, colorMode);
7637c804472Sopenharmony_ci        SetOrientation(args, orientation);
7647c804472Sopenharmony_ci        SetDeviceScreenDensity(atoi(screenDensity.c_str()), commandInfo.deviceType);
7657c804472Sopenharmony_ci        AdaptDeviceType(args, commandInfo.deviceType, aceRunArgs.deviceWidth);
7667c804472Sopenharmony_ci        SetLanguage(args, SharedData<std::string>::GetData(SharedDataType::LAN));
7677c804472Sopenharmony_ci        SetRegion(args, SharedData<std::string>::GetData(SharedDataType::REGION));
7687c804472Sopenharmony_ci    } else {
7697c804472Sopenharmony_ci        SetDeviceWidth(args, paramObj["width"].AsInt());
7707c804472Sopenharmony_ci        SetDeviceHeight(args, paramObj["height"].AsInt());
7717c804472Sopenharmony_ci        AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight,
7727c804472Sopenharmony_ci                                     args.deviceWidth, args.deviceHeight);
7737c804472Sopenharmony_ci        SetColorMode(args, paramObj["colorMode"].AsString());
7747c804472Sopenharmony_ci        SetOrientation(args, paramObj["orientation"].AsString());
7757c804472Sopenharmony_ci        std::string deviceType = paramObj["deviceType"].AsString();
7767c804472Sopenharmony_ci        SetDeviceScreenDensity(atoi(screenDensity.c_str()), deviceType);
7777c804472Sopenharmony_ci        AdaptDeviceType(args, deviceType, args.deviceWidth, paramObj["dpi"].AsDouble());
7787c804472Sopenharmony_ci        std::string lanInfo = paramObj["locale"].AsString();
7797c804472Sopenharmony_ci        SetLanguage(args, lanInfo.substr(0, lanInfo.find("_")));
7807c804472Sopenharmony_ci        SetRegion(args, lanInfo.substr(lanInfo.find("_") + 1, lanInfo.length() - 1));
7817c804472Sopenharmony_ci    }
7827c804472Sopenharmony_ci}
7837c804472Sopenharmony_ci
7847c804472Sopenharmony_civoid JsAppImpl::SetSystemParams(OHOS::Ace::Platform::SystemParams& params, const Json2::Value& paramObj)
7857c804472Sopenharmony_ci{
7867c804472Sopenharmony_ci    ParseSystemParams(aceRunArgs, paramObj);
7877c804472Sopenharmony_ci    params.deviceWidth = aceRunArgs.deviceWidth;
7887c804472Sopenharmony_ci    params.deviceHeight = aceRunArgs.deviceHeight;
7897c804472Sopenharmony_ci    params.language = aceRunArgs.language;
7907c804472Sopenharmony_ci    params.region = aceRunArgs.region;
7917c804472Sopenharmony_ci    params.colorMode = aceRunArgs.deviceConfig.colorMode;
7927c804472Sopenharmony_ci    params.orientation = aceRunArgs.deviceConfig.orientation;
7937c804472Sopenharmony_ci    params.deviceType = aceRunArgs.deviceConfig.deviceType;
7947c804472Sopenharmony_ci    params.density = aceRunArgs.deviceConfig.density;
7957c804472Sopenharmony_ci    params.isRound = (paramObj.IsNull()) ? (commandInfo.screenShape == "circle") :
7967c804472Sopenharmony_ci        paramObj["roundScreen"].AsBool();
7977c804472Sopenharmony_ci}
7987c804472Sopenharmony_ci
7997c804472Sopenharmony_civoid JsAppImpl::LoadDocument(const std::string filePath,
8007c804472Sopenharmony_ci                             const std::string componentName,
8017c804472Sopenharmony_ci                             const Json2::Value& previewContext)
8027c804472Sopenharmony_ci{
8037c804472Sopenharmony_ci    ILOG("LoadDocument.");
8047c804472Sopenharmony_ci    if (ability != nullptr) {
8057c804472Sopenharmony_ci        OHOS::Ace::Platform::SystemParams params;
8067c804472Sopenharmony_ci        SetSystemParams(params, previewContext);
8077c804472Sopenharmony_ci        ILOG("LoadDocument params is density: %f region: %s language: %s deviceWidth: %d\
8087c804472Sopenharmony_ci             deviceHeight: %d isRound:%d colorMode:%s orientation: %s deviceType: %s",
8097c804472Sopenharmony_ci             params.density,
8107c804472Sopenharmony_ci             params.region.c_str(),
8117c804472Sopenharmony_ci             params.language.c_str(),
8127c804472Sopenharmony_ci             params.deviceWidth,
8137c804472Sopenharmony_ci             params.deviceHeight,
8147c804472Sopenharmony_ci             (params.isRound ? "true" : "false"),
8157c804472Sopenharmony_ci             ((params.colorMode == ColorMode::DARK) ? "dark" : "light"),
8167c804472Sopenharmony_ci             ((params.orientation == DeviceOrientation::LANDSCAPE) ? "landscape" : "portrait"),
8177c804472Sopenharmony_ci             GetDeviceTypeName(params.deviceType).c_str());
8187c804472Sopenharmony_ci        OHOS::AppExecFwk::EventHandler::PostTask([this]() {
8197c804472Sopenharmony_ci            glfwRenderContext->SetWindowSize(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight);
8207c804472Sopenharmony_ci        });
8217c804472Sopenharmony_ci        ability->LoadDocument(filePath, componentName, params);
8227c804472Sopenharmony_ci    }
8237c804472Sopenharmony_ci}
8247c804472Sopenharmony_ci
8257c804472Sopenharmony_civoid JsAppImpl::DispatchBackPressedEvent() const
8267c804472Sopenharmony_ci{
8277c804472Sopenharmony_ci    ability->OnBackPressed();
8287c804472Sopenharmony_ci}
8297c804472Sopenharmony_civoid JsAppImpl::DispatchKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent) const
8307c804472Sopenharmony_ci{
8317c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
8327c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
8337c804472Sopenharmony_ci        OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject();
8347c804472Sopenharmony_ci        if (!window) {
8357c804472Sopenharmony_ci            ELOG("JsApp::Run get window failed.");
8367c804472Sopenharmony_ci            return;
8377c804472Sopenharmony_ci        }
8387c804472Sopenharmony_ci        window->ConsumeKeyEvent(keyEvent);
8397c804472Sopenharmony_ci#endif
8407c804472Sopenharmony_ci    } else {
8417c804472Sopenharmony_ci        ability->OnInputEvent(keyEvent);
8427c804472Sopenharmony_ci    }
8437c804472Sopenharmony_ci}
8447c804472Sopenharmony_civoid JsAppImpl::DispatchPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) const
8457c804472Sopenharmony_ci{
8467c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
8477c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
8487c804472Sopenharmony_ci        OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject();
8497c804472Sopenharmony_ci        if (!window) {
8507c804472Sopenharmony_ci            ELOG("JsApp::Run get window failed.");
8517c804472Sopenharmony_ci            return;
8527c804472Sopenharmony_ci        }
8537c804472Sopenharmony_ci        window->ConsumePointerEvent(pointerEvent);
8547c804472Sopenharmony_ci#endif
8557c804472Sopenharmony_ci    } else {
8567c804472Sopenharmony_ci        ability->OnInputEvent(pointerEvent);
8577c804472Sopenharmony_ci    }
8587c804472Sopenharmony_ci}
8597c804472Sopenharmony_civoid JsAppImpl::DispatchAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) const
8607c804472Sopenharmony_ci{
8617c804472Sopenharmony_ci    ability->OnInputEvent(axisEvent);
8627c804472Sopenharmony_ci}
8637c804472Sopenharmony_civoid JsAppImpl::DispatchInputMethodEvent(const unsigned int codePoint) const
8647c804472Sopenharmony_ci{
8657c804472Sopenharmony_ci    ability->OnInputMethodEvent(codePoint);
8667c804472Sopenharmony_ci}
8677c804472Sopenharmony_ci
8687c804472Sopenharmony_cistd::string JsAppImpl::GetDeviceTypeName(const OHOS::Ace::DeviceType type) const
8697c804472Sopenharmony_ci{
8707c804472Sopenharmony_ci    switch (type) {
8717c804472Sopenharmony_ci        case DeviceType::WATCH:
8727c804472Sopenharmony_ci            return "watch";
8737c804472Sopenharmony_ci        case DeviceType::TV:
8747c804472Sopenharmony_ci            return "tv";
8757c804472Sopenharmony_ci        case DeviceType::PHONE:
8767c804472Sopenharmony_ci            return "phone";
8777c804472Sopenharmony_ci        case DeviceType::TABLET:
8787c804472Sopenharmony_ci            return "tablet";
8797c804472Sopenharmony_ci        case DeviceType::CAR:
8807c804472Sopenharmony_ci            return "car";
8817c804472Sopenharmony_ci        default:
8827c804472Sopenharmony_ci            return "";
8837c804472Sopenharmony_ci    }
8847c804472Sopenharmony_ci}
8857c804472Sopenharmony_ci
8867c804472Sopenharmony_civoid JsAppImpl::InitGlfwEnv()
8877c804472Sopenharmony_ci{
8887c804472Sopenharmony_ci    ILOG("InitGlfwEnv started");
8897c804472Sopenharmony_ci    glfwRenderContext = OHOS::Rosen::GlfwRenderContext::GetGlobal();
8907c804472Sopenharmony_ci    if (!glfwRenderContext->Init()) {
8917c804472Sopenharmony_ci        ELOG("Could not create window: InitGlfwEnv failed.");
8927c804472Sopenharmony_ci        return;
8937c804472Sopenharmony_ci    }
8947c804472Sopenharmony_ci    glfwRenderContext->CreateGlfwWindow(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, false);
8957c804472Sopenharmony_ci    ILOG("InitGlfwEnv finished");
8967c804472Sopenharmony_ci}
8977c804472Sopenharmony_ci
8987c804472Sopenharmony_civoid JsAppImpl::SetMockJsonInfo()
8997c804472Sopenharmony_ci{
9007c804472Sopenharmony_ci    std::string filePath = commandInfo.appResourcePath + FileSystem::GetSeparator() + "mock-config.json";
9017c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
9027c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
9037c804472Sopenharmony_ci        simulator->SetMockList(Ide::StageContext::GetInstance().ParseMockJsonFile(filePath));
9047c804472Sopenharmony_ci#endif
9057c804472Sopenharmony_ci    } else {
9067c804472Sopenharmony_ci        ability->SetMockModuleList(Ide::StageContext::GetInstance().ParseMockJsonFile(filePath));
9077c804472Sopenharmony_ci    }
9087c804472Sopenharmony_ci}
9097c804472Sopenharmony_ci
9107c804472Sopenharmony_civoid JsAppImpl::SetPkgContextInfo()
9117c804472Sopenharmony_ci{
9127c804472Sopenharmony_ci    Ide::StageContext::GetInstance().SetPkgContextInfo(aceRunArgs.pkgContextInfoJsonStringMap,
9137c804472Sopenharmony_ci        aceRunArgs.packageNameList);
9147c804472Sopenharmony_ci}
9157c804472Sopenharmony_ci
9167c804472Sopenharmony_civoid JsAppImpl::FoldStatusChanged(const std::string commandFoldStatus, int32_t currentWidth, int32_t currentHeight)
9177c804472Sopenharmony_ci{
9187c804472Sopenharmony_ci    std::string reason = "resize";
9197c804472Sopenharmony_ci    ILOG("FoldStatusChanged commandFoldStatus:%s", commandFoldStatus.c_str());
9207c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().SetFoldStatus(commandFoldStatus);
9217c804472Sopenharmony_ci    OHOS::Rosen::FoldStatus status = ConvertFoldStatus(commandFoldStatus);
9227c804472Sopenharmony_ci    // execute callback
9237c804472Sopenharmony_ci    OHOS::Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(status);
9247c804472Sopenharmony_ci    OHOS::Previewer::PreviewerDisplay::GetInstance().ExecStatusChangedCallback();
9257c804472Sopenharmony_ci    if (status == OHOS::Rosen::FoldStatus::UNKNOWN) {
9267c804472Sopenharmony_ci        return; // unknown status do nothing
9277c804472Sopenharmony_ci    }
9287c804472Sopenharmony_ci    // change resolution
9297c804472Sopenharmony_ci    ResolutionParam param(currentWidth, currentHeight, currentWidth, currentHeight);
9307c804472Sopenharmony_ci    ResolutionChanged(param, atoi(screenDensity.c_str()), reason);
9317c804472Sopenharmony_ci}
9327c804472Sopenharmony_ci
9337c804472Sopenharmony_ciOHOS::Rosen::FoldStatus JsAppImpl::ConvertFoldStatus(std::string value) const
9347c804472Sopenharmony_ci{
9357c804472Sopenharmony_ci    OHOS::Rosen::FoldStatus foldStatus = OHOS::Rosen::FoldStatus::EXPAND;
9367c804472Sopenharmony_ci    if (value == "fold") {
9377c804472Sopenharmony_ci        foldStatus = OHOS::Rosen::FoldStatus::FOLDED;
9387c804472Sopenharmony_ci    } else if (value == "unfold") {
9397c804472Sopenharmony_ci        foldStatus = OHOS::Rosen::FoldStatus::EXPAND;
9407c804472Sopenharmony_ci    } else if (value == "half_fold") {
9417c804472Sopenharmony_ci        foldStatus = OHOS::Rosen::FoldStatus::HALF_FOLD;
9427c804472Sopenharmony_ci    } else {
9437c804472Sopenharmony_ci        foldStatus = OHOS::Rosen::FoldStatus::UNKNOWN;
9447c804472Sopenharmony_ci    }
9457c804472Sopenharmony_ci    return foldStatus;
9467c804472Sopenharmony_ci}
9477c804472Sopenharmony_ci
9487c804472Sopenharmony_civoid JsAppImpl::SetAvoidArea(const AvoidAreas& areas)
9497c804472Sopenharmony_ci{
9507c804472Sopenharmony_ci    avoidInitialAreas = areas;
9517c804472Sopenharmony_ci}
9527c804472Sopenharmony_ci
9537c804472Sopenharmony_civoid JsAppImpl::CalculateAvoidAreaByType(OHOS::Rosen::WindowType type,
9547c804472Sopenharmony_ci    const OHOS::Rosen::SystemBarProperty& property)
9557c804472Sopenharmony_ci{
9567c804472Sopenharmony_ci    uint32_t deviceWidth = static_cast<uint32_t>(aceRunArgs.deviceWidth);
9577c804472Sopenharmony_ci    uint32_t deviceHeight = static_cast<uint32_t>(aceRunArgs.deviceHeight);
9587c804472Sopenharmony_ci    OHOS::Rosen::Window* window = GetWindow();
9597c804472Sopenharmony_ci    if (!window) {
9607c804472Sopenharmony_ci        ELOG("GetWindow failed");
9617c804472Sopenharmony_ci        return;
9627c804472Sopenharmony_ci    }
9637c804472Sopenharmony_ci    sptr<OHOS::Rosen::AvoidArea> statusArea(new(std::nothrow) OHOS::Rosen::AvoidArea());
9647c804472Sopenharmony_ci    if (!statusArea) {
9657c804472Sopenharmony_ci        ELOG("new OHOS::Rosen::AvoidArea failed");
9667c804472Sopenharmony_ci        return;
9677c804472Sopenharmony_ci    }
9687c804472Sopenharmony_ci    if (OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR == type) {
9697c804472Sopenharmony_ci        if (property.enable_) {
9707c804472Sopenharmony_ci            statusArea->topRect_ = {0, 0, deviceWidth, avoidInitialAreas.topRect.height};
9717c804472Sopenharmony_ci            window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM);
9727c804472Sopenharmony_ci        } else {
9737c804472Sopenharmony_ci            statusArea->topRect_ = {0, 0, 0, 0};
9747c804472Sopenharmony_ci            window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_SYSTEM);
9757c804472Sopenharmony_ci        }
9767c804472Sopenharmony_ci        UpdateAvoidArea2Ide("topRect", statusArea->topRect_);
9777c804472Sopenharmony_ci    } else if (OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR == type) {
9787c804472Sopenharmony_ci        if (property.enable_) {
9797c804472Sopenharmony_ci            statusArea->bottomRect_ = {0, deviceHeight - avoidInitialAreas.bottomRect.height,
9807c804472Sopenharmony_ci                deviceWidth, avoidInitialAreas.bottomRect.height};
9817c804472Sopenharmony_ci            window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR);
9827c804472Sopenharmony_ci        } else {
9837c804472Sopenharmony_ci            statusArea->bottomRect_ = {0, 0, 0, 0};
9847c804472Sopenharmony_ci            window->UpdateAvoidArea(statusArea, OHOS::Rosen::AvoidAreaType::TYPE_NAVIGATION_INDICATOR);
9857c804472Sopenharmony_ci        }
9867c804472Sopenharmony_ci        UpdateAvoidArea2Ide("bottomRect", statusArea->bottomRect_);
9877c804472Sopenharmony_ci    } else {
9887c804472Sopenharmony_ci        return; // currently not support
9897c804472Sopenharmony_ci    }
9907c804472Sopenharmony_ci}
9917c804472Sopenharmony_ci
9927c804472Sopenharmony_civoid JsAppImpl::UpdateAvoidArea2Ide(const std::string& key, const OHOS::Rosen::Rect& value)
9937c804472Sopenharmony_ci{
9947c804472Sopenharmony_ci    Json2::Value son = JsonReader::CreateObject();
9957c804472Sopenharmony_ci    son.Add("posX", value.posX_);
9967c804472Sopenharmony_ci    son.Add("posY", value.posY_);
9977c804472Sopenharmony_ci    son.Add("width", value.width_);
9987c804472Sopenharmony_ci    son.Add("height", value.height_);
9997c804472Sopenharmony_ci    Json2::Value val = JsonReader::CreateObject();
10007c804472Sopenharmony_ci    val.Add(key.c_str(), son);
10017c804472Sopenharmony_ci    CommandLineInterface::GetInstance().CreatCommandToSendData("AvoidAreaChanged", val, "get");
10027c804472Sopenharmony_ci}
10037c804472Sopenharmony_ci
10047c804472Sopenharmony_ciOHOS::Rosen::Window* JsAppImpl::GetWindow() const
10057c804472Sopenharmony_ci{
10067c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
10077c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
10087c804472Sopenharmony_ci        return OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject();
10097c804472Sopenharmony_ci#else
10107c804472Sopenharmony_ci        return nullptr;
10117c804472Sopenharmony_ci#endif
10127c804472Sopenharmony_ci    } else {
10137c804472Sopenharmony_ci        return ability->GetWindow();
10147c804472Sopenharmony_ci    }
10157c804472Sopenharmony_ci}
10167c804472Sopenharmony_ci
10177c804472Sopenharmony_civoid JsAppImpl::InitAvoidAreas(OHOS::Rosen::Window* window)
10187c804472Sopenharmony_ci{
10197c804472Sopenharmony_ci    CalculateAvoidAreaByType(OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR,
10207c804472Sopenharmony_ci        window->GetSystemBarPropertyByType(OHOS::Rosen::WindowType::WINDOW_TYPE_STATUS_BAR));
10217c804472Sopenharmony_ci    CalculateAvoidAreaByType(OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR,
10227c804472Sopenharmony_ci        window->GetSystemBarPropertyByType(OHOS::Rosen::WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR));
10237c804472Sopenharmony_ci}
10247c804472Sopenharmony_ci
10257c804472Sopenharmony_civoid JsAppImpl::InitJsApp()
10267c804472Sopenharmony_ci{
10277c804472Sopenharmony_ci    CommandParser& parser = CommandParser::GetInstance();
10287c804472Sopenharmony_ci    InitCommandInfo();
10297c804472Sopenharmony_ci    SetJsAppPath(parser.Value("j"));
10307c804472Sopenharmony_ci    if (parser.IsSet("s")) {
10317c804472Sopenharmony_ci        SetPipeName(parser.Value("s"));
10327c804472Sopenharmony_ci    }
10337c804472Sopenharmony_ci    if (parser.IsSet("url")) {
10347c804472Sopenharmony_ci        SetUrlPath(parser.Value("url"));
10357c804472Sopenharmony_ci    }
10367c804472Sopenharmony_ci    if (parser.IsSet("lws")) {
10377c804472Sopenharmony_ci        SetPipePort(parser.Value("lws"));
10387c804472Sopenharmony_ci    }
10397c804472Sopenharmony_ci    if (parser.IsSet("cm")) {
10407c804472Sopenharmony_ci        SetArgsColorMode(parser.Value("cm"));
10417c804472Sopenharmony_ci    }
10427c804472Sopenharmony_ci    if (parser.IsSet("av")) {
10437c804472Sopenharmony_ci        SetArgsAceVersion(parser.Value("av"));
10447c804472Sopenharmony_ci    }
10457c804472Sopenharmony_ci    if (parser.IsSet("sd")) {
10467c804472Sopenharmony_ci        SetScreenDensity(parser.Value("sd"));
10477c804472Sopenharmony_ci    }
10487c804472Sopenharmony_ci    if (parser.IsSet("cc")) {
10497c804472Sopenharmony_ci        SetConfigChanges(parser.Value("cc"));
10507c804472Sopenharmony_ci    }
10517c804472Sopenharmony_ci    if (commandInfo.compressionResolutionWidth <= commandInfo.compressionResolutionHeight) {
10527c804472Sopenharmony_ci        SetDeviceOrentation("portrait");
10537c804472Sopenharmony_ci    } else {
10547c804472Sopenharmony_ci        SetDeviceOrentation("landscape");
10557c804472Sopenharmony_ci    }
10567c804472Sopenharmony_ci    if (parser.IsSet("d")) {
10577c804472Sopenharmony_ci        SetIsDebug(true);
10587c804472Sopenharmony_ci        if (parser.IsSet("p")) {
10597c804472Sopenharmony_ci            SetDebugServerPort(static_cast<uint16_t>(atoi(parser.Value("p").c_str())));
10607c804472Sopenharmony_ci        }
10617c804472Sopenharmony_ci    }
10627c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
10637c804472Sopenharmony_ci    if (parser.IsSet("componentTest")) {
10647c804472Sopenharmony_ci        JsAppImpl::GetInstance().SetComponentTestModeConfig(parser.Value("componentTest"));
10657c804472Sopenharmony_ci    }
10667c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
10677c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().InitFoldParams();
10687c804472Sopenharmony_ci    Start();
10697c804472Sopenharmony_ci}
10707c804472Sopenharmony_ci
10717c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
10727c804472Sopenharmony_civoid JsAppImpl::SetComponentTestConfig(Platform::AceRunArgs& args, const std::string componentTest) const
10737c804472Sopenharmony_ci{
10747c804472Sopenharmony_ci    args.componentTestConfig = componentTest;
10757c804472Sopenharmony_ci    args.isComponentTestMode = true;
10767c804472Sopenharmony_ci}
10777c804472Sopenharmony_ci
10787c804472Sopenharmony_civoid JsAppImpl::SetComponentTestModeConfig(const std::string value)
10797c804472Sopenharmony_ci{
10807c804472Sopenharmony_ci    componentTestModeConfig = value;
10817c804472Sopenharmony_ci}
10827c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
10837c804472Sopenharmony_ci
10847c804472Sopenharmony_civoid JsAppImpl::StopAbility()
10857c804472Sopenharmony_ci{
10867c804472Sopenharmony_ci    if (listener) {
10877c804472Sopenharmony_ci        OHOS::Rosen::Window* window = GetWindow();
10887c804472Sopenharmony_ci        if (window) {
10897c804472Sopenharmony_ci            window->UnRegisterSystemBarEnableListener(sptr<OHOS::Rosen::IWindowSystemBarEnableListener>(listener));
10907c804472Sopenharmony_ci            listener = nullptr;
10917c804472Sopenharmony_ci        }
10927c804472Sopenharmony_ci    }
10937c804472Sopenharmony_ci    if (isDebug && debugServerPort >= 0) {
10947c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
10957c804472Sopenharmony_ci        if (simulator) {
10967c804472Sopenharmony_ci            simulator->TerminateAbility(debugAbilityId);
10977c804472Sopenharmony_ci        }
10987c804472Sopenharmony_ci#endif
10997c804472Sopenharmony_ci    } else {
11007c804472Sopenharmony_ci        ability = nullptr;
11017c804472Sopenharmony_ci    }
11027c804472Sopenharmony_ci    OHOS::Ide::StageContext::GetInstance().ReleaseHspBuffers();
11037c804472Sopenharmony_ci    if (glfwRenderContext != nullptr) {
11047c804472Sopenharmony_ci        glfwRenderContext->DestroyWindow();
11057c804472Sopenharmony_ci        glfwRenderContext->Terminate();
11067c804472Sopenharmony_ci        ILOG("glfw Terminate finished");
11077c804472Sopenharmony_ci    }
11087c804472Sopenharmony_ci}
11097c804472Sopenharmony_ci
11107c804472Sopenharmony_civoid JsAppImpl::InitCommandInfo()
11117c804472Sopenharmony_ci{
11127c804472Sopenharmony_ci    CommandParser::GetInstance().GetCommandInfo(commandInfo);
11137c804472Sopenharmony_ci}
11147c804472Sopenharmony_ci
11157c804472Sopenharmony_civoid JsAppImpl::InitScreenInfo()
11167c804472Sopenharmony_ci{
11177c804472Sopenharmony_ci    screenInfo = VirtualScreenImpl::GetInstance().GetScreenInfo();
11187c804472Sopenharmony_ci}
1119