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 = WrapLocaleToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_LOCALE));
58 SetPropertyValueByPropertyName(env, jsObject, "locale", jsValue);
59
60 jsValue = WrapInt32ToJS(
61 env, ConvertColorMode(configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE)));
62 SetPropertyValueByPropertyName(env, jsObject, "colorMode", jsValue);
63
64 int32_t displayId = ConvertDisplayId(configuration.GetItem(ConfigurationInner::APPLICATION_DISPLAYID));
65
66 std::string direction = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DIRECTION);
67 jsValue = WrapInt32ToJS(env, ConvertDirection(direction));
68 SetPropertyValueByPropertyName(env, jsObject, "direction", jsValue);
69
70 std::string density = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DENSITYDPI);
71 jsValue = WrapInt32ToJS(env, ConvertDensity(density));
72 SetPropertyValueByPropertyName(env, jsObject, "screenDensity", jsValue);
73
74 jsValue = WrapInt32ToJS(env, displayId);
75 SetPropertyValueByPropertyName(env, jsObject, "displayId", jsValue);
76
77 std::string hasPointerDevice = configuration.GetItem(AAFwk::GlobalConfigurationKey::INPUT_POINTER_DEVICE);
78 jsValue = WrapBoolToJS(env, hasPointerDevice == "true" ? true : false);
79 SetPropertyValueByPropertyName(env, jsObject, "hasPointerDevice", jsValue);
80
81 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_ID));
82 SetPropertyValueByPropertyName(env, jsObject, "fontId", jsValue);
83
84 std::string fontSizeScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE);
85 jsValue = WrapDoubleToJS(env, fontSizeScale != "" ? std::stod(fontSizeScale) : 1.0);
86 SetPropertyValueByPropertyName(env, jsObject, "fontSizeScale", jsValue);
87
88 std::string fontWeightScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE);
89 jsValue = WrapDoubleToJS(env, fontWeightScale != "" ? std::stod(fontWeightScale) : 1.0);
90 SetPropertyValueByPropertyName(env, jsObject, "fontWeightScale", jsValue);
91
92 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MCC));
93 SetPropertyValueByPropertyName(env, jsObject, "mcc", jsValue);
94
95 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MNC));
96 SetPropertyValueByPropertyName(env, jsObject, "mnc", jsValue);
97
98 return jsObject;
99 }
100
UnwrapConfiguration(napi_env env,napi_value param,Configuration & config)101 bool UnwrapConfiguration(napi_env env, napi_value param, Configuration &config)
102 {
103 TAG_LOGI(AAFwkTag::JSNAPI, "called");
104
105 if (!IsTypeForNapiValue(env, param, napi_object)) {
106 TAG_LOGI(AAFwkTag::JSNAPI, "not napi_object");
107 return false;
108 }
109
110 std::string language {""};
111 if (UnwrapStringByPropertyName(env, param, "language", language)) {
112 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed language part %{public}s", language.c_str());
113 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, language)) {
114 TAG_LOGE(AAFwkTag::JSNAPI, "language Parsing failed");
115 return false;
116 }
117 }
118
119 std::string locale {""};
120 if (UnwrapLocaleByPropertyName(env, param, "locale", locale)) {
121 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed locale part %{public}s", locale.c_str());
122 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_LOCALE, locale)) {
123 TAG_LOGE(AAFwkTag::JSNAPI, "locale Parsing failed");
124 return false;
125 }
126 }
127
128 int32_t colormode = -1;
129 if (UnwrapInt32ByPropertyName(env, param, "colorMode", colormode)) {
130 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed colormode part %{public}d", colormode);
131 if (colormode != Global::Resource::DARK && colormode != Global::Resource::LIGHT) {
132 TAG_LOGE(AAFwkTag::JSNAPI, "Set colorMode to unsupported value");
133 return false;
134 }
135 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, GetColorModeStr(colormode))) {
136 TAG_LOGE(AAFwkTag::JSNAPI, "colorMode parsing failed");
137 return false;
138 }
139 }
140
141 double fontSizeScale = 0.0;
142 if (UnwrapDoubleByPropertyName(env, param, "fontSizeScale", fontSizeScale)) {
143 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontSizeScale part %{public}lf", fontSizeScale);
144 if (fontSizeScale < FONT_SIZE_MIN_SCALE || fontSizeScale > FONT_SIZE_MAX_SCALE) {
145 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontSizeScale");
146 return false;
147 }
148 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, std::to_string(fontSizeScale))) {
149 return false;
150 }
151 }
152
153 double fontWeightScale = 0.0;
154 if (UnwrapDoubleByPropertyName(env, param, "fontWeightScale", fontWeightScale)) {
155 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontWeightScale part %{public}lf", fontWeightScale);
156 if (fontWeightScale < FONT_WEIGHT_MIN_SCALE || fontWeightScale > FONT_WEIGHT_MAX_SCALE) {
157 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontWeightScale");
158 return false;
159 }
160 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE, std::to_string(fontWeightScale))) {
161 return false;
162 }
163 }
164
165 return true;
166 }
167 EXTERN_C_END
168 } // namespace AppExecFwk
169 } // namespace OHOS
170