1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci#include "window_manager_config.h" 17e0dac50fSopenharmony_ci#include "config_policy_utils.h" 18e0dac50fSopenharmony_ci#include "window_helper.h" 19e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 20e0dac50fSopenharmony_ci 21e0dac50fSopenharmony_cinamespace OHOS { 22e0dac50fSopenharmony_cinamespace Rosen { 23e0dac50fSopenharmony_cinamespace { 24e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManagerConfig"}; 25e0dac50fSopenharmony_ci} 26e0dac50fSopenharmony_ci 27e0dac50fSopenharmony_ciWindowManagerConfig::ConfigItem WindowManagerConfig::config_; 28e0dac50fSopenharmony_ciconst std::map<std::string, WindowManagerConfig::ValueType> WindowManagerConfig::configItemTypeMap_ = { 29e0dac50fSopenharmony_ci { "maxAppWindowNumber", WindowManagerConfig::ValueType::INTS }, 30e0dac50fSopenharmony_ci { "modeChangeHotZones", WindowManagerConfig::ValueType::INTS }, 31e0dac50fSopenharmony_ci { "duration", WindowManagerConfig::ValueType::INTS }, 32e0dac50fSopenharmony_ci { "durationIn", WindowManagerConfig::ValueType::INTS }, 33e0dac50fSopenharmony_ci { "durationOut", WindowManagerConfig::ValueType::INTS }, 34e0dac50fSopenharmony_ci { "defaultWindowMode", WindowManagerConfig::ValueType::INTS }, 35e0dac50fSopenharmony_ci { "dragFrameGravity", WindowManagerConfig::ValueType::INTS }, 36e0dac50fSopenharmony_ci { "floatingBottomPosY", WindowManagerConfig::ValueType::INTS }, 37e0dac50fSopenharmony_ci { "defaultFloatingWindow", WindowManagerConfig::ValueType::INTS }, 38e0dac50fSopenharmony_ci { "maxMainFloatingWindowNumber", WindowManagerConfig::ValueType::INTS }, 39e0dac50fSopenharmony_ci { "maxFloatingWindowSize", WindowManagerConfig::ValueType::INTS }, 40e0dac50fSopenharmony_ci { "defaultMaximizeMode", WindowManagerConfig::ValueType::INTS }, 41e0dac50fSopenharmony_ci { "windowAnimation", WindowManagerConfig::ValueType::MAP }, 42e0dac50fSopenharmony_ci { "keyboardAnimation", WindowManagerConfig::ValueType::MAP }, 43e0dac50fSopenharmony_ci { "animationIn", WindowManagerConfig::ValueType::MAP }, 44e0dac50fSopenharmony_ci { "animationOut", WindowManagerConfig::ValueType::MAP }, 45e0dac50fSopenharmony_ci { "timing", WindowManagerConfig::ValueType::MAP }, 46e0dac50fSopenharmony_ci { "windowEffect", WindowManagerConfig::ValueType::MAP }, 47e0dac50fSopenharmony_ci { "appWindows", WindowManagerConfig::ValueType::MAP }, 48e0dac50fSopenharmony_ci { "cornerRadius", WindowManagerConfig::ValueType::MAP }, 49e0dac50fSopenharmony_ci { "shadow", WindowManagerConfig::ValueType::MAP }, 50e0dac50fSopenharmony_ci { "focused", WindowManagerConfig::ValueType::MAP }, 51e0dac50fSopenharmony_ci { "unfocused", WindowManagerConfig::ValueType::MAP }, 52e0dac50fSopenharmony_ci { "decor", WindowManagerConfig::ValueType::MAP }, 53e0dac50fSopenharmony_ci { "startWindowTransitionAnimation", WindowManagerConfig::ValueType::MAP }, 54e0dac50fSopenharmony_ci { "curve", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 55e0dac50fSopenharmony_ci { "splitRatios", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 56e0dac50fSopenharmony_ci { "exitSplitRatios", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 57e0dac50fSopenharmony_ci { "scale", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 58e0dac50fSopenharmony_ci { "opacity", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 59e0dac50fSopenharmony_ci { "opacityStart", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 60e0dac50fSopenharmony_ci { "opacityEnd", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 61e0dac50fSopenharmony_ci { "elevation", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 62e0dac50fSopenharmony_ci { "alpha", WindowManagerConfig::ValueType::POSITIVE_FLOATS }, 63e0dac50fSopenharmony_ci { "rotation", WindowManagerConfig::ValueType::FLOATS }, 64e0dac50fSopenharmony_ci { "translate", WindowManagerConfig::ValueType::FLOATS }, 65e0dac50fSopenharmony_ci { "offsetX", WindowManagerConfig::ValueType::FLOATS }, 66e0dac50fSopenharmony_ci { "offsetY", WindowManagerConfig::ValueType::FLOATS }, 67e0dac50fSopenharmony_ci { "radius", WindowManagerConfig::ValueType::FLOATS }, 68e0dac50fSopenharmony_ci { "fullScreen", WindowManagerConfig::ValueType::STRING }, 69e0dac50fSopenharmony_ci { "split", WindowManagerConfig::ValueType::STRING }, 70e0dac50fSopenharmony_ci { "float", WindowManagerConfig::ValueType::STRING }, 71e0dac50fSopenharmony_ci { "color", WindowManagerConfig::ValueType::STRING }, 72e0dac50fSopenharmony_ci { "supportedMode", WindowManagerConfig::ValueType::STRINGS }, 73e0dac50fSopenharmony_ci { "minimizeByOther", WindowManagerConfig::ValueType::UNDIFINED }, 74e0dac50fSopenharmony_ci { "stretchable", WindowManagerConfig::ValueType::UNDIFINED }, 75e0dac50fSopenharmony_ci { "remoteAnimation", WindowManagerConfig::ValueType::UNDIFINED }, 76e0dac50fSopenharmony_ci { "configMainFloatingWindowAbove", WindowManagerConfig::ValueType::UNDIFINED }, 77e0dac50fSopenharmony_ci { "uiType", WindowManagerConfig::ValueType::STRING }, 78e0dac50fSopenharmony_ci { "supportTypeFloatWindow", WindowManagerConfig::ValueType::STRING }, 79e0dac50fSopenharmony_ci}; 80e0dac50fSopenharmony_ci 81e0dac50fSopenharmony_cistd::vector<std::string> WindowManagerConfig::SplitNodeContent(const xmlNodePtr& node, const std::string& pattern) 82e0dac50fSopenharmony_ci{ 83e0dac50fSopenharmony_ci xmlChar* content = xmlNodeGetContent(node); 84e0dac50fSopenharmony_ci if (content == nullptr) { 85e0dac50fSopenharmony_ci WLOGFE("[WmConfig] read xml node error: nodeName:(%{public}s)", node->name); 86e0dac50fSopenharmony_ci return std::vector<std::string>(); 87e0dac50fSopenharmony_ci } 88e0dac50fSopenharmony_ci 89e0dac50fSopenharmony_ci std::string contentStr = reinterpret_cast<const char*>(content); 90e0dac50fSopenharmony_ci xmlFree(content); 91e0dac50fSopenharmony_ci if (contentStr.size() == 0) { 92e0dac50fSopenharmony_ci return std::vector<std::string>(); 93e0dac50fSopenharmony_ci } 94e0dac50fSopenharmony_ci return WindowHelper::Split(contentStr, pattern); 95e0dac50fSopenharmony_ci} 96e0dac50fSopenharmony_ci 97e0dac50fSopenharmony_cistd::string WindowManagerConfig::GetConfigPath(const std::string& configFileName) 98e0dac50fSopenharmony_ci{ 99e0dac50fSopenharmony_ci char buf[PATH_MAX + 1]; 100e0dac50fSopenharmony_ci char* configPath = GetOneCfgFile(configFileName.c_str(), buf, PATH_MAX + 1); 101e0dac50fSopenharmony_ci char tmpPath[PATH_MAX + 1] = { 0 }; 102e0dac50fSopenharmony_ci if (!configPath || strlen(configPath) == 0 || strlen(configPath) > PATH_MAX || !realpath(configPath, tmpPath)) { 103e0dac50fSopenharmony_ci WLOGI("[WmConfig] can not get customization config file"); 104e0dac50fSopenharmony_ci return "/system/" + configFileName; 105e0dac50fSopenharmony_ci } 106e0dac50fSopenharmony_ci return std::string(tmpPath); 107e0dac50fSopenharmony_ci} 108e0dac50fSopenharmony_ci 109e0dac50fSopenharmony_civoid WindowManagerConfig::ReadConfig(const xmlNodePtr& rootPtr, std::map<std::string, ConfigItem>& mapValue) 110e0dac50fSopenharmony_ci{ 111e0dac50fSopenharmony_ci for (xmlNodePtr curNodePtr = rootPtr->xmlChildrenNode; curNodePtr != nullptr; curNodePtr = curNodePtr->next) { 112e0dac50fSopenharmony_ci if (!IsValidNode(*curNodePtr)) { 113e0dac50fSopenharmony_ci WLOGFE("[WmConfig]: invalid node!"); 114e0dac50fSopenharmony_ci continue; 115e0dac50fSopenharmony_ci } 116e0dac50fSopenharmony_ci std::string nodeName = reinterpret_cast<const char*>(curNodePtr->name); 117e0dac50fSopenharmony_ci if (configItemTypeMap_.count(nodeName)) { 118e0dac50fSopenharmony_ci std::map<std::string, ConfigItem> property = ReadProperty(curNodePtr); 119e0dac50fSopenharmony_ci if (property.size() > 0) { 120e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetProperty(property); 121e0dac50fSopenharmony_ci } 122e0dac50fSopenharmony_ci switch (configItemTypeMap_.at(nodeName)) { 123e0dac50fSopenharmony_ci case ValueType::INTS: { 124e0dac50fSopenharmony_ci std::vector<int> v = ReadIntNumbersConfigInfo(curNodePtr); 125e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 126e0dac50fSopenharmony_ci break; 127e0dac50fSopenharmony_ci } 128e0dac50fSopenharmony_ci case ValueType::FLOATS: { 129e0dac50fSopenharmony_ci std::vector<float> v = ReadFloatNumbersConfigInfo(curNodePtr, true); 130e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 131e0dac50fSopenharmony_ci break; 132e0dac50fSopenharmony_ci } 133e0dac50fSopenharmony_ci case ValueType::POSITIVE_FLOATS: { 134e0dac50fSopenharmony_ci std::vector<float> v = ReadFloatNumbersConfigInfo(curNodePtr, false); 135e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 136e0dac50fSopenharmony_ci break; 137e0dac50fSopenharmony_ci } 138e0dac50fSopenharmony_ci case ValueType::STRING: { 139e0dac50fSopenharmony_ci std::string v = ReadStringConfigInfo(curNodePtr); 140e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 141e0dac50fSopenharmony_ci break; 142e0dac50fSopenharmony_ci } 143e0dac50fSopenharmony_ci case ValueType::STRINGS: { 144e0dac50fSopenharmony_ci std::vector<std::string> v = ReadStringsConfigInfo(curNodePtr); 145e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 146e0dac50fSopenharmony_ci break; 147e0dac50fSopenharmony_ci } 148e0dac50fSopenharmony_ci case ValueType::MAP: { 149e0dac50fSopenharmony_ci std::map<std::string, ConfigItem> v; 150e0dac50fSopenharmony_ci ReadConfig(curNodePtr, v); 151e0dac50fSopenharmony_ci mapValue[reinterpret_cast<const char*>(curNodePtr->name)].SetValue(v); 152e0dac50fSopenharmony_ci break; 153e0dac50fSopenharmony_ci } 154e0dac50fSopenharmony_ci default: 155e0dac50fSopenharmony_ci break; 156e0dac50fSopenharmony_ci } 157e0dac50fSopenharmony_ci } 158e0dac50fSopenharmony_ci } 159e0dac50fSopenharmony_ci} 160e0dac50fSopenharmony_ci 161e0dac50fSopenharmony_cibool WindowManagerConfig::LoadConfigXml() 162e0dac50fSopenharmony_ci{ 163e0dac50fSopenharmony_ci auto configFilePath = GetConfigPath("etc/window/resources/window_manager_config.xml"); 164e0dac50fSopenharmony_ci xmlDocPtr docPtr = nullptr; 165e0dac50fSopenharmony_ci { 166e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 167e0dac50fSopenharmony_ci docPtr = xmlReadFile(configFilePath.c_str(), nullptr, XML_PARSE_NOBLANKS); 168e0dac50fSopenharmony_ci } 169e0dac50fSopenharmony_ci WLOGI("[WmConfig] filePath: %{public}s", configFilePath.c_str()); 170e0dac50fSopenharmony_ci if (docPtr == nullptr) { 171e0dac50fSopenharmony_ci WLOGFE("[WmConfig] load xml error!"); 172e0dac50fSopenharmony_ci return false; 173e0dac50fSopenharmony_ci } 174e0dac50fSopenharmony_ci 175e0dac50fSopenharmony_ci xmlNodePtr rootPtr = xmlDocGetRootElement(docPtr); 176e0dac50fSopenharmony_ci if (rootPtr == nullptr || rootPtr->name == nullptr || 177e0dac50fSopenharmony_ci xmlStrcmp(rootPtr->name, reinterpret_cast<const xmlChar*>("Configs"))) { 178e0dac50fSopenharmony_ci WLOGFE("[WmConfig] get root element failed!"); 179e0dac50fSopenharmony_ci xmlFreeDoc(docPtr); 180e0dac50fSopenharmony_ci return false; 181e0dac50fSopenharmony_ci } 182e0dac50fSopenharmony_ci 183e0dac50fSopenharmony_ci std::map<std::string, ConfigItem> configMap; 184e0dac50fSopenharmony_ci config_.SetValue(configMap); 185e0dac50fSopenharmony_ci ReadConfig(rootPtr, *config_.mapValue_); 186e0dac50fSopenharmony_ci 187e0dac50fSopenharmony_ci xmlFreeDoc(docPtr); 188e0dac50fSopenharmony_ci return true; 189e0dac50fSopenharmony_ci} 190e0dac50fSopenharmony_ci 191e0dac50fSopenharmony_cibool WindowManagerConfig::IsValidNode(const xmlNode& currNode) 192e0dac50fSopenharmony_ci{ 193e0dac50fSopenharmony_ci if (currNode.name == nullptr || currNode.type == XML_COMMENT_NODE) { 194e0dac50fSopenharmony_ci return false; 195e0dac50fSopenharmony_ci } 196e0dac50fSopenharmony_ci return true; 197e0dac50fSopenharmony_ci} 198e0dac50fSopenharmony_ci 199e0dac50fSopenharmony_cistd::map<std::string, XmlConfigBase::ConfigItem> WindowManagerConfig::ReadProperty(const xmlNodePtr& currNode) 200e0dac50fSopenharmony_ci{ 201e0dac50fSopenharmony_ci std::map<std::string, ConfigItem> property; 202e0dac50fSopenharmony_ci xmlChar* propVal = xmlGetProp(currNode, reinterpret_cast<const xmlChar*>("enable")); 203e0dac50fSopenharmony_ci if (propVal != nullptr) { 204e0dac50fSopenharmony_ci if (!xmlStrcmp(propVal, reinterpret_cast<const xmlChar*>("true"))) { 205e0dac50fSopenharmony_ci property["enable"].SetValue(true); 206e0dac50fSopenharmony_ci } else if (!xmlStrcmp(propVal, reinterpret_cast<const xmlChar*>("false"))) { 207e0dac50fSopenharmony_ci property["enable"].SetValue(false); 208e0dac50fSopenharmony_ci } 209e0dac50fSopenharmony_ci xmlFree(propVal); 210e0dac50fSopenharmony_ci } 211e0dac50fSopenharmony_ci 212e0dac50fSopenharmony_ci propVal = xmlGetProp(currNode, reinterpret_cast<const xmlChar*>("name")); 213e0dac50fSopenharmony_ci if (propVal != nullptr) { 214e0dac50fSopenharmony_ci property["name"].SetValue(std::string(reinterpret_cast<const char*>(propVal))); 215e0dac50fSopenharmony_ci xmlFree(propVal); 216e0dac50fSopenharmony_ci } 217e0dac50fSopenharmony_ci 218e0dac50fSopenharmony_ci return property; 219e0dac50fSopenharmony_ci} 220e0dac50fSopenharmony_ci 221e0dac50fSopenharmony_cistd::vector<int> WindowManagerConfig::ReadIntNumbersConfigInfo(const xmlNodePtr& currNode) 222e0dac50fSopenharmony_ci{ 223e0dac50fSopenharmony_ci std::vector<int> intsValue; 224e0dac50fSopenharmony_ci auto numbers = SplitNodeContent(currNode); 225e0dac50fSopenharmony_ci for (auto& num : numbers) { 226e0dac50fSopenharmony_ci if (!WindowHelper::IsNumber(num)) { 227e0dac50fSopenharmony_ci WLOGFE("[WmConfig] read int number error: nodeName:(%{public}s)", currNode->name); 228e0dac50fSopenharmony_ci return {}; 229e0dac50fSopenharmony_ci } 230e0dac50fSopenharmony_ci intsValue.push_back(std::stoi(num)); 231e0dac50fSopenharmony_ci } 232e0dac50fSopenharmony_ci return intsValue; 233e0dac50fSopenharmony_ci} 234e0dac50fSopenharmony_ci 235e0dac50fSopenharmony_cistd::vector<std::string> WindowManagerConfig::ReadStringsConfigInfo(const xmlNodePtr& currNode) 236e0dac50fSopenharmony_ci{ 237e0dac50fSopenharmony_ci return SplitNodeContent(currNode); 238e0dac50fSopenharmony_ci} 239e0dac50fSopenharmony_ci 240e0dac50fSopenharmony_cistd::vector<float> WindowManagerConfig::ReadFloatNumbersConfigInfo(const xmlNodePtr& currNode, bool allowNeg) 241e0dac50fSopenharmony_ci{ 242e0dac50fSopenharmony_ci std::vector<float> floatsValue; 243e0dac50fSopenharmony_ci auto numbers = SplitNodeContent(currNode); 244e0dac50fSopenharmony_ci for (auto& num : numbers) { 245e0dac50fSopenharmony_ci if (!WindowHelper::IsFloatingNumber(num, allowNeg)) { 246e0dac50fSopenharmony_ci WLOGFE("[WmConfig] read float number error: nodeName:(%{public}s)", currNode->name); 247e0dac50fSopenharmony_ci return {}; 248e0dac50fSopenharmony_ci } 249e0dac50fSopenharmony_ci floatsValue.push_back(std::stof(num)); 250e0dac50fSopenharmony_ci } 251e0dac50fSopenharmony_ci return floatsValue; 252e0dac50fSopenharmony_ci} 253e0dac50fSopenharmony_ci 254e0dac50fSopenharmony_cistd::string WindowManagerConfig::ReadStringConfigInfo(const xmlNodePtr& currNode) 255e0dac50fSopenharmony_ci{ 256e0dac50fSopenharmony_ci std::string stringValue; 257e0dac50fSopenharmony_ci xmlChar* context = xmlNodeGetContent(currNode); 258e0dac50fSopenharmony_ci if (context == nullptr) { 259e0dac50fSopenharmony_ci WLOGFE("[WmConfig] read xml node error: nodeName:(%{public}s)", currNode->name); 260e0dac50fSopenharmony_ci return {}; 261e0dac50fSopenharmony_ci } 262e0dac50fSopenharmony_ci 263e0dac50fSopenharmony_ci stringValue = std::string(reinterpret_cast<const char*>(context)); 264e0dac50fSopenharmony_ci xmlFree(context); 265e0dac50fSopenharmony_ci return stringValue; 266e0dac50fSopenharmony_ci} 267e0dac50fSopenharmony_ci 268e0dac50fSopenharmony_civoid WindowManagerConfig::DumpConfig(const std::map<std::string, ConfigItem>& config) 269e0dac50fSopenharmony_ci{ 270e0dac50fSopenharmony_ci for (auto& conf : config) { 271e0dac50fSopenharmony_ci WLOGI("[WmConfig] %{public}s", conf.first.c_str()); 272e0dac50fSopenharmony_ci std::map<std::string, ConfigItem> propMap; 273e0dac50fSopenharmony_ci if (conf.second.property_) { 274e0dac50fSopenharmony_ci propMap = *conf.second.property_; 275e0dac50fSopenharmony_ci } 276e0dac50fSopenharmony_ci for (auto prop : propMap) { 277e0dac50fSopenharmony_ci switch (prop.second.type_) { 278e0dac50fSopenharmony_ci case ValueType::BOOL: 279e0dac50fSopenharmony_ci WLOGI("[WmConfig] Prop: %{public}s %{public}u", prop.first.c_str(), prop.second.boolValue_); 280e0dac50fSopenharmony_ci break; 281e0dac50fSopenharmony_ci case ValueType::STRING: 282e0dac50fSopenharmony_ci WLOGI("[WmConfig] Prop: %{public}s %{public}s", prop.first.c_str(), 283e0dac50fSopenharmony_ci prop.second.stringValue_.c_str()); 284e0dac50fSopenharmony_ci break; 285e0dac50fSopenharmony_ci default: 286e0dac50fSopenharmony_ci break; 287e0dac50fSopenharmony_ci } 288e0dac50fSopenharmony_ci } 289e0dac50fSopenharmony_ci switch (conf.second.type_) { 290e0dac50fSopenharmony_ci case ValueType::INTS: 291e0dac50fSopenharmony_ci for (auto& num : *conf.second.intsValue_) { 292e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "[WmConfig] Num: %{public}d", num); 293e0dac50fSopenharmony_ci } 294e0dac50fSopenharmony_ci break; 295e0dac50fSopenharmony_ci case ValueType::MAP: 296e0dac50fSopenharmony_ci if (conf.second.mapValue_) { 297e0dac50fSopenharmony_ci DumpConfig(*conf.second.mapValue_); 298e0dac50fSopenharmony_ci } 299e0dac50fSopenharmony_ci break; 300e0dac50fSopenharmony_ci case ValueType::STRING: 301e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "[WmConfig] %{public}s", conf.second.stringValue_.c_str()); 302e0dac50fSopenharmony_ci break; 303e0dac50fSopenharmony_ci case ValueType::BOOL: 304e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "[WmConfig] %{public}u", conf.second.boolValue_); 305e0dac50fSopenharmony_ci break; 306e0dac50fSopenharmony_ci case ValueType::FLOATS: 307e0dac50fSopenharmony_ci for (auto& num : *conf.second.floatsValue_) { 308e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "[WmConfig] Num: %{public}f", num); 309e0dac50fSopenharmony_ci } 310e0dac50fSopenharmony_ci break; 311e0dac50fSopenharmony_ci default: 312e0dac50fSopenharmony_ci break; 313e0dac50fSopenharmony_ci } 314e0dac50fSopenharmony_ci } 315e0dac50fSopenharmony_ci} 316e0dac50fSopenharmony_ci} // namespace Rosen 317e0dac50fSopenharmony_ci} // namespace OHOS 318