• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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