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