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