• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "js_ui_appearance.h"
17 
18 #include <string>
19 #include "js_native_api.h"
20 #include "ui_appearance_log.h"
21 
22 namespace OHOS {
23 namespace ArkUi::UiAppearance {
24 namespace {
25 static constexpr size_t ARGC_WITH_ONE = 1;
26 static constexpr size_t ARGC_WITH_TWO = 2;
27 static constexpr size_t MAX_FONT_SCALE = 5;
28 static constexpr size_t MIN_FONT_SCALE = 0;
29 const std::string PERMISSION_ERR_MSG =
30     "An attempt was made to update configuration forbidden by permission: ohos.permission.UPDATE_CONFIGURATION.";
31 const std::string INVALID_ARG_MSG = "The type of 'mode' must be DarkMode.";
32 
33 static const std::unordered_map<int32_t, std::string> ERROR_CODE_TO_MSG {
34     { UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR, "Permission denied. " },
35     { UiAppearanceAbilityInterface::ErrCode::INVALID_ARG, "Parameter error. " },
36     { UiAppearanceAbilityInterface::ErrCode::SYS_ERR, "Internal error. " },
37 };
38 
NapiThrow(napi_env env,const std::string & message,int32_t errCode)39 void NapiThrow(napi_env env, const std::string& message, int32_t errCode)
40 {
41     napi_value code = nullptr;
42     std::string strCode = std::to_string(errCode);
43     napi_create_string_utf8(env, strCode.c_str(), strCode.length(), &code);
44 
45     napi_value msg = nullptr;
46     auto iter = ERROR_CODE_TO_MSG.find(errCode);
47     std::string strMsg = (iter != ERROR_CODE_TO_MSG.end() ? iter->second : "") + message;
48     LOGI("napi throw errCode %{public}d, strMsg %{public}s", errCode, strMsg.c_str());
49     napi_create_string_utf8(env, strMsg.c_str(), strMsg.length(), &msg);
50 
51     napi_value error = nullptr;
52     napi_create_error(env, code, msg, &error);
53     napi_throw(env, error);
54 }
55 } // namespace
56 
OnExecute(napi_env env,void * data)57 void JsUiAppearance::OnExecute(napi_env env, void* data)
58 {
59     LOGI("OnExecute begin.");
60     AsyncContext* asyncContext = static_cast<AsyncContext*>(data);
61     if (asyncContext == nullptr) {
62         NapiThrow(env, "asyncContext is null.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
63         return;
64     }
65     auto resCode = UiAppearanceAbilityClient::GetInstance()->SetDarkMode(asyncContext->mode);
66     asyncContext->status = static_cast<UiAppearanceAbilityInterface::ErrCode>(resCode);
67     if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
68         asyncContext->errMsg = PERMISSION_ERR_MSG;
69     } else if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::INVALID_ARG) {
70         asyncContext->errMsg = INVALID_ARG_MSG;
71     } else {
72         asyncContext->errMsg = "";
73     }
74 }
75 
OnSetFontScale(napi_env env,void * data)76 void JsUiAppearance::OnSetFontScale(napi_env env, void* data)
77 {
78     LOGI("OnSetFontScale begin.");
79     AsyncContext* asyncContext = static_cast<AsyncContext*>(data);
80     if (asyncContext == nullptr) {
81         NapiThrow(env, "asyncContext is null.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
82         return;
83     }
84     auto resCode = UiAppearanceAbilityClient::GetInstance()->SetFontScale(asyncContext->fontScale);
85     asyncContext->status = static_cast<UiAppearanceAbilityInterface::ErrCode>(resCode);
86     if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
87         asyncContext->errMsg = PERMISSION_ERR_MSG;
88     } else if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::INVALID_ARG) {
89         asyncContext->errMsg = INVALID_ARG_MSG;
90     } else {
91         asyncContext->errMsg = "";
92     }
93 }
94 
OnSetFontWeightScale(napi_env env,void * data)95 void JsUiAppearance::OnSetFontWeightScale(napi_env env, void* data)
96 {
97     LOGI("OnSetFontWeightScale begin.");
98     AsyncContext* asyncContext = static_cast<AsyncContext*>(data);
99     if (asyncContext == nullptr) {
100         NapiThrow(env, "asyncContext is null.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
101         return;
102     }
103     auto resCode = UiAppearanceAbilityClient::GetInstance()->
104         SetFontWeightScale(asyncContext->fontWeightScale);
105     asyncContext->status = static_cast<UiAppearanceAbilityInterface::ErrCode>(resCode);
106     if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
107         asyncContext->errMsg = PERMISSION_ERR_MSG;
108     } else if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::INVALID_ARG) {
109         asyncContext->errMsg = INVALID_ARG_MSG;
110     } else {
111         asyncContext->errMsg = "";
112     }
113 }
114 
OnComplete(napi_env env,napi_status status,void * data)115 void JsUiAppearance::OnComplete(napi_env env, napi_status status, void* data)
116 {
117     LOGI("OnComplete begin.");
118     napi_handle_scope scope = nullptr;
119     napi_open_handle_scope(env, &scope);
120     if (scope == nullptr) {
121         NapiThrow(env, "open handle scope failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
122         return;
123     }
124     AsyncContext* asyncContext = static_cast<AsyncContext*>(data);
125     if (asyncContext == nullptr) {
126         NapiThrow(env, "asyncContext is null.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
127         return;
128     }
129 
130     if (asyncContext->status == UiAppearanceAbilityInterface::ErrCode::SUCCEEDED) {
131         napi_value result = nullptr;
132         napi_get_null(env, &result);
133         if (asyncContext->deferred) { // promise
134             napi_resolve_deferred(env, asyncContext->deferred, result);
135         } else { // AsyncCallback
136             napi_value callback = nullptr;
137             napi_get_reference_value(env, asyncContext->callbackRef, &callback);
138             napi_value ret;
139             napi_call_function(env, nullptr, callback, 1, &result, &ret);
140         }
141     } else {
142         napi_value code = nullptr;
143         std::string strCode = std::to_string(asyncContext->status);
144         napi_create_string_utf8(env, strCode.c_str(), strCode.length(), &code);
145 
146         napi_value msg = nullptr;
147         auto iter = ERROR_CODE_TO_MSG.find(asyncContext->status);
148         std::string strMsg = (iter != ERROR_CODE_TO_MSG.end() ? iter->second : "") + asyncContext->errMsg;
149         LOGI("napi throw errCode %{public}d, strMsg %{public}s", asyncContext->status, strMsg.c_str());
150         napi_create_string_utf8(env, strMsg.c_str(), strMsg.length(), &msg);
151 
152         napi_value error = nullptr;
153         napi_create_error(env, code, msg, &error);
154         if (asyncContext->deferred) { // promise
155             napi_reject_deferred(env, asyncContext->deferred, error);
156         } else { // AsyncCallback
157             napi_value callback = nullptr;
158             napi_get_reference_value(env, asyncContext->callbackRef, &callback);
159             napi_value ret;
160             napi_call_function(env, nullptr, callback, 1, &error, &ret);
161         }
162     }
163     napi_delete_async_work(env, asyncContext->work);
164     delete asyncContext;
165     napi_close_handle_scope(env, scope);
166 }
167 
CheckArgs(napi_env env,size_t argc,napi_value * argv)168 napi_status JsUiAppearance::CheckArgs(napi_env env, size_t argc, napi_value* argv)
169 {
170     if (argc != ARGC_WITH_ONE && argc != ARGC_WITH_TWO) {
171         NapiThrow(
172             env, "the number of parameters can only be 1 or 2.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
173         return napi_invalid_arg;
174     }
175 
176     napi_valuetype valueType = napi_undefined;
177     switch (argc) {
178         case ARGC_WITH_TWO:
179             napi_typeof(env, argv[1], &valueType);
180             if (valueType != napi_function) {
181                 NapiThrow(env, "the second parameter must be a function.",
182                     UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
183                 return napi_invalid_arg;
184             }
185             [[fallthrough]];
186         case ARGC_WITH_ONE:
187             napi_typeof(env, argv[0], &valueType);
188             if (valueType != napi_number) {
189                 NapiThrow(
190                     env, "the first parameter must be DarkMode.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
191                 return napi_invalid_arg;
192             }
193             break;
194         default:
195             return napi_invalid_arg;
196     }
197     return napi_ok;
198 }
199 
CheckFontScaleArgs(napi_env env,size_t argc,napi_value * argv)200 napi_status JsUiAppearance::CheckFontScaleArgs(napi_env env, size_t argc, napi_value* argv)
201 {
202     if (argc != ARGC_WITH_ONE && argc != ARGC_WITH_TWO) {
203         NapiThrow(
204             env, "the number of parameters can only be 1 or 2.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
205         return napi_invalid_arg;
206     }
207 
208     napi_valuetype valueType = napi_undefined;
209     switch (argc) {
210         case ARGC_WITH_TWO:
211             napi_typeof(env, argv[1], &valueType);
212             if (valueType != napi_function) {
213                 NapiThrow(env, "the second parameter must be a function.",
214                     UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
215                 return napi_invalid_arg;
216             }
217             [[fallthrough]];
218         case ARGC_WITH_ONE:
219             napi_typeof(env, argv[0], &valueType);
220             if (valueType != napi_number) {
221                 NapiThrow(
222                     env, "the first parameter must be Number.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
223                 return napi_invalid_arg;
224             }
225             break;
226         default:
227             return napi_invalid_arg;
228     }
229     return napi_ok;
230 }
231 
ConvertJsDarkMode2Enum(int32_t jsVal)232 UiAppearanceAbilityInterface::DarkMode JsUiAppearance::ConvertJsDarkMode2Enum(int32_t jsVal)
233 {
234     switch (jsVal) {
235         case 0:
236             return UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK;
237         case 1:
238             return UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT;
239         default:
240             return UiAppearanceAbilityInterface::DarkMode::UNKNOWN;
241     }
242 }
243 
JSSetDarkMode(napi_env env,napi_callback_info info)244 static napi_value JSSetDarkMode(napi_env env, napi_callback_info info)
245 {
246     LOGI("JSSetDarkMode begin.");
247 
248     size_t argc = ARGC_WITH_TWO;
249     napi_value argv[ARGC_WITH_TWO] = { 0 };
250     napi_status napiStatus = napi_ok;
251     napi_value result = nullptr;
252     napi_get_undefined(env, &result);
253 
254     napiStatus = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
255     if (napiStatus != napi_ok) {
256         NapiThrow(env, "get callback info failed.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
257         return result;
258     }
259     napiStatus = JsUiAppearance::CheckArgs(env, argc, argv);
260     if (napiStatus != napi_ok) {
261         NapiThrow(env, "parameter parsing error.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
262         return result;
263     }
264 
265     auto asyncContext = new (std::nothrow) AsyncContext();
266     if (asyncContext == nullptr) {
267         NapiThrow(env, "create AsyncContext failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
268         return result;
269     }
270 
271     napi_get_value_int32(env, argv[0], &asyncContext->jsSetArg);
272     asyncContext->mode = JsUiAppearance::ConvertJsDarkMode2Enum(asyncContext->jsSetArg);
273     if (argc == ARGC_WITH_TWO) {
274         napi_create_reference(env, argv[1], 1, &asyncContext->callbackRef);
275     }
276     if (asyncContext->callbackRef == nullptr) {
277         napi_create_promise(env, &asyncContext->deferred, &result);
278     }
279 
280     napi_value resource = nullptr;
281     napi_create_string_utf8(env, "JSSetDarkMode", NAPI_AUTO_LENGTH, &resource);
282     napi_create_async_work(env, nullptr, resource, JsUiAppearance::OnExecute, JsUiAppearance::OnComplete,
283         reinterpret_cast<void*>(asyncContext), &asyncContext->work);
284     napi_queue_async_work(env, asyncContext->work);
285 
286     return result;
287 }
288 
JSGetDarkMode(napi_env env,napi_callback_info info)289 static napi_value JSGetDarkMode(napi_env env, napi_callback_info info)
290 {
291     LOGI("JSGetDarkMode begin.");
292 
293     napi_value result = nullptr;
294     napi_get_undefined(env, &result);
295     size_t argc = 0;
296     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr));
297     if (argc != 0) {
298         NapiThrow(env, "requires no parameter.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
299         return result;
300     }
301 
302     auto mode = UiAppearanceAbilityClient::GetInstance()->GetDarkMode();
303     if (mode == UiAppearanceAbilityInterface::ErrCode::SYS_ERR) {
304         NapiThrow(env, "get dark-mode failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
305         return result;
306     }
307     if (mode == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
308         NapiThrow(env,
309             "An attempt was made to get configuration forbidden by permission: ohos.permission.UPDATE_CONFIGURATION.",
310             UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR);
311         return result;
312     }
313     NAPI_CALL(env, napi_create_int32(env, mode, &result));
314     return result;
315 }
316 
JSGetFontScale(napi_env env,napi_callback_info info)317 static napi_value JSGetFontScale(napi_env env, napi_callback_info info)
318 {
319     LOGI("JSGetFontScale begin.");
320     napi_value result = nullptr;
321     napi_get_undefined(env, &result);
322     size_t argc = 0;
323     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr));
324     if (argc != 0) {
325         NapiThrow(env, "requires no parameter.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
326         return result;
327     }
328 
329     std::string fontScale;
330     auto ret = UiAppearanceAbilityClient::GetInstance()->GetFontScale(fontScale);
331     if (ret == UiAppearanceAbilityInterface::ErrCode::SYS_ERR) {
332         NapiThrow(env, "get font-scale failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
333         return result;
334     }
335     if (ret == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
336         NapiThrow(env,
337             "An attempt was made to get configuration forbidden by permission: ohos.permission.UPDATE_CONFIGURATION.",
338             UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR);
339         return result;
340     }
341     double fontScaleNumber = std::stod(fontScale);
342     NAPI_CALL(env, napi_create_double(env, fontScaleNumber, &result));
343     return result;
344 }
345 
JSSetFontScale(napi_env env,napi_callback_info info)346 static napi_value JSSetFontScale(napi_env env, napi_callback_info info)
347 {
348     LOGI("JSSetFontScale begin.");
349 
350     size_t argc = ARGC_WITH_TWO;
351     napi_value argv[ARGC_WITH_TWO] = { 0 };
352     napi_status napiStatus = napi_ok;
353     napi_value result = nullptr;
354     napi_get_undefined(env, &result);
355 
356     napiStatus = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
357     if (napiStatus != napi_ok) {
358         NapiThrow(env, "get callback info failed.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
359         return result;
360     }
361     napiStatus = JsUiAppearance::CheckFontScaleArgs(env, argc, argv);
362     if (napiStatus != napi_ok) {
363         NapiThrow(env, "parameter parsing error.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
364         return result;
365     }
366     auto asyncContext = new (std::nothrow) AsyncContext();
367     if (asyncContext == nullptr) {
368         NapiThrow(env, "create AsyncContext failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
369         return result;
370     }
371     napi_get_value_double(env, argv[0], &asyncContext->jsFontScale);
372     if (asyncContext->jsFontScale <= MIN_FONT_SCALE || asyncContext->jsFontScale > MAX_FONT_SCALE) {
373         NapiThrow(env, "fontScale must between 0 and 5.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
374         return result;
375     }
376     asyncContext->fontScale = std::to_string(asyncContext->jsFontScale);
377     if (argc == ARGC_WITH_TWO) {
378         napi_create_reference(env, argv[1], 1, &asyncContext->callbackRef);
379     }
380     if (asyncContext->callbackRef == nullptr) {
381         napi_create_promise(env, &asyncContext->deferred, &result);
382     }
383 
384     napi_value resource = nullptr;
385     napi_create_string_utf8(env, "JSSetFontScale", NAPI_AUTO_LENGTH, &resource);
386     napi_create_async_work(env, nullptr, resource, JsUiAppearance::OnSetFontScale, JsUiAppearance::OnComplete,
387         reinterpret_cast<void*>(asyncContext), &asyncContext->work);
388     napi_queue_async_work(env, asyncContext->work);
389 
390     return result;
391 }
392 
JSGetFontWeightScale(napi_env env,napi_callback_info info)393 static napi_value JSGetFontWeightScale(napi_env env, napi_callback_info info)
394 {
395     LOGI("JSGetFontWeightScale begin.");
396     napi_value result = nullptr;
397     napi_get_undefined(env, &result);
398     size_t argc = 0;
399     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr));
400     if (argc != 0) {
401         NapiThrow(env, "requires no parameter.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
402         return result;
403     }
404 
405     std::string fontWeightScale;
406     auto ret = UiAppearanceAbilityClient::GetInstance()->GetFontWeightScale(fontWeightScale);
407     if (ret == UiAppearanceAbilityInterface::ErrCode::SYS_ERR) {
408         NapiThrow(env, "get font-Weight-scale failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
409         return result;
410     }
411     if (ret == UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR) {
412         NapiThrow(env,
413             "An attempt was made to get configuration forbidden by permission: ohos.permission.UPDATE_CONFIGURATION.",
414             UiAppearanceAbilityInterface::ErrCode::PERMISSION_ERR);
415         return result;
416     }
417     double fontWeightScaleNumber = std::stod(fontWeightScale);
418     NAPI_CALL(env, napi_create_double(env, fontWeightScaleNumber, &result));
419     return result;
420 }
421 
JSSetFontWeightScale(napi_env env,napi_callback_info info)422 static napi_value JSSetFontWeightScale(napi_env env, napi_callback_info info)
423 {
424     LOGI("JSSetFontWeightScale begin.");
425 
426     size_t argc = ARGC_WITH_TWO;
427     napi_value argv[ARGC_WITH_TWO] = { 0 };
428     napi_status napiStatus = napi_ok;
429     napi_value result = nullptr;
430     napi_get_undefined(env, &result);
431 
432     napiStatus = napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
433     if (napiStatus != napi_ok) {
434         NapiThrow(env, "get callback info failed.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
435         return result;
436     }
437     napiStatus = JsUiAppearance::CheckFontScaleArgs(env, argc, argv);
438     if (napiStatus != napi_ok) {
439         NapiThrow(env, "parameter parsing error.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
440         return result;
441     }
442     auto asyncContext = new (std::nothrow) AsyncContext();
443     if (asyncContext == nullptr) {
444         NapiThrow(env, "create AsyncContext failed.", UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
445         return result;
446     }
447     napi_get_value_double(env, argv[0], &asyncContext->jsFontWeightScale);
448     if (asyncContext->jsFontWeightScale <= MIN_FONT_SCALE || asyncContext->jsFontWeightScale > MAX_FONT_SCALE) {
449         NapiThrow(env, "fontWeightScale must between 0 and 5.", UiAppearanceAbilityInterface::ErrCode::INVALID_ARG);
450         return result;
451     }
452     asyncContext->fontWeightScale = std::to_string(asyncContext->jsFontWeightScale);
453     if (argc == ARGC_WITH_TWO) {
454         napi_create_reference(env, argv[1], 1, &asyncContext->callbackRef);
455     }
456     if (asyncContext->callbackRef == nullptr) {
457         napi_create_promise(env, &asyncContext->deferred, &result);
458     }
459 
460     napi_value resource = nullptr;
461     napi_create_string_utf8(env, "JSSetFontWeightScale", NAPI_AUTO_LENGTH, &resource);
462     napi_create_async_work(env, nullptr, resource, JsUiAppearance::OnSetFontWeightScale, JsUiAppearance::OnComplete,
463         reinterpret_cast<void*>(asyncContext), &asyncContext->work);
464     napi_queue_async_work(env, asyncContext->work);
465 
466     return result;
467 }
468 
469 EXTERN_C_START
UiAppearanceExports(napi_env env,napi_value exports)470 static napi_value UiAppearanceExports(napi_env env, napi_value exports)
471 {
472     napi_value DarkMode = nullptr;
473     napi_value alwaysDark = nullptr;
474     napi_value alwaysLight = nullptr;
475     NAPI_CALL(env, napi_create_int32(env, 0, &alwaysDark));
476     NAPI_CALL(env, napi_create_int32(env, 1, &alwaysLight));
477     NAPI_CALL(env, napi_create_object(env, &DarkMode));
478     NAPI_CALL(env, napi_set_named_property(env, DarkMode, "ALWAYS_DARK", alwaysDark));
479     NAPI_CALL(env, napi_set_named_property(env, DarkMode, "ALWAYS_LIGHT", alwaysLight));
480     napi_property_descriptor properties[] = {
481         DECLARE_NAPI_FUNCTION("setDarkMode", JSSetDarkMode),
482         DECLARE_NAPI_FUNCTION("getDarkMode", JSGetDarkMode),
483         DECLARE_NAPI_FUNCTION("getFontScale", JSGetFontScale),
484         DECLARE_NAPI_FUNCTION("setFontScale", JSSetFontScale),
485         DECLARE_NAPI_FUNCTION("getFontWeightScale", JSGetFontWeightScale),
486         DECLARE_NAPI_FUNCTION("setFontWeightScale", JSSetFontWeightScale),
487         DECLARE_NAPI_STATIC_PROPERTY("DarkMode", DarkMode),
488     };
489     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(properties) / sizeof(properties[0]), properties));
490     return exports;
491 }
492 EXTERN_C_END
493 
494 static napi_module ui_appearance_module = {
495     .nm_version = 1,
496     .nm_flags = 0,
497     .nm_filename = nullptr,
498     .nm_register_func = UiAppearanceExports,
499     .nm_modname = "uiAppearance", // relative to the module name while import.
500     .nm_priv = nullptr,
501     .reserved = { 0 },
502 };
503 
UiAppearanceRegister()504 extern "C" __attribute__((constructor)) void UiAppearanceRegister()
505 {
506     napi_module_register(&ui_appearance_module);
507 }
508 } // namespace ArkUi::UiAppearance
509 } // namespace OHOS
510