/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "JsAppImpl.h" #include "CommandParser.h" #include "FileSystem.h" #include "JsonReader.h" #include "PreviewerEngineLog.h" #include "SharedData.h" #include "TraceTool.h" #include "VirtualScreenImpl.h" #include "external/EventHandler.h" #include "viewport_config.h" #include "glfw_render_context.h" #include "window_model.h" #if defined(__APPLE__) || defined(_WIN32) #include "options.h" #include "simulator.h" #endif using namespace std; using namespace OHOS; using namespace OHOS::Ace; JsAppImpl::JsAppImpl() noexcept : ability(nullptr), isStop(false) { #if defined(__APPLE__) || defined(_WIN32) windowModel = std::make_shared(); #endif } JsAppImpl::~JsAppImpl() { if (glfwRenderContext != nullptr) { glfwRenderContext->DestroyWindow(); glfwRenderContext->Terminate(); } } JsAppImpl& JsAppImpl::GetInstance() { static JsAppImpl instance; return instance; } void JsAppImpl::Start() { VirtualScreenImpl::GetInstance().InitVirtualScreen(); VirtualScreenImpl::GetInstance().InitAll(pipeName, pipePort); isFinished = false; ILOG("Start run js app"); OHOS::AppExecFwk::EventHandler::SetMainThreadId(std::this_thread::get_id()); RunJsApp(); ILOG("Js app run finished"); while (!isStop) { // Execute all tasks in the main thread OHOS::AppExecFwk::EventHandler::Run(); glfwRenderContext->PollEvents(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } isFinished = true; } void JsAppImpl::Restart() { if (isDebug && debugServerPort >= 0) { #if defined(__APPLE__) || defined(_WIN32) if (simulator) { simulator->TerminateAbility(debugAbilityId); } #endif } else { ability = nullptr; } } std::string JsAppImpl::GetJSONTree() { std::string jsongTree = ability->GetJSONTree(); Json::Value jsonData = JsonReader::ParseJsonData(jsongTree); Json::StreamWriterBuilder builder; builder["indentation"] = ""; builder["emitUTF8"] = true; return Json::writeString(builder, jsonData); } std::string JsAppImpl::GetDefaultJSONTree() { ILOG("Start getDefaultJsontree."); std::string jsongTree = ability->GetDefaultJSONTree(); Json::Value jsonData = JsonReader::ParseJsonData(jsongTree); ILOG("GetDefaultJsontree finished."); Json::StreamWriterBuilder builder; builder["indentation"] = ""; builder["emitUTF8"] = true; return Json::writeString(builder, jsonData); } void JsAppImpl::OrientationChanged(std::string commandOrientation) { aceRunArgs.deviceWidth = height; aceRunArgs.deviceHeight = width; VirtualScreenImpl::GetInstance().WidthAndHeightReverse(); AdaptDeviceType(aceRunArgs, CommandParser::GetInstance().GetDeviceType(), VirtualScreenImpl::GetInstance().GetOrignalWidth()); AssignValueForWidthAndHeight(VirtualScreenImpl::GetInstance().GetOrignalWidth(), VirtualScreenImpl::GetInstance().GetOrignalHeight(), VirtualScreenImpl::GetInstance().GetCompressionWidth(), VirtualScreenImpl::GetInstance().GetCompressionHeight()); if (commandOrientation == "portrait") { aceRunArgs.deviceConfig.orientation = DeviceOrientation::PORTRAIT; } else { aceRunArgs.deviceConfig.orientation = DeviceOrientation::LANDSCAPE; } orientation = commandOrientation; ILOG("OrientationChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density); if (ability != nullptr) { OHOS::AppExecFwk::EventHandler::PostTask([this]() { glfwRenderContext->SetWindowSize(width, height); }); ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density, aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); } } void JsAppImpl::ColorModeChanged(const std::string commandColorMode) { if (commandColorMode == "light") { aceRunArgs.deviceConfig.colorMode = ColorMode::LIGHT; } else { aceRunArgs.deviceConfig.colorMode = ColorMode::DARK; } if (ability != nullptr) { ability->OnConfigurationChanged(aceRunArgs.deviceConfig); } } void JsAppImpl::Interrupt() { isStop = true; if (isDebug && debugServerPort >= 0) { #if defined(__APPLE__) || defined(_WIN32) if (simulator) { simulator->TerminateAbility(debugAbilityId); } #endif } else { ability = nullptr; } } void JsAppImpl::SetJsAppArgs(OHOS::Ace::Platform::AceRunArgs& args) { SetAssetPath(args, jsAppPath); SetProjectModel(args); SetPageProfile(args, CommandParser::GetInstance().GetPages()); SetDeviceWidth(args, width); SetDeviceHeight(args, height); SetWindowTitle(args, "Ace"); SetUrl(args, urlPath); SetConfigChanges(args, configChanges); SetColorMode(args, colorMode); SetOrientation(args, orientation); SetAceVersionArgs(args, aceVersion); SetDeviceScreenDensity(atoi(screenDensity.c_str()), CommandParser::GetInstance().GetDeviceType()); SetLanguage(args, SharedData::GetData(SharedDataType::LAN)); SetRegion(args, SharedData::GetData(SharedDataType::REGION)); SetScript(args, ""); SetSystemResourcesPath(args); SetAppResourcesPath(args, CommandParser::GetInstance().GetAppResourcePath()); SetFormsEnabled(args, CommandParser::GetInstance().IsCardDisplay()); SetContainerSdkPath(args, CommandParser::GetInstance().GetContainerSdkPath()); AdaptDeviceType(args, CommandParser::GetInstance().GetDeviceType(), VirtualScreenImpl::GetInstance().GetOrignalWidth()); SetOnRender(args); SetOnRouterChange(args); SetOnError(args); SetComponentModeEnabled(args, CommandParser::GetInstance().IsComponentMode()); ILOG("start abilit: %d %d %f", args.deviceWidth, args.deviceHeight, args.deviceConfig.density); } void JsAppImpl::RunJsApp() { ILOG("RunJsApp 1"); AssignValueForWidthAndHeight(VirtualScreenImpl::GetInstance().GetOrignalWidth(), VirtualScreenImpl::GetInstance().GetOrignalHeight(), VirtualScreenImpl::GetInstance().GetCompressionWidth(), VirtualScreenImpl::GetInstance().GetCompressionHeight()); SetJsAppArgs(aceRunArgs); InitGlfwEnv(); if (isDebug && debugServerPort >= 0) { RunDebugAbility(); // for debug preview } else { RunNormalAbility(); // for normal preview } } void JsAppImpl::RunNormalAbility() { if (ability != nullptr) { ability.reset(); } TraceTool::GetInstance().HandleTrace("Launch Js App"); ability = Platform::AceAbility::CreateInstance(aceRunArgs); if (ability == nullptr) { ELOG("JsApp::Run ability create failed."); return; } OHOS::Rosen::WMError errCode; OHOS::sptr sp = nullptr; auto window = OHOS::Rosen::Window::Create("previewer", sp, nullptr, errCode); window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallBack)); window->CreateSurfaceNode("preview_surface", aceRunArgs.onRender); ability->SetWindow(window); ability->InitEnv(); } #if defined(__APPLE__) || defined(_WIN32) void JsAppImpl::RunDebugAbility() { // init window params SetWindowParams(); OHOS::Previewer::PreviewerWindow::GetInstance().SetWindowParams(*windowModel); // start ability OHOS::AbilityRuntime::Options options; SetSimulatorParams(options); simulator = OHOS::AbilityRuntime::Simulator::Create(options); if (!simulator) { ELOG("JsApp::Run simulator create failed."); return; } std::string abilitySrcPath = CommandParser::GetInstance().GetAbilityPath(); debugAbilityId = simulator->StartAbility(abilitySrcPath, [](int64_t abilityId) {}); if (debugAbilityId < 0) { ELOG("JsApp::Run ability start failed. abilitySrcPath:%s", abilitySrcPath.c_str()); return; } // set onRender callback OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); if (!window) { ELOG("JsApp::Run get window failed."); return; } window->SetContentInfoCallback(std::move(VirtualScreenImpl::LoadContentCallBack)); window->CreateSurfaceNode(options.moduleName, std::move(VirtualScreenImpl::CallBack)); } static void ConvertAbilityInfo(const Ide::AbilityInfo &info, AppExecFwk::AbilityInfo &abilityInfo) { abilityInfo.name = info.name; abilityInfo.iconPath = info.icon; abilityInfo.labelId = info.iconId; abilityInfo.label = info.label; abilityInfo.labelId = info.labelId; abilityInfo.srcEntrance = info.srcEntrty; abilityInfo.description = info.description; abilityInfo.descriptionId = info.descriptionId; abilityInfo.startWindowBackground = info.startWindowBackground; abilityInfo.startWindowBackgroundId = info.startWindowBackgroundId; abilityInfo.startWindowIconId = info.startWindowIconId; abilityInfo.startWindowIcon = info.startWindowIcon; } static void ConvertApplicationInfo(const Ide::AppInfo &info, AppExecFwk::ApplicationInfo &applicationInfo) { applicationInfo.apiReleaseType = info.apiReleaseType; applicationInfo.bundleName = info.bundleName; applicationInfo.compileSdkType = info.compileSdkType; applicationInfo.compileSdkVersion = info.compileSdkVersion; applicationInfo.debug = info.debug; applicationInfo.icon = info.icon; applicationInfo.iconId = info.iconId; applicationInfo.label = info.label; applicationInfo.labelId = info.labelId; applicationInfo.minCompatibleVersionCode = info.minAPIVersion; applicationInfo.apiTargetVersion = info.targetAPIVersion; applicationInfo.vendor = info.vendor; applicationInfo.vendor = info.vendor; applicationInfo.versionName = info.versionName; applicationInfo.distributedNotificationEnabled = info.distributedNotificationEnabled; } static void ConvertHapModuleInfo(const Ide::HapModuleInfo &info, AppExecFwk::HapModuleInfo &hapModuleInfo) { hapModuleInfo.labelId = info.labelId; hapModuleInfo.virtualMachine = info.virtualMachine; hapModuleInfo.pages = info.pages; hapModuleInfo.name = info.name; hapModuleInfo.mainElementName = info.mainElement; hapModuleInfo.installationFree = info.installationFree; hapModuleInfo.descriptionId = info.descriptionId; hapModuleInfo.description = info.description; hapModuleInfo.deliveryWithInstall = info.deliveryWithInstall; hapModuleInfo.compileMode = AppExecFwk::CompileMode::ES_MODULE; hapModuleInfo.deviceTypes = info.deviceTypes; hapModuleInfo.srcEntrance = info.srcEntry; for (auto &ability : info.abilities) { AppExecFwk::AbilityInfo aInfo; ConvertAbilityInfo(ability, aInfo); hapModuleInfo.abilityInfos.emplace_back(aInfo); } } void JsAppImpl::SetSimulatorParams(OHOS::AbilityRuntime::Options& options) { const string path = CommandParser::GetInstance().GetAppResourcePath() + FileSystem::GetSeparator() + "module.json"; GetModuleJsonInfo(path); SetSimulatorCommonParams(options); SetSimulatorConfigParams(options); ILOG("setted bundleName:%s moduleName:%s", options.bundleName.c_str(), options.moduleName.c_str()); } void JsAppImpl::SetSimulatorCommonParams(OHOS::AbilityRuntime::Options& options) { options.bundleName = OHOS::Ide::StageContext::GetInstance().GetAppInfo().bundleName; options.moduleName = OHOS::Ide::StageContext::GetInstance().GetHapModuleInfo().name; options.modulePath = aceRunArgs.assetPath + FileSystem::GetSeparator() + "modules.abc"; options.resourcePath = CommandParser::GetInstance().GetAppResourcePath() + FileSystem::GetSeparator() + "resources.index"; options.debugPort = debugServerPort; options.assetPath = aceRunArgs.assetPath; options.systemResourcePath = aceRunArgs.systemResourcesPath; options.appResourcePath = aceRunArgs.appResourcesPath; options.containerSdkPath = aceRunArgs.containerSdkPath; options.url = aceRunArgs.url; options.language = aceRunArgs.language; options.region = aceRunArgs.region; options.script = aceRunArgs.script; options.themeId = aceRunArgs.themeId; options.deviceWidth = aceRunArgs.deviceWidth; options.deviceHeight = aceRunArgs.deviceHeight; options.isRound = aceRunArgs.isRound; options.onRouterChange = aceRunArgs.onRouterChange; OHOS::AbilityRuntime::DeviceConfig deviceCfg; deviceCfg.deviceType = SetDevice(aceRunArgs.deviceConfig.deviceType); deviceCfg.orientation = SetOrientation( aceRunArgs.deviceConfig.orientation); deviceCfg.colorMode = SetColorMode(aceRunArgs.deviceConfig.colorMode); deviceCfg.density = aceRunArgs.deviceConfig.density; options.deviceConfig = deviceCfg; options.compatibleVersion = OHOS::Ide::StageContext::GetInstance().GetAppInfo().minAPIVersion; options.installationFree = OHOS::Ide::StageContext::GetInstance().GetAppInfo().bundleType == "atomicService" ? true : false; options.labelId = OHOS::Ide::StageContext::GetInstance().GetAbilityInfo( CommandParser::GetInstance().GetAbilityPath()).labelId; options.compileMode = OHOS::Ide::StageContext::GetInstance().GetHapModuleInfo().compileMode; options.pageProfile = OHOS::Ide::StageContext::GetInstance().GetHapModuleInfo().pages; options.targetVersion = OHOS::Ide::StageContext::GetInstance().GetAppInfo().targetAPIVersion; options.releaseType = OHOS::Ide::StageContext::GetInstance().GetAppInfo().apiReleaseType; options.enablePartialUpdate = OHOS::Ide::StageContext::GetInstance().GetHapModuleInfo().isPartialUpdate; string fPath = CommandParser::GetInstance().GetConfigPath(); std::size_t pos = fPath.find(".idea"); if (pos == std::string::npos) { ELOG("previewPath error:%s", fPath.c_str()); } else { options.previewPath = fPath.substr(0, pos) + ".idea" + FileSystem::GetSeparator() + "previewer"; ILOG("previewPath info:%s", options.previewPath.c_str()); } } void JsAppImpl::SetSimulatorConfigParams(OHOS::AbilityRuntime::Options& options) { AppExecFwk::ApplicationInfo applicationInfo; ConvertApplicationInfo(Ide::StageContext::GetInstance().GetAppInfo(), applicationInfo); options.applicationInfo = applicationInfo; AppExecFwk::HapModuleInfo hapModuleInfo; ConvertHapModuleInfo(OHOS::Ide::StageContext::GetInstance().GetHapModuleInfo(), hapModuleInfo); options.hapModuleInfo = hapModuleInfo; AppExecFwk::AbilityInfo abilityInfo; ConvertAbilityInfo(OHOS::Ide::StageContext::GetInstance().GetAbilityInfo( CommandParser::GetInstance().GetAbilityPath()), abilityInfo); options.abilityInfo = abilityInfo; options.configuration = UpdateConfiguration(aceRunArgs); } std::shared_ptr JsAppImpl::UpdateConfiguration(OHOS::Ace::Platform::AceRunArgs& args) { std::shared_ptr configuration = make_shared(); configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, SharedData::GetData(SharedDataType::LANGUAGE)); string colorMode = "light"; if (aceRunArgs.deviceConfig.colorMode == ColorMode::DARK) { colorMode = "dark"; } configuration->AddItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, colorMode); string direction = "portrait"; if (aceRunArgs.deviceConfig.orientation == DeviceOrientation::LANDSCAPE) { orientation = "landscape"; } configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DIRECTION, direction); string density = std::to_string(aceRunArgs.deviceConfig.density); configuration->AddItem(OHOS::AppExecFwk::ConfigurationInner::APPLICATION_DENSITYDPI, density); return configuration; } void JsAppImpl::SetWindowParams() const { windowModel->isRound = aceRunArgs.isRound; windowModel->originWidth = aceRunArgs.deviceWidth; windowModel->originHeight = aceRunArgs.deviceHeight; windowModel->compressWidth = aceRunArgs.deviceWidth; windowModel->compressHeight = aceRunArgs.deviceHeight; windowModel->density = aceRunArgs.deviceConfig.density; windowModel->deviceType = SetDevice(aceRunArgs.deviceConfig.deviceType); windowModel->orientation = SetOrientation(aceRunArgs.deviceConfig.orientation); windowModel->colorMode = SetColorMode(aceRunArgs.deviceConfig.colorMode); } #else void JsAppImpl::RunDebugAbility() { ELOG("JsApp::Run ability start failed.Linux is not supported."); return; } #endif void JsAppImpl::AdaptDeviceType(Platform::AceRunArgs& args, const std::string type, const int32_t realDeviceWidth, double screenDendity) const { if (type == "wearable") { args.deviceConfig.deviceType = DeviceType::WATCH; double density = screenDendity > 0 ? screenDendity : watchScreenDensity; double adaptWidthWatch = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthWatch; return; } if (type == "tv") { args.deviceConfig.deviceType = DeviceType::TV; double density = screenDendity > 0 ? screenDendity : tvScreenDensity; double adaptWidthTv = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthTv; return; } if (type == "phone" || type == "default") { args.deviceConfig.deviceType = DeviceType::PHONE; double density = screenDendity > 0 ? screenDendity : phoneScreenDensity; double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthPhone; return; } if (type == "2in1") { args.deviceConfig.deviceType = DeviceType::TABLET; double density = screenDendity > 0 ? screenDendity : twoInOneScreenDensity; double adaptWidthPhone = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthPhone; return; } if (type == "tablet") { args.deviceConfig.deviceType = DeviceType::TABLET; double density = screenDendity > 0 ? screenDendity : tabletScreenDensity; double adaptWidthTablet = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthTablet; return; } if (type == "car") { args.deviceConfig.deviceType = DeviceType::CAR; double density = screenDendity > 0 ? screenDendity : carScreenDensity; double adaptWidthCar = realDeviceWidth * BASE_SCREEN_DENSITY / density; args.deviceConfig.density = args.deviceWidth / adaptWidthCar; return; } ELOG("DeviceType not supported : %s", type.c_str()); return; } void JsAppImpl::SetAssetPath(Platform::AceRunArgs& args, const std::string assetPath) const { args.assetPath = assetPath; } void JsAppImpl::SetProjectModel(Platform::AceRunArgs& args) const { int idxVal = CommandParser::GetInstance().GetProjectModelEnumValue(); ILOG("ProjectModel: %s", CommandParser::GetInstance().GetProjectModelEnumName(idxVal).c_str()); args.projectModel = Platform::ProjectModel(idxVal); } void JsAppImpl::SetPageProfile(Platform::AceRunArgs& args, const std::string pageProfile) const { args.pageProfile = pageProfile; } void JsAppImpl::SetDeviceWidth(Platform::AceRunArgs& args, const int32_t deviceWidth) const { args.deviceWidth = deviceWidth; } void JsAppImpl::SetDeviceHeight(Platform::AceRunArgs& args, const int32_t deviceHeight) const { args.deviceHeight = deviceHeight; } void JsAppImpl::SetWindowTitle(Platform::AceRunArgs& args, const std::string windowTitle) const { args.windowTitle = windowTitle; } void JsAppImpl::SetUrl(Platform::AceRunArgs& args, const std::string urlPath) const { args.url = urlPath; } void JsAppImpl::SetConfigChanges(Platform::AceRunArgs& args, const std::string configChanges) const { args.configChanges = configChanges; } void JsAppImpl::SetColorMode(Platform::AceRunArgs& args, const std::string colorMode) const { ILOG("JsAppImpl::RunJsApp SetColorMode: %s", colorMode.c_str()); if (colorMode == "dark") { args.deviceConfig.colorMode = ColorMode::DARK; } else { args.deviceConfig.colorMode = ColorMode::LIGHT; } } void JsAppImpl::SetOrientation(Platform::AceRunArgs& args, const std::string orientation) const { ILOG("JsAppImpl::RunJsApp SetOrientation: %s", orientation.c_str()); if (orientation == "landscape") { args.deviceConfig.orientation = DeviceOrientation::LANDSCAPE; } else { args.deviceConfig.orientation = DeviceOrientation::PORTRAIT; } } void JsAppImpl::SetAceVersionArgs(Platform::AceRunArgs& args, const std::string aceVersion) const { ILOG("JsAppImpl::RunJsApp SetAceVersionArgs: %s", aceVersion.c_str()); if (aceVersion == "ACE_2_0") { args.aceVersion = Platform::AceVersion::ACE_2_0; } else { args.aceVersion = Platform::AceVersion::ACE_1_0; } } void JsAppImpl::SetLanguage(Platform::AceRunArgs& args, const std::string language) const { args.language = language; } void JsAppImpl::SetRegion(Platform::AceRunArgs& args, const std::string region) const { args.region = region; } void JsAppImpl::SetScript(Platform::AceRunArgs& args, const std::string script) const { args.script = script; } void JsAppImpl::SetSystemResourcesPath(Platform::AceRunArgs& args) const { string sep = FileSystem::GetSeparator(); string rPath = FileSystem::GetApplicationPath(); int idx = rPath.find_last_of(sep); rPath = rPath.substr(0, idx + 1) + "resources"; args.systemResourcesPath = rPath; } void JsAppImpl::SetAppResourcesPath(Platform::AceRunArgs& args, const std::string appResourcesPath) const { args.appResourcesPath = appResourcesPath; } void JsAppImpl::SetFormsEnabled(Platform::AceRunArgs& args, bool formsEnabled) const { args.formsEnabled = formsEnabled; } void JsAppImpl::SetContainerSdkPath(Platform::AceRunArgs& args, const std::string containerSdkPath) const { args.containerSdkPath = containerSdkPath; } void JsAppImpl::SetOnRender(Platform::AceRunArgs& args) const { args.onRender = std::move(VirtualScreenImpl::CallBack); } void JsAppImpl::SetOnRouterChange(Platform::AceRunArgs& args) const { args.onRouterChange = std::move(VirtualScreenImpl::PageCallBack); } void JsAppImpl::SetOnError(Platform::AceRunArgs& args) const { args.onError = std::move(VirtualScreenImpl::FastPreviewCallBack); } void JsAppImpl::SetComponentModeEnabled(Platform::AceRunArgs& args, bool isComponentMode) const { args.isComponentMode = isComponentMode; } void JsAppImpl::AssignValueForWidthAndHeight(const int32_t origWidth, const int32_t origHeight, const int32_t compWidth, const int32_t compHeight) { orignalWidth = origWidth; orignalHeight = origHeight; width = compWidth; height = compHeight; ILOG("AssignValueForWidthAndHeight: %d %d %d %d", orignalWidth, orignalHeight, width, height); } void JsAppImpl::ResolutionChanged(int32_t changedOriginWidth, int32_t changedOriginHeight, int32_t changedWidth, int32_t changedHeight, int32_t screenDensity) { SetResolutionParams(changedOriginWidth, changedOriginHeight, changedWidth, changedHeight, screenDensity); if (isDebug && debugServerPort >= 0) { #if defined(__APPLE__) || defined(_WIN32) SetWindowParams(); OHOS::Ace::ViewportConfig config; config.SetSize(windowModel->originWidth, windowModel->originHeight); config.SetPosition(0, 0); config.SetOrientation(static_cast( OHOS::Previewer::PreviewerWindow::TransOrientation(windowModel->orientation))); config.SetDensity(windowModel->density); OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); if (!window) { ELOG("JsApp::Run get window failed."); return; } OHOS::AppExecFwk::EventHandler::PostTask([this]() { glfwRenderContext->SetWindowSize(width, height); }); simulator->UpdateConfiguration(*(UpdateConfiguration(aceRunArgs).get())); window->SetViewportConfig(config); #endif } else { if (ability != nullptr) { OHOS::AppExecFwk::EventHandler::PostTask([this]() { glfwRenderContext->SetWindowSize(width, height); }); ability->SurfaceChanged(aceRunArgs.deviceConfig.orientation, aceRunArgs.deviceConfig.density, aceRunArgs.deviceWidth, aceRunArgs.deviceHeight); } } } void JsAppImpl::SetResolutionParams(int32_t changedOriginWidth, int32_t changedOriginHeight, int32_t changedWidth, int32_t changedHeight, int32_t screenDensity) { SetDeviceWidth(aceRunArgs, changedWidth); SetDeviceHeight(aceRunArgs, changedHeight); orignalWidth = changedOriginWidth; orignalHeight = changedOriginHeight; VirtualScreenImpl::GetInstance().SetVirtualScreenWidthAndHeight(changedOriginWidth, changedOriginHeight, changedWidth, changedHeight); SetDeviceScreenDensity(screenDensity, CommandParser::GetInstance().GetDeviceType()); AdaptDeviceType(aceRunArgs, CommandParser::GetInstance().GetDeviceType(), VirtualScreenImpl::GetInstance().GetOrignalWidth()); AssignValueForWidthAndHeight(VirtualScreenImpl::GetInstance().GetOrignalWidth(), VirtualScreenImpl::GetInstance().GetOrignalHeight(), VirtualScreenImpl::GetInstance().GetCompressionWidth(), VirtualScreenImpl::GetInstance().GetCompressionHeight()); if (changedWidth <= changedHeight) { JsAppImpl::GetInstance().SetDeviceOrentation("portrait"); } else { JsAppImpl::GetInstance().SetDeviceOrentation("landscape"); } SetOrientation(aceRunArgs, orientation); ILOG("ResolutionChanged: %s %d %d %f", orientation.c_str(), aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, aceRunArgs.deviceConfig.density); } void JsAppImpl::SetArgsColorMode(const string& value) { colorMode = value; } void JsAppImpl::SetArgsAceVersion(const string& value) { aceVersion = value; } void JsAppImpl::SetDeviceOrentation(const string& value) { orientation = value; } std::string JsAppImpl::GetOrientation() const { return orientation; } std::string JsAppImpl::GetColorMode() const { return colorMode; } void JsAppImpl::SetDeviceScreenDensity(const int32_t screenDensity, const std::string type) { if (type == "wearable" && screenDensity != 0) { watchScreenDensity = screenDensity; return; } if (type == "tv" && screenDensity != 0) { tvScreenDensity = screenDensity; return; } if ((type == "phone" || type == "default") && screenDensity != 0) { phoneScreenDensity = screenDensity; return; } if (type == "2in1" && screenDensity != 0) { twoInOneScreenDensity = screenDensity; return; } if (type == "tablet" && screenDensity != 0) { tabletScreenDensity = screenDensity; return; } if (type == "car" && screenDensity != 0) { carScreenDensity = screenDensity; return; } ILOG("DeviceType not supported to SetDeviceScreenDensity: %s", type.c_str()); return; } void JsAppImpl::ReloadRuntimePage(const std::string currentPage) { std::string params = ""; if (ability != nullptr) { ability->ReplacePage(currentPage, params); } } void JsAppImpl::SetScreenDensity(const std::string value) { screenDensity = value; } void JsAppImpl::SetConfigChanges(const std::string value) { configChanges = value; } bool JsAppImpl::MemoryRefresh(const std::string memoryRefreshArgs) const { ILOG("MemoryRefresh."); if (ability != nullptr) { return ability->OperateComponent(memoryRefreshArgs); } return false; } void JsAppImpl::ParseSystemParams(OHOS::Ace::Platform::AceRunArgs& args, Json::Value paramObj) { if (paramObj == Json::nullValue) { SetDeviceWidth(args, VirtualScreenImpl::GetInstance().GetCompressionWidth()); SetDeviceHeight(args, VirtualScreenImpl::GetInstance().GetCompressionHeight()); AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight, args.deviceWidth, args.deviceHeight); SetColorMode(args, colorMode); SetOrientation(args, orientation); SetDeviceScreenDensity(atoi(screenDensity.c_str()), CommandParser::GetInstance().GetDeviceType()); AdaptDeviceType(args, CommandParser::GetInstance().GetDeviceType(), VirtualScreenImpl::GetInstance().GetOrignalWidth()); SetLanguage(args, SharedData::GetData(SharedDataType::LAN)); SetRegion(args, SharedData::GetData(SharedDataType::REGION)); } else { SetDeviceWidth(args, paramObj["width"].asInt()); SetDeviceHeight(args, paramObj["height"].asInt()); AssignValueForWidthAndHeight(args.deviceWidth, args.deviceHeight, args.deviceWidth, args.deviceHeight); SetColorMode(args, paramObj["colorMode"].asString()); SetOrientation(args, paramObj["orientation"].asString()); string deviceType = paramObj["deviceType"].asString(); SetDeviceScreenDensity(atoi(screenDensity.c_str()), deviceType); AdaptDeviceType(args, deviceType, args.deviceWidth, paramObj["dpi"].asDouble()); string lanInfo = paramObj["locale"].asString(); SetLanguage(args, lanInfo.substr(0, lanInfo.find("_"))); SetRegion(args, lanInfo.substr(lanInfo.find("_") + 1, lanInfo.length() - 1)); } } void JsAppImpl::SetSystemParams(OHOS::Ace::Platform::SystemParams& params, Json::Value paramObj) { ParseSystemParams(aceRunArgs, paramObj); params.deviceWidth = aceRunArgs.deviceWidth; params.deviceHeight = aceRunArgs.deviceHeight; params.language = aceRunArgs.language; params.region = aceRunArgs.region; params.colorMode = aceRunArgs.deviceConfig.colorMode; params.orientation = aceRunArgs.deviceConfig.orientation; params.deviceType = aceRunArgs.deviceConfig.deviceType; params.density = aceRunArgs.deviceConfig.density; params.isRound = (paramObj == Json::nullValue) ? (CommandParser::GetInstance().GetScreenShape() == "circle") : paramObj["roundScreen"].asBool(); } void JsAppImpl::LoadDocument(const std::string filePath, const std::string componentName, Json::Value previewContext) { ILOG("LoadDocument."); if (ability != nullptr) { OHOS::Ace::Platform::SystemParams params; SetSystemParams(params, previewContext); ILOG("LoadDocument params is density: %f region: %s language: %s deviceWidth: %d\ deviceHeight: %d isRound:%d colorMode:%s orientation: %s deviceType: %s", params.density, params.region.c_str(), params.language.c_str(), params.deviceWidth, params.deviceHeight, (params.isRound ? "true" : "false"), ((params.colorMode == ColorMode::DARK) ? "dark" : "light"), ((params.orientation == DeviceOrientation::LANDSCAPE) ? "landscape" : "portrait"), GetDeviceTypeName(params.deviceType).c_str()); OHOS::AppExecFwk::EventHandler::PostTask([this]() { glfwRenderContext->SetWindowSize(width, height); }); ability->LoadDocument(filePath, componentName, params); } } void JsAppImpl::DispatchBackPressedEvent() const { ability->OnBackPressed(); } void JsAppImpl::DispatchKeyEvent(const std::shared_ptr& keyEvent) const { if (isDebug && debugServerPort >= 0) { #if defined(__APPLE__) || defined(_WIN32) OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); if (!window) { ELOG("JsApp::Run get window failed."); return; } window->ConsumeKeyEvent(keyEvent); #endif } else { ability->OnInputEvent(keyEvent); } } void JsAppImpl::DispatchPointerEvent(const std::shared_ptr& pointerEvent) const { if (isDebug && debugServerPort >= 0) { #if defined(__APPLE__) || defined(_WIN32) OHOS::Rosen::Window* window = OHOS::Previewer::PreviewerWindow::GetInstance().GetWindowObject(); if (!window) { ELOG("JsApp::Run get window failed."); return; } window->ConsumePointerEvent(pointerEvent); #endif } else { ability->OnInputEvent(pointerEvent); } } void JsAppImpl::DispatchAxisEvent(const std::shared_ptr& axisEvent) const { ability->OnInputEvent(axisEvent); } void JsAppImpl::DispatchInputMethodEvent(const unsigned int code_point) const { ability->OnInputMethodEvent(code_point); } string JsAppImpl::GetDeviceTypeName(const OHOS::Ace::DeviceType type) const { switch (type) { case DeviceType::WATCH: return "watch"; case DeviceType::TV: return "tv"; case DeviceType::PHONE: return "phone"; case DeviceType::TABLET: return "tablet"; case DeviceType::CAR: return "car"; default: return ""; } } void JsAppImpl::InitGlfwEnv() { glfwRenderContext = OHOS::Rosen::GlfwRenderContext::GetGlobal(); if (!glfwRenderContext->Init()) { ELOG("Could not create window: InitGlfwEnv failed."); return; } glfwRenderContext->CreateGlfwWindow(aceRunArgs.deviceWidth, aceRunArgs.deviceHeight, false); }