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 std::string fontSizeScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE);
79 jsValue = WrapDoubleToJS(env, fontSizeScale != "" ? std::stod(fontSizeScale) : 1.0);
80 SetPropertyValueByPropertyName(env, jsObject, "fontSizeScale", jsValue);
81
82 std::string fontWeightScale = configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE);
83 jsValue = WrapDoubleToJS(env, fontWeightScale != "" ? std::stod(fontWeightScale) : 1.0);
84 SetPropertyValueByPropertyName(env, jsObject, "fontWeightScale", jsValue);
85
86 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MCC));
87 SetPropertyValueByPropertyName(env, jsObject, "mcc", jsValue);
88
89 jsValue = WrapStringToJS(env, configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_MNC));
90 SetPropertyValueByPropertyName(env, jsObject, "mnc", jsValue);
91
92 return jsObject;
93 }
94
UnwrapConfiguration(napi_env env,napi_value param,Configuration & config)95 bool UnwrapConfiguration(napi_env env, napi_value param, Configuration &config)
96 {
97 TAG_LOGI(AAFwkTag::JSNAPI, "called");
98
99 if (!IsTypeForNapiValue(env, param, napi_object)) {
100 TAG_LOGI(AAFwkTag::JSNAPI, "not napi_object");
101 return false;
102 }
103
104 std::string language {""};
105 if (UnwrapStringByPropertyName(env, param, "language", language)) {
106 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed language part %{public}s", language.c_str());
107 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE, language)) {
108 TAG_LOGE(AAFwkTag::JSNAPI, "language Parsing failed");
109 return false;
110 }
111 }
112
113 int32_t colormode = -1;
114 if (UnwrapInt32ByPropertyName(env, param, "colorMode", colormode)) {
115 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed colormode part %{public}d", colormode);
116 if (colormode != Global::Resource::DARK && colormode != Global::Resource::LIGHT) {
117 TAG_LOGE(AAFwkTag::JSNAPI, "Set colorMode to unsupported value");
118 return false;
119 }
120 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, GetColorModeStr(colormode))) {
121 TAG_LOGE(AAFwkTag::JSNAPI, "colorMode parsing failed");
122 return false;
123 }
124 }
125
126 double fontSizeScale = 0.0;
127 if (UnwrapDoubleByPropertyName(env, param, "fontSizeScale", fontSizeScale)) {
128 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontSizeScale part %{public}lf", fontSizeScale);
129 if (fontSizeScale < FONT_SIZE_MIN_SCALE || fontSizeScale > FONT_SIZE_MAX_SCALE) {
130 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontSizeScale");
131 return false;
132 }
133 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, std::to_string(fontSizeScale))) {
134 return false;
135 }
136 }
137
138 double fontWeightScale = 0.0;
139 if (UnwrapDoubleByPropertyName(env, param, "fontWeightScale", fontWeightScale)) {
140 TAG_LOGD(AAFwkTag::JSNAPI, "The parsed fontWeightScale part %{public}lf", fontWeightScale);
141 if (fontWeightScale < FONT_WEIGHT_MIN_SCALE || fontWeightScale > FONT_WEIGHT_MAX_SCALE) {
142 TAG_LOGE(AAFwkTag::JSNAPI, "invalid fontWeightScale");
143 return false;
144 }
145 if (!config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE, std::to_string(fontWeightScale))) {
146 return false;
147 }
148 }
149
150 return true;
151 }
152 EXTERN_C_END
153 } // namespace AppExecFwk
154 } // namespace OHOS
155