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