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 <cstdio>
17 #include <cstring>
18 #include <pthread.h>
19 #include <unistd.h>
20
21 #include "hilog_wrapper.h"
22 #include "napi_accessibility_config.h"
23 #include "napi/native_api.h"
24 #include "napi/native_node_api.h"
25 #include "accessibility_config.h"
26
27 EXTERN_C_START
28 /*
29 * function for module exports
30 */
31 static napi_property_descriptor configDesc[] = {
32 DECLARE_NAPI_FUNCTION("set", NAccessibilityConfig::SetConfig),
33 DECLARE_NAPI_FUNCTION("get", NAccessibilityConfig::GetConfig),
34 DECLARE_NAPI_FUNCTION("on", NAccessibilityConfig::SubscribeConfigObserver),
35 DECLARE_NAPI_FUNCTION("off", NAccessibilityConfig::UnSubscribeConfigObserver),
36 };
37
InitHighContrastText(napi_env env)38 static napi_value InitHighContrastText(napi_env env)
39 {
40 napi_value highContrastTextValue;
41 napi_create_object(env, &highContrastTextValue);
42 NAPI_CALL(env, napi_define_properties(env, highContrastTextValue,
43 sizeof(configDesc) / sizeof(configDesc[0]),
44 configDesc));
45 NAccessibilityConfigClass* nativeObj =
46 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_HIGH_CONTRAST_TEXT);
47 if (!nativeObj) {
48 HILOG_ERROR("Failed to create nativeObj.");
49 return nullptr;
50 }
51 nativeObj->SetEnv(env);
52 NAPI_CALL(env, napi_wrap(env, highContrastTextValue, reinterpret_cast<void*>(nativeObj),
53 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
54 return highContrastTextValue;
55 }
56
InitInvertColor(napi_env env)57 static napi_value InitInvertColor(napi_env env)
58 {
59 napi_value invertColorValue;
60 napi_create_object(env, &invertColorValue);
61 NAPI_CALL(env, napi_define_properties(env, invertColorValue,
62 sizeof(configDesc) / sizeof(configDesc[0]),
63 configDesc));
64 NAccessibilityConfigClass* nativeObj =
65 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_INVERT_COLOR);
66 if (!nativeObj) {
67 HILOG_ERROR("Failed to create nativeObj.");
68 return nullptr;
69 }
70 nativeObj->SetEnv(env);
71 NAPI_CALL(env, napi_wrap(env, invertColorValue, reinterpret_cast<void*>(nativeObj),
72 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
73 return invertColorValue;
74 }
75
InitDaltonizationColorFilter(napi_env env)76 static napi_value InitDaltonizationColorFilter(napi_env env)
77 {
78 napi_value daltonizationColorFilterValue;
79 napi_create_object(env, &daltonizationColorFilterValue);
80 NAPI_CALL(env, napi_define_properties(env, daltonizationColorFilterValue,
81 sizeof(configDesc) /
82 sizeof(configDesc[0]),
83 configDesc));
84 NAccessibilityConfigClass* nativeObj =
85 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_DALTONIZATION_COLOR_FILTER);
86 if (!nativeObj) {
87 HILOG_ERROR("Failed to create nativeObj.");
88 return nullptr;
89 }
90 nativeObj->SetEnv(env);
91 NAPI_CALL(env, napi_wrap(env, daltonizationColorFilterValue, reinterpret_cast<void*>(nativeObj),
92 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
93 return daltonizationColorFilterValue;
94 }
95
InitContentTimeout(napi_env env)96 static napi_value InitContentTimeout(napi_env env)
97 {
98 napi_value contentTimeoutValue;
99 napi_create_object(env, &contentTimeoutValue);
100 NAPI_CALL(env, napi_define_properties(env, contentTimeoutValue,
101 sizeof(configDesc) / sizeof(configDesc[0]),
102 configDesc));
103 NAccessibilityConfigClass* nativeObj =
104 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CONTENT_TIMEOUT);
105 if (!nativeObj) {
106 HILOG_ERROR("Failed to create nativeObj.");
107 return nullptr;
108 }
109 nativeObj->SetEnv(env);
110 NAPI_CALL(env, napi_wrap(env, contentTimeoutValue, reinterpret_cast<void*>(nativeObj),
111 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
112 return contentTimeoutValue;
113 }
114
InitAnimationOff(napi_env env)115 static napi_value InitAnimationOff(napi_env env)
116 {
117 napi_value animationOffValue;
118 napi_create_object(env, &animationOffValue);
119 NAPI_CALL(env, napi_define_properties(env, animationOffValue,
120 sizeof(configDesc) / sizeof(configDesc[0]),
121 configDesc));
122 NAccessibilityConfigClass* nativeObj =
123 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_ANIMATION_OFF);
124 if (!nativeObj) {
125 HILOG_ERROR("Failed to create nativeObj.");
126 return nullptr;
127 }
128 nativeObj->SetEnv(env);
129 NAPI_CALL(env, napi_wrap(env, animationOffValue, reinterpret_cast<void*>(nativeObj),
130 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
131 return animationOffValue;
132 }
133
InitBrightnessDiscount(napi_env env)134 static napi_value InitBrightnessDiscount(napi_env env)
135 {
136 napi_value brightnessDiscountValue;
137 napi_create_object(env, &brightnessDiscountValue);
138 NAPI_CALL(env, napi_define_properties(env, brightnessDiscountValue,
139 sizeof(configDesc) / sizeof(configDesc[0]),
140 configDesc));
141 NAccessibilityConfigClass* nativeObj =
142 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_BRIGHTNESS_DISCOUNT);
143 if (!nativeObj) {
144 HILOG_ERROR("Failed to create nativeObj.");
145 return nullptr;
146 }
147 nativeObj->SetEnv(env);
148 NAPI_CALL(env, napi_wrap(env, brightnessDiscountValue, reinterpret_cast<void*>(nativeObj),
149 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
150 return brightnessDiscountValue;
151 }
152
InitScreenMagnifier(napi_env env)153 static napi_value InitScreenMagnifier(napi_env env)
154 {
155 napi_value screenMagnifierValue;
156 napi_create_object(env, &screenMagnifierValue);
157 NAPI_CALL(env, napi_define_properties(env, screenMagnifierValue,
158 sizeof(configDesc) / sizeof(configDesc[0]),
159 configDesc));
160 NAccessibilityConfigClass* nativeObj =
161 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SCREEN_MAGNIFICATION);
162 if (!nativeObj) {
163 HILOG_ERROR("Failed to create nativeObj.");
164 return nullptr;
165 }
166 nativeObj->SetEnv(env);
167 NAPI_CALL(env, napi_wrap(env, screenMagnifierValue, reinterpret_cast<void*>(nativeObj),
168 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
169 return screenMagnifierValue;
170 }
171
InitAudioMono(napi_env env)172 static napi_value InitAudioMono(napi_env env)
173 {
174 napi_value audioMonoValue;
175 napi_create_object(env, &audioMonoValue);
176 NAPI_CALL(env, napi_define_properties(env, audioMonoValue,
177 sizeof(configDesc) / sizeof(configDesc[0]),
178 configDesc));
179 NAccessibilityConfigClass* nativeObj =
180 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_AUDIO_MONO);
181 if (!nativeObj) {
182 HILOG_ERROR("Failed to create nativeObj.");
183 return nullptr;
184 }
185 nativeObj->SetEnv(env);
186 NAPI_CALL(env, napi_wrap(env, audioMonoValue, reinterpret_cast<void*>(nativeObj),
187 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
188 return audioMonoValue;
189 }
190
InitAudioBalance(napi_env env)191 static napi_value InitAudioBalance(napi_env env)
192 {
193 napi_value audioBalanceValue;
194 napi_create_object(env, &audioBalanceValue);
195 NAPI_CALL(env, napi_define_properties(env, audioBalanceValue,
196 sizeof(configDesc) / sizeof(configDesc[0]),
197 configDesc));
198 NAccessibilityConfigClass* nativeObj =
199 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_AUDIO_BALANCE);
200 if (!nativeObj) {
201 HILOG_ERROR("Failed to create nativeObj.");
202 return nullptr;
203 }
204 nativeObj->SetEnv(env);
205 NAPI_CALL(env, napi_wrap(env, audioBalanceValue, reinterpret_cast<void*>(nativeObj),
206 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
207 return audioBalanceValue;
208 }
209
InitMouseKey(napi_env env)210 static napi_value InitMouseKey(napi_env env)
211 {
212 napi_value mouseKeyValue;
213 napi_create_object(env, &mouseKeyValue);
214 NAPI_CALL(env, napi_define_properties(env, mouseKeyValue,
215 sizeof(configDesc) / sizeof(configDesc[0]),
216 configDesc));
217 NAccessibilityConfigClass* nativeObj =
218 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_MOUSE_KEY);
219 if (!nativeObj) {
220 HILOG_ERROR("Failed to create nativeObj.");
221 return nullptr;
222 }
223 nativeObj->SetEnv(env);
224 NAPI_CALL(env, napi_wrap(env, mouseKeyValue, reinterpret_cast<void*>(nativeObj),
225 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
226 return mouseKeyValue;
227 }
228
InitMouseAutoClick(napi_env env)229 static napi_value InitMouseAutoClick(napi_env env)
230 {
231 napi_value mouseAutoClickValue;
232 napi_create_object(env, &mouseAutoClickValue);
233 NAPI_CALL(env, napi_define_properties(env, mouseAutoClickValue,
234 sizeof(configDesc) / sizeof(configDesc[0]),
235 configDesc));
236 NAccessibilityConfigClass* nativeObj =
237 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_MOUSE_AUTOCLICK);
238 if (!nativeObj) {
239 HILOG_ERROR("Failed to create nativeObj.");
240 return nullptr;
241 }
242 nativeObj->SetEnv(env);
243 NAPI_CALL(env, napi_wrap(env, mouseAutoClickValue, reinterpret_cast<void*>(nativeObj),
244 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
245 return mouseAutoClickValue;
246 }
247
InitShortKey(napi_env env)248 static napi_value InitShortKey(napi_env env)
249 {
250 napi_value shortKeyValue;
251 napi_create_object(env, &shortKeyValue);
252 NAPI_CALL(env, napi_define_properties(env, shortKeyValue,
253 sizeof(configDesc) / sizeof(configDesc[0]),
254 configDesc));
255 NAccessibilityConfigClass* nativeObj =
256 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SHORT_KEY);
257 if (!nativeObj) {
258 HILOG_ERROR("Failed to create nativeObj.");
259 return nullptr;
260 }
261 nativeObj->SetEnv(env);
262 NAPI_CALL(env, napi_wrap(env, shortKeyValue, reinterpret_cast<void*>(nativeObj),
263 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
264 return shortKeyValue;
265 }
266
InitShortKeyTarget(napi_env env)267 static napi_value InitShortKeyTarget(napi_env env)
268 {
269 napi_value shortKeyTargetValue;
270 napi_create_object(env, &shortKeyTargetValue);
271 NAPI_CALL(env, napi_define_properties(env, shortKeyTargetValue,
272 sizeof(configDesc) / sizeof(configDesc[0]),
273 configDesc));
274 NAccessibilityConfigClass* nativeObj =
275 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SHORT_KEY_TARGET);
276 if (!nativeObj) {
277 HILOG_ERROR("Failed to create nativeObj.");
278 return nullptr;
279 }
280 nativeObj->SetEnv(env);
281 NAPI_CALL(env, napi_wrap(env, shortKeyTargetValue, reinterpret_cast<void*>(nativeObj),
282 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
283 return shortKeyTargetValue;
284 }
285
InitCaptionsState(napi_env env)286 static napi_value InitCaptionsState(napi_env env)
287 {
288 napi_value captionsValue;
289 napi_create_object(env, &captionsValue);
290 NAPI_CALL(env, napi_define_properties(env, captionsValue,
291 sizeof(configDesc) / sizeof(configDesc[0]),
292 configDesc));
293 NAccessibilityConfigClass* nativeObj =
294 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CAPTION_STATE);
295 if (!nativeObj) {
296 HILOG_ERROR("Failed to create nativeObj.");
297 return nullptr;
298 }
299 nativeObj->SetEnv(env);
300 NAPI_CALL(env, napi_wrap(env, captionsValue, reinterpret_cast<void*>(nativeObj),
301 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
302 return captionsValue;
303 }
304
InitCaptionsStyle(napi_env env)305 static napi_value InitCaptionsStyle(napi_env env)
306 {
307 napi_value captionsStyleValue;
308 napi_create_object(env, &captionsStyleValue);
309 NAPI_CALL(env, napi_define_properties(env, captionsStyleValue,
310 sizeof(configDesc) / sizeof(configDesc[0]),
311 configDesc));
312 NAccessibilityConfigClass* nativeObj =
313 new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CAPTION_STYLE);
314 if (!nativeObj) {
315 HILOG_ERROR("Failed to create nativeObj.");
316 return nullptr;
317 }
318 nativeObj->SetEnv(env);
319 NAPI_CALL(env, napi_wrap(env, captionsStyleValue, reinterpret_cast<void*>(nativeObj),
320 NAccessibilityConfigClass::Destructor, nullptr, nativeObj->GetWrapper()));
321 return captionsStyleValue;
322 }
323
InitConfigModule(napi_env env,napi_value exports)324 static napi_value InitConfigModule(napi_env env, napi_value exports)
325 {
326 napi_value highContrastTextValue = InitHighContrastText(env);
327 napi_value invertColorValue = InitInvertColor(env);
328 napi_value daltonizationColorFilterValue = InitDaltonizationColorFilter(env);
329 napi_value contentTimeoutValue = InitContentTimeout(env);
330 napi_value animationOffValue = InitAnimationOff(env);
331 napi_value brightnessDiscountValue = InitBrightnessDiscount(env);
332 napi_value screenMagnifierValue = InitScreenMagnifier(env);
333 napi_value audioMonoValue = InitAudioMono(env);
334 napi_value audioBalanceValue = InitAudioBalance(env);
335 napi_value mouseKeyValue = InitMouseKey(env);
336 napi_value mouseAutoClickValue = InitMouseAutoClick(env);
337 napi_value shortKeyValue = InitShortKey(env);
338 napi_value shortKeyTargetValue = InitShortKeyTarget(env);
339 napi_value captionsValue = InitCaptionsState(env);
340 napi_value captionsStyleValue = InitCaptionsStyle(env);
341
342 napi_property_descriptor desc[] = {
343 DECLARE_NAPI_FUNCTION("on", NAccessibilityConfig::SubscribeState),
344 DECLARE_NAPI_FUNCTION("off", NAccessibilityConfig::UnsubscribeState),
345 DECLARE_NAPI_FUNCTION("enableAbility", NAccessibilityConfig::EnableAbility),
346 DECLARE_NAPI_FUNCTION("disableAbility", NAccessibilityConfig::DisableAbility),
347 DECLARE_NAPI_STATIC_PROPERTY("highContrastText", highContrastTextValue),
348 DECLARE_NAPI_STATIC_PROPERTY("invertColor", invertColorValue),
349 DECLARE_NAPI_STATIC_PROPERTY("daltonizationColorFilter", daltonizationColorFilterValue),
350 DECLARE_NAPI_STATIC_PROPERTY("contentTimeout", contentTimeoutValue),
351 DECLARE_NAPI_STATIC_PROPERTY("animationOff", animationOffValue),
352 DECLARE_NAPI_STATIC_PROPERTY("brightnessDiscount", brightnessDiscountValue),
353 DECLARE_NAPI_STATIC_PROPERTY("screenMagnifier", screenMagnifierValue),
354 DECLARE_NAPI_STATIC_PROPERTY("audioMono", audioMonoValue),
355 DECLARE_NAPI_STATIC_PROPERTY("audioBalance", audioBalanceValue),
356 DECLARE_NAPI_STATIC_PROPERTY("mouseKey", mouseKeyValue),
357 DECLARE_NAPI_STATIC_PROPERTY("mouseAutoClick", mouseAutoClickValue),
358 DECLARE_NAPI_STATIC_PROPERTY("shortkey", shortKeyValue),
359 DECLARE_NAPI_STATIC_PROPERTY("shortkeyTarget", shortKeyTargetValue),
360 DECLARE_NAPI_STATIC_PROPERTY("captions", captionsValue),
361 DECLARE_NAPI_STATIC_PROPERTY("captionsStyle", captionsStyleValue),
362 };
363
364 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
365
366 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
367 (void)instance.InitializeContext();
368 NAccessibilityConfig::configObservers_->SubscribeToFramework();
369 NAccessibilityConfig::enableAbilityListsObservers_->SubscribeToFramework();
370 HILOG_INFO("-----Init config module end------");
371 return exports;
372 }
373 EXTERN_C_END
374
375 /*
376 * Module define
377 */
378 static napi_module _config_module = {
379 .nm_version = 1,
380 .nm_flags = 0,
381 .nm_filename = nullptr,
382 .nm_register_func = InitConfigModule,
383 .nm_modname = "accessibility.config",
384 .nm_priv = ((void*)0),
385 .reserved = {0},
386 };
387 /*
388 * Module register function
389 */
RegisterNapiAccessibilityConfigModule(void)390 extern "C" __attribute__((constructor)) void RegisterNapiAccessibilityConfigModule(void)
391 {
392 napi_module_register(&_config_module);
393 }
394