1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi_common_configuration.h"
17
18 #include "configuration_convertor.h"
19 #include "hilog_tag_wrapper.h"
20 #include "napi_common_util.h"
21
22 namespace OHOS {
23 namespace AppExecFwk {
24 namespace {
25 constexpr double FONT_SIZE_MIN_SCALE = 0.0;
26 constexpr double FONT_SIZE_MAX_SCALE = 3.2;
27 constexpr double FONT_WEIGHT_MIN_SCALE = 0.0;
28 constexpr double FONT_WEIGHT_MAX_SCALE = 1.25;
29 }
30
31 EXTERN_C_START
32
InnerWrapConfigurationString(napi_env env,napi_value jsObject,const std::string & key,const std::string & value)33 bool InnerWrapConfigurationString(
34 napi_env env, napi_value jsObject, const std::string &key, const std::string &value)
35 {
36 if (!value.empty()) {
37 TAG_LOGI(AAFwkTag::JSNAPI, "key=%{public}s, value=%{private}s", key.c_str(), value.c_str());
38 napi_value jsValue = WrapStringToJS(env, value);
39 if (jsValue != nullptr) {
40 NAPI_CALL_BASE(env, napi_set_named_property(env, jsObject, key.c_str(), jsValue), false);
41 return true;
42 }
43 }
44 return false;
45 }
46
WrapConfiguration(napi_env env,const AppExecFwk::Configuration & configuration)47 napi_value WrapConfiguration(napi_env env, const AppExecFwk::Configuration &configuration)
48 {
49 TAG_LOGD(AAFwkTag::JSNAPI, "called, config size %{public}d", static_cast<int>(configuration.GetItemSize()));
50 napi_value jsObject = nullptr;
51 NAPI_CALL(env, napi_create_object(env, &jsObject));
52
53 napi_value jsValue = nullptr;
54 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE));
55 SetPropertyValueByPropertyName(env, jsObject, "language", jsValue);
56
57 jsValue = WrapInt32ToJS(
58 env, ConvertColorMode(configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE)));
59 SetPropertyValueByPropertyName(env, jsObject, "colorMode", jsValue);
60
61 int32_t displayId = ConvertDisplayId(configuration.GetItem(ConfigurationInner::APPLICATION_DISPLAYID));
62
63 std::string direction = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DIRECTION);
64 jsValue = WrapInt32ToJS(env, ConvertDirection(direction));
65 SetPropertyValueByPropertyName(env, jsObject, "direction", jsValue);
66
67 std::string density = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DENSITYDPI);
68 jsValue = WrapInt32ToJS(env, ConvertDensity(density));
69 SetPropertyValueByPropertyName(env, jsObject, "screenDensity", jsValue);
70
71 jsValue = WrapInt32ToJS(env, displayId);
72 SetPropertyValueByPropertyName(env, jsObject, "displayId", jsValue);
73
74 std::string hasPointerDevice = configuration.GetItem(AAFwk::GlobalConfigurationKey::INPUT_POINTER_DEVICE);
75 jsValue = WrapBoolToJS(env, hasPointerDevice == "true" ? true : false);
76 SetPropertyValueByPropertyName(env, jsObject, "hasPointerDevice", jsValue);
77
78 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_ID));
79 SetPropertyValueByPropertyName(env, jsObject, "fontId", jsValue);
80
81 std::string fontSizeScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE);
82 jsValue = WrapDoubleToJS(env, fontSizeScale != "" ? std::stod(fontSizeScale) : 1.0);
83 SetPropertyValueByPropertyName(env, jsObject, "fontSizeScale", jsValue);
84
85 std::string fontWeightScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE);
86 jsValue = WrapDoubleToJS(env, fontWeightScale != "" ? std::stod(fontWeightScale) : 1.0);
87 SetPropertyValueByPropertyName(env, jsObject, "fontWeightScale", jsValue);
88
89 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MCC));
90 SetPropertyValueByPropertyName(env, jsObject, "mcc", jsValue);
91
92 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MNC));
93 SetPropertyValueByPropertyName(env, jsObject, "mnc", jsValue);
94
95 return jsObject;
96 }
97
UnwrapConfiguration(napi_env env,napi_value param,Configuration & config)98 bool UnwrapConfiguration(napi_env env, napi_value param, Configuration &config)
99 {
100 TAG_LOGI(AAFwkTag::JSNAPI, "called");
101
102 if (!IsTypeForNapiValue(env, param, napi_object)) {
103 TAG_LOGI(AAFwkTag::JSNAPI, "not napi_object");
104 return false;
105 }
106
107 std::string language {""};
108 if (UnwrapStringByPropertyName(env, param, "language", language)) {
109 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed language part %{public}s", language.c_str());
110 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, language)) {
111 TAG_LOGE(AAFwkTag::JSNAPI, "language Parsing failed");
112 return false;
113 }
114 }
115
116 int32_t colormode = -1;
117 if (UnwrapInt32ByPropertyName(env, param, "colorMode", colormode)) {
118 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed colormode part %{public}d", colormode);
119 if (colormode != Global::Resource::DARK && colormode != Global::Resource::LIGHT) {
120 TAG_LOGE(AAFwkTag::JSNAPI, "Set colorMode to unsupported value");
121 return false;
122 }
123 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, GetColorModeStr(colormode))) {
124 TAG_LOGE(AAFwkTag::JSNAPI, "colorMode parsing failed");
125 return false;
126 }
127 }
128
129 double fontSizeScale = 0.0;
130 if (UnwrapDoubleByPropertyName(env, param, "fontSizeScale", fontSizeScale)) {
131 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontSizeScale part %{public}lf", fontSizeScale);
132 if (fontSizeScale < FONT_SIZE_MIN_SCALE || fontSizeScale > FONT_SIZE_MAX_SCALE) {
133 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontSizeScale");
134 return false;
135 }
136 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, std::to_string(fontSizeScale))) {
137 return false;
138 }
139 }
140
141 double fontWeightScale = 0.0;
142 if (UnwrapDoubleByPropertyName(env, param, "fontWeightScale", fontWeightScale)) {
143 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontWeightScale part %{public}lf", fontWeightScale);
144 if (fontWeightScale < FONT_WEIGHT_MIN_SCALE || fontWeightScale > FONT_WEIGHT_MAX_SCALE) {
145 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontWeightScale");
146 return false;
147 }
148 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE, std::to_string(fontWeightScale))) {
149 return false;
150 }
151 }
152
153 return true;
154 }
155 EXTERN_C_END
156 } // namespace AppExecFwk
157 } // namespace OHOS
158