1 /*
2 * Copyright (C) 2022-2025 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_accessibility_config.h"
17
18 #include <uv.h>
19 #include "hilog_wrapper.h"
20 #include "ipc_skeleton.h"
21 #include "accessibility_utils.h"
22 #include "tokenid_kit.h"
23 #include "accesstoken_kit.h"
24 #include "api_reporter_helper.h"
25
26 using namespace OHOS;
27 using namespace OHOS::Accessibility;
28 using namespace OHOS::AccessibilityNapi;
29 using namespace OHOS::AccessibilityConfig;
30 using namespace Security::AccessToken;
31
32 namespace OHOS {
33 namespace Accessibility {
34 namespace {
35 constexpr int ROUND_STEP = 10;
36 }
37
TmpOpenScope(napi_env env)38 napi_handle_scope TmpOpenScope(napi_env env)
39 {
40 napi_handle_scope scope = nullptr;
41 NAPI_CALL(env, napi_open_handle_scope(env, &scope));
42 return scope;
43 }
44 } // namespace Accessibility
45 } // namespace OHOS
46
47 std::shared_ptr<NAccessibilityConfigObserverImpl> NAccessibilityConfig::configObservers_ =
48 std::make_shared<NAccessibilityConfigObserverImpl>();
49 std::shared_ptr<EnableAbilityListsObserverImpl> NAccessibilityConfig::enableAbilityListsObservers_ =
50 std::make_shared<EnableAbilityListsObserverImpl>();
51
EnableAbilityError(size_t & argc,OHOS::Accessibility::RetError & errCode,napi_env env,napi_value * parameters,NAccessibilityConfigData * callbackInfo)52 void NAccessibilityConfig::EnableAbilityError(size_t& argc, OHOS::Accessibility::RetError& errCode,
53 napi_env env, napi_value* parameters, NAccessibilityConfigData* callbackInfo)
54 {
55 if (argc < ARGS_SIZE_THREE - 1) {
56 HILOG_ERROR("argc is invalid: %{public}zu", argc);
57 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
58 }
59
60 if (errCode == OHOS::Accessibility::RET_OK) {
61 // parse name
62 std::string ability = "";
63 if (ParseString(env, ability, parameters[PARAM0])) {
64 HILOG_DEBUG("ability = %{private}s", ability.c_str());
65 callbackInfo->abilityName_ = ability;
66 } else {
67 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
68 }
69
70 // parse capability
71 if (!ConvertJSToCapabilities(env, parameters[PARAM1], callbackInfo->capabilities_)) {
72 HILOG_ERROR("convert capabilities failed");
73 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
74 }
75 }
76 }
77
DisableAbilityError(size_t & argc,OHOS::Accessibility::RetError & errCode,napi_env env,napi_value * parameters,NAccessibilityConfigData * callbackInfo)78 void NAccessibilityConfig::DisableAbilityError(size_t& argc, OHOS::Accessibility::RetError& errCode,
79 napi_env env, napi_value* parameters, NAccessibilityConfigData* callbackInfo)
80 {
81 if (argc < ARGS_SIZE_TWO - 1) {
82 HILOG_ERROR("argc is invalid: %{public}zu", argc);
83 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
84 }
85
86 if (errCode == OHOS::Accessibility::RET_OK) {
87 // parse name
88 std::string ability = "";
89 if (ParseString(env, ability, parameters[PARAM0])) {
90 HILOG_DEBUG("ability = %{private}s", ability.c_str());
91 callbackInfo->abilityName_ = ability;
92 } else {
93 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
94 }
95 }
96 }
97
EnableAbility(napi_env env,napi_callback_info info)98 napi_value NAccessibilityConfig::EnableAbility(napi_env env, napi_callback_info info)
99 {
100 HILOG_DEBUG();
101 NAccessibilityConfigData* callbackInfo = new(std::nothrow) NAccessibilityConfigData();
102 if (callbackInfo == nullptr) {
103 HILOG_ERROR("callbackInfo is nullptr");
104 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
105 napi_throw(env, err);
106 return nullptr;
107 }
108
109 size_t argc = ARGS_SIZE_THREE;
110 napi_value parameters[ARGS_SIZE_THREE] = {0};
111 napi_get_cb_info(env, info, &argc, parameters, nullptr, nullptr);
112
113 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
114 EnableAbilityError(argc, errCode, env, parameters, callbackInfo);
115
116 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
117 delete callbackInfo;
118 callbackInfo = nullptr;
119 napi_value err = CreateBusinessError(env, errCode);
120 HILOG_ERROR("invalid param");
121 napi_throw(env, err);
122 return nullptr;
123 }
124
125 napi_value promise = nullptr;
126 if (argc > ARGS_SIZE_THREE - 1 && CheckJsFunction(env, parameters[PARAM2])) {
127 napi_create_reference(env, parameters[PARAM2], 1, &callbackInfo->callback_);
128 napi_get_undefined(env, &promise);
129 } else {
130 napi_create_promise(env, &callbackInfo->deferred_, &promise);
131 }
132
133 napi_value resource = nullptr;
134 napi_create_string_utf8(env, "EnableAbility", NAPI_AUTO_LENGTH, &resource);
135
136 napi_create_async_work(env, nullptr, resource,
137 // Execute async to call c++ function
138 [](napi_env env, void* data) {
139 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
140 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
141 if (callbackInfo->capabilities_ != 0) {
142 callbackInfo->ret_ = instance.EnableAbility(
143 callbackInfo->abilityName_, callbackInfo->capabilities_);
144 }
145 }, NAccessibilityConfig::AsyncWorkComplete, reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
146 napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
147 return promise;
148 }
149
DisableAbility(napi_env env,napi_callback_info info)150 napi_value NAccessibilityConfig::DisableAbility(napi_env env, napi_callback_info info)
151 {
152 HILOG_DEBUG();
153 NAccessibilityConfigData* callbackInfo = new(std::nothrow) NAccessibilityConfigData();
154 if (callbackInfo == nullptr) {
155 HILOG_ERROR("DisableAbility callbackInfo is nullptr");
156 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
157 napi_throw(env, err);
158 return nullptr;
159 }
160
161 size_t argc = ARGS_SIZE_TWO;
162 napi_value parameters[ARGS_SIZE_TWO] = {0};
163 napi_get_cb_info(env, info, &argc, parameters, nullptr, nullptr);
164
165 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
166 DisableAbilityError(argc, errCode, env, parameters, callbackInfo);
167
168 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
169 delete callbackInfo;
170 callbackInfo = nullptr;
171 napi_value err = CreateBusinessError(env, errCode);
172 HILOG_ERROR("DisableAbility invalid param");
173 napi_throw(env, err);
174 return nullptr;
175 }
176
177 napi_value promise = nullptr;
178 if (argc > ARGS_SIZE_TWO - 1 && CheckJsFunction(env, parameters[PARAM1])) {
179 napi_create_reference(env, parameters[PARAM1], 1, &callbackInfo->callback_);
180 napi_get_undefined(env, &promise);
181 } else {
182 napi_create_promise(env, &callbackInfo->deferred_, &promise);
183 }
184
185 napi_value resource = nullptr;
186 napi_create_string_utf8(env, "DisableAbility", NAPI_AUTO_LENGTH, &resource);
187
188 napi_create_async_work(env, nullptr, resource,
189 // Execute async to call c++ function
190 [](napi_env env, void* data) {
191 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
192 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
193 if (callbackInfo) {
194 callbackInfo->ret_ = instance.DisableAbility(callbackInfo->abilityName_);
195 }
196 }, NAccessibilityConfig::AsyncWorkComplete,
197 reinterpret_cast<void*>(callbackInfo), &callbackInfo->work_);
198 napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
199 return promise;
200 }
201
CheckReadPermission(const std::string & permission)202 bool NAccessibilityConfig::CheckReadPermission(const std::string &permission)
203 {
204 HILOG_DEBUG();
205 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
206 int result = TypePermissionState::PERMISSION_GRANTED;
207 ATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(tokenId);
208 if (tokenType == TOKEN_INVALID) {
209 HILOG_WARN("AccessToken type invalid!");
210 return false;
211 } else {
212 result = AccessTokenKit::VerifyAccessToken(tokenId, permission);
213 }
214 if (result == TypePermissionState::PERMISSION_DENIED) {
215 HILOG_WARN("AccessTokenID denied!");
216 return false;
217 }
218 HILOG_DEBUG("tokenType %{private}d dAccessTokenID:%{private}u, permission:%{private}s matched!",
219 tokenType, tokenId, permission.c_str());
220 return true;
221 }
222
IsAvailable(napi_env env,napi_callback_info info)223 bool NAccessibilityConfig::IsAvailable(napi_env env, napi_callback_info info)
224 {
225 HILOG_DEBUG();
226 if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(IPCSkeleton::GetCallingFullTokenID())) {
227 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NOT_SYSTEM_APP);
228 napi_throw(env, err);
229 HILOG_ERROR("is not system app");
230 return false;
231 }
232
233 if (!CheckReadPermission(OHOS_PERMISSION_READ_ACCESSIBILITY_CONFIG)) {
234 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NO_PERMISSION);
235 napi_throw(env, err);
236 HILOG_ERROR("have no read permission");
237 return false;
238 }
239
240 return true;
241 }
242
SubscribeState(napi_env env,napi_callback_info info)243 napi_value NAccessibilityConfig::SubscribeState(napi_env env, napi_callback_info info)
244 {
245 HILOG_DEBUG();
246 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
247 ApiReportHelper reporter("NAccessibilityConfig.SubscribeState");
248 #endif // ACCESSIBILITY_EMULATOR_DEFINED
249 if (!IsAvailable(env, info)) {
250 return nullptr;
251 }
252 size_t argc = ARGS_SIZE_TWO;
253 napi_value args[ARGS_SIZE_TWO] = {0};
254 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
255 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
256 if (argc < ARGS_SIZE_TWO) {
257 HILOG_ERROR("argc is invalid: %{public}zu", argc);
258 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
259 }
260 std::string observerType = "";
261 if (errCode == OHOS::Accessibility::RET_OK) {
262 if (!ParseString(env, observerType, args[PARAM0])) {
263 HILOG_ERROR("observer type parse failed");
264 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
265 } else {
266 if (std::strcmp(observerType.c_str(), "enabledAccessibilityExtensionListChange") != 0 &&
267 std::strcmp(observerType.c_str(), "installedAccessibilityListChange") != 0) {
268 HILOG_ERROR("args[PARAM0] is wrong[%{public}s", observerType.c_str());
269 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
270 }
271 }
272 }
273
274 if (errCode == OHOS::Accessibility::RET_OK) {
275 napi_valuetype valueType = napi_null;
276 napi_typeof(env, args[PARAM1], &valueType);
277 if (valueType != napi_function) {
278 HILOG_ERROR("SubscribeState args[PARAM1] format is wrong");
279 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
280 }
281 }
282
283 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
284 napi_value err = CreateBusinessError(env, errCode);
285 HILOG_ERROR("invalid param");
286 napi_throw(env, err);
287 return nullptr;
288 }
289 if (enableAbilityListsObservers_ == nullptr) {
290 HILOG_ERROR("enableAbilityListsObservers_ is null");
291 return nullptr;
292 }
293 if (std::strcmp(observerType.c_str(), "enabledAccessibilityExtensionListChange") == 0) {
294 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
295 reporter.setApiName("NAccessibilityConfig.SubscribeState.enabledAccessibilityExtensionListChange");
296 #endif // ACCESSIBILITY_EMULATOR_DEFINED
297 enableAbilityListsObservers_->SubscribeObserver(env, args[PARAM1]);
298 }
299 if (std::strcmp(observerType.c_str(), "installedAccessibilityListChange") == 0) {
300 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
301 reporter.setApiName("NAccessibilityConfig.SubscribeState.installedAccessibilityListChange");
302 #endif // ACCESSIBILITY_EMULATOR_DEFINED
303 enableAbilityListsObservers_->SubscribeInstallObserver(env, args[PARAM1]);
304 }
305 return nullptr;
306 }
307
UnsubscribeState(napi_env env,napi_callback_info info)308 napi_value NAccessibilityConfig::UnsubscribeState(napi_env env, napi_callback_info info)
309 {
310 HILOG_DEBUG();
311 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
312 ApiReportHelper reporter("NAccessibilityConfig.UnsubscribeState");
313 #endif // ACCESSIBILITY_EMULATOR_DEFINED
314 if (!IsAvailable(env, info)) {
315 return nullptr;
316 }
317 size_t argc = ARGS_SIZE_TWO;
318 napi_value args[ARGS_SIZE_TWO] = {0};
319 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
320
321 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
322 if (argc < ARGS_SIZE_TWO - 1) {
323 HILOG_ERROR("argc is invalid: %{public}zu", argc);
324 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
325 }
326 std::string observerType = "";
327 if (errCode == OHOS::Accessibility::RET_OK) {
328 if (!ParseString(env, observerType, args[PARAM0])) {
329 HILOG_ERROR("observer type parse failed");
330 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
331 } else {
332 if (std::strcmp(observerType.c_str(), "enabledAccessibilityExtensionListChange") != 0 &&
333 std::strcmp(observerType.c_str(), "installedAccessibilityListChange") != 0) {
334 HILOG_ERROR("args[PARAM0] is wrong[%{public}s", observerType.c_str());
335 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
336 }
337 }
338 }
339
340 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
341 napi_value err = CreateBusinessError(env, errCode);
342 HILOG_ERROR("UnsubscribeState invalid param");
343 napi_throw(env, err);
344 return nullptr;
345 }
346 if (enableAbilityListsObservers_ == nullptr) {
347 HILOG_ERROR("enableAbilityListsObservers_ is null");
348 return nullptr;
349 }
350 if (argc > ARGS_SIZE_TWO - 1 && CheckJsFunction(env, args[PARAM1])) {
351 if (std::strcmp(observerType.c_str(), "enabledAccessibilityExtensionListChange") == 0) {
352 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
353 reporter.setApiName("NAccessibilityConfig.UnsubscribeState.enabledAccessibilityExtensionListChange");
354 #endif // ACCESSIBILITY_EMULATOR_DEFINED
355 enableAbilityListsObservers_->UnsubscribeObserver(env, args[PARAM1]);
356 } else {
357 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
358 reporter.setApiName("NAccessibilityConfig.UnsubscribeState.installedAccessibilityListChange");
359 #endif // ACCESSIBILITY_EMULATOR_DEFINED
360 enableAbilityListsObservers_->UnsubscribeInstallObserver(env, args[PARAM1]);
361 }
362 } else {
363 if (std::strcmp(observerType.c_str(), "enabledAccessibilityExtensionListChange") == 0) {
364 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
365 reporter.setApiName("NAccessibilityConfig.UnsubscribeState.enabledAccessibilityExtensionListChange");
366 #endif // ACCESSIBILITY_EMULATOR_DEFINED
367 enableAbilityListsObservers_->UnsubscribeObservers();
368 } else {
369 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
370 reporter.setApiName("NAccessibilityConfig.UnsubscribeState.installedAccessibilityListChange");
371 #endif // ACCESSIBILITY_EMULATOR_DEFINED
372 enableAbilityListsObservers_->UnsubscribeInstallObservers();
373 }
374 }
375 return nullptr;
376 }
377
AsyncWorkComplete(napi_env env,napi_status status,void * data)378 void NAccessibilityConfig::AsyncWorkComplete(napi_env env, napi_status status, void* data)
379 {
380 HILOG_DEBUG();
381 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
382 if (callbackInfo == nullptr) {
383 HILOG_ERROR("callbackInfo is nullptr");
384 return;
385 }
386 napi_value result[ARGS_SIZE_ONE] = {0};
387 napi_value callback = 0;
388 napi_value returnVal = 0;
389 napi_value undefined = 0;
390 napi_get_undefined(env, &undefined);
391 result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
392 if (callbackInfo->callback_) {
393 napi_get_reference_value(env, callbackInfo->callback_, &callback);
394 napi_call_function(env, undefined, callback, ARGS_SIZE_ONE, result, &returnVal);
395 napi_delete_reference(env, callbackInfo->callback_);
396 HILOG_DEBUG("complete function callback mode");
397 } else {
398 if (callbackInfo->ret_ == OHOS::Accessibility::RET_OK) {
399 napi_resolve_deferred(env, callbackInfo->deferred_, undefined);
400 } else {
401 napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
402 }
403 HILOG_DEBUG("complete function promise mode");
404 }
405 napi_delete_async_work(env, callbackInfo->work_);
406 delete callbackInfo;
407 callbackInfo = nullptr;
408 }
409
SetScreenTouchConfigExecute(NAccessibilityConfigData * callbackInfo)410 void NAccessibilityConfig::SetScreenTouchConfigExecute(NAccessibilityConfigData* callbackInfo)
411 {
412 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
413 if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONIFG_CLICK_RESPONSE_TIME) {
414 auto time = ConvertStringToClickResponseTimeTypes(callbackInfo->stringConfig_);
415 callbackInfo->ret_ = instance.SetClickResponseTime(time);
416 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_TIME) {
417 auto time = ConvertStringToIgnoreRepeatClickTimeTypes(callbackInfo->stringConfig_);
418 callbackInfo->ret_ = instance.SetIgnoreRepeatClickTime(time);
419 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_STATE) {
420 callbackInfo->ret_ = instance.SetIgnoreRepeatClickState(callbackInfo->boolConfig_);
421 }
422 }
423
SetConfigExecute(napi_env env,void * data)424 void NAccessibilityConfig::SetConfigExecute(napi_env env, void* data)
425 {
426 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
427 if (callbackInfo == nullptr) {
428 HILOG_ERROR("callbackInfo is nullptr");
429 return;
430 }
431
432 HILOG_DEBUG("callbackInfo->id_ = %{public}d", callbackInfo->id_);
433 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
434
435 if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_HIGH_CONTRAST_TEXT) {
436 callbackInfo->ret_ = instance.SetHighContrastTextState(callbackInfo->boolConfig_);
437 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_STATE) {
438 callbackInfo->ret_ = instance.SetDaltonizationState(callbackInfo->boolConfig_);
439 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_INVERT_COLOR) {
440 callbackInfo->ret_ = instance.SetInvertColorState(callbackInfo->boolConfig_);
441 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_ANIMATION_OFF) {
442 callbackInfo->ret_ = instance.SetAnimationOffState(callbackInfo->boolConfig_);
443 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SCREEN_MAGNIFICATION) {
444 callbackInfo->ret_ = instance.SetScreenMagnificationState(callbackInfo->boolConfig_);
445 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_MONO) {
446 callbackInfo->ret_ = instance.SetAudioMonoState(callbackInfo->boolConfig_);
447 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_KEY) {
448 callbackInfo->ret_ = instance.SetMouseKeyState(callbackInfo->boolConfig_);
449 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY) {
450 callbackInfo->ret_ = instance.SetShortKeyState(callbackInfo->boolConfig_);
451 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STATE) {
452 callbackInfo->ret_ = instance.SetCaptionsState(callbackInfo->boolConfig_);
453 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CONTENT_TIMEOUT) {
454 callbackInfo->ret_ = instance.SetContentTimeout(callbackInfo->uint32Config_);
455 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_AUTOCLICK) {
456 callbackInfo->ret_ = instance.SetMouseAutoClick(callbackInfo->int32Config_);
457 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_BALANCE) {
458 callbackInfo->ret_ = instance.SetAudioBalance(callbackInfo->floatConfig_);
459 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_BRIGHTNESS_DISCOUNT) {
460 callbackInfo->ret_ = instance.SetBrightnessDiscount(callbackInfo->floatConfig_);
461 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_TARGET) {
462 callbackInfo->ret_ = instance.SetShortkeyTarget(callbackInfo->stringConfig_);
463 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_MULTI_TARGET) {
464 callbackInfo->ret_ = instance.SetShortkeyMultiTarget(callbackInfo->stringVectorConfig_);
465 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STYLE) {
466 callbackInfo->ret_ = instance.SetCaptionsProperty(callbackInfo->captionProperty_);
467 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_COLOR_FILTER) {
468 auto filter = ConvertStringToDaltonizationTypes(callbackInfo->stringConfig_);
469 callbackInfo->ret_ = instance.SetDaltonizationColorFilter(filter);
470 }
471
472 SetScreenTouchConfigExecute(callbackInfo);
473 }
474
ConfigCompleteInfoById(napi_env env,NAccessibilityConfigData * callbackInfo,napi_value * result,size_t len)475 void NAccessibilityConfig::ConfigCompleteInfoById(napi_env env, NAccessibilityConfigData* callbackInfo,
476 napi_value* result, size_t len)
477 {
478 double value = 0.0;
479 switch (callbackInfo->id_) {
480 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_HIGH_CONTRAST_TEXT:
481 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_INVERT_COLOR:
482 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_ANIMATION_OFF:
483 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SCREEN_MAGNIFICATION:
484 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_MONO:
485 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_KEY:
486 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY:
487 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STATE:
488 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_STATE:
489 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_STATE:
490 napi_get_boolean(env, callbackInfo->boolConfig_, &result[PARAM1]);
491 break;
492 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CONTENT_TIMEOUT:
493 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_AUTOCLICK:
494 napi_create_int32(env, callbackInfo->int32Config_, &result[PARAM1]);
495 break;
496 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_BALANCE:
497 value = static_cast<double>(callbackInfo->floatConfig_);
498 value = round(value * ROUND_STEP) / ROUND_STEP;
499 napi_create_double(env, value, &result[PARAM1]);
500 break;
501 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_BRIGHTNESS_DISCOUNT:
502 napi_create_double(env, static_cast<double>(callbackInfo->floatConfig_), &result[PARAM1]);
503 break;
504 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_COLOR_FILTER:
505 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_TARGET:
506 case OHOS::AccessibilityConfig::CONFIG_ID::CONIFG_CLICK_RESPONSE_TIME:
507 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_TIME:
508 napi_create_string_utf8(env, callbackInfo->stringConfig_.c_str(), NAPI_AUTO_LENGTH, &result[PARAM1]);
509 break;
510 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_MULTI_TARGET:
511 napi_create_array(env, &result[PARAM1]);
512 ConvertStringVecToJS(env, result[PARAM1], callbackInfo->stringVectorConfig_);
513 break;
514 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STYLE:
515 napi_create_object(env, &result[PARAM1]);
516 ConvertCaptionPropertyToJS(env, result[PARAM1], callbackInfo->captionProperty_);
517 break;
518 default:
519 break;
520 }
521 }
522
GetConfigComplete(napi_env env,napi_status status,void * data)523 void NAccessibilityConfig::GetConfigComplete(napi_env env, napi_status status, void* data)
524 {
525 HILOG_DEBUG();
526 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
527 if (callbackInfo == nullptr) {
528 HILOG_ERROR("callbackInfo is nullptr");
529 return;
530 }
531 HILOG_DEBUG("callbackInfo->id_ = %{public}d", callbackInfo->id_);
532 napi_value result[ARGS_SIZE_TWO] = {0};
533 ConfigCompleteInfoById(env, callbackInfo, result, ARGS_SIZE_TWO);
534
535 napi_value returnVal = 0;
536 napi_value callback = 0;
537 napi_value undefined = 0;
538 napi_get_undefined(env, &undefined);
539 result[PARAM0] = CreateBusinessError(env, callbackInfo->ret_);
540 if (callbackInfo->callback_) {
541 napi_get_reference_value(env, callbackInfo->callback_, &callback);
542 napi_call_function(env, undefined, callback, ARGS_SIZE_TWO, result, &returnVal);
543 napi_delete_reference(env, callbackInfo->callback_);
544 HILOG_DEBUG("complete function callback mode");
545 } else {
546 if (callbackInfo->ret_ == OHOS::Accessibility::RET_OK) {
547 HILOG_DEBUG("GetConfigComplete callbackInfo->ret_ is RET_OK");
548 napi_resolve_deferred(env, callbackInfo->deferred_, result[PARAM1]);
549 } else {
550 HILOG_DEBUG("GetConfigComplete callbackInfo->ret_ is not RET_OK");
551 napi_reject_deferred(env, callbackInfo->deferred_, result[PARAM0]);
552 }
553 }
554 napi_delete_async_work(env, callbackInfo->work_);
555 delete callbackInfo;
556 callbackInfo = nullptr;
557 }
558
GetScreenTouchConfigExecute(NAccessibilityConfigData * callbackInfo)559 void NAccessibilityConfig::GetScreenTouchConfigExecute(NAccessibilityConfigData* callbackInfo)
560 {
561 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
562 if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONIFG_CLICK_RESPONSE_TIME) {
563 OHOS::AccessibilityConfig::CLICK_RESPONSE_TIME time;
564 callbackInfo->ret_ = instance.GetClickResponseTime(time);
565 callbackInfo->stringConfig_ = ConvertClickResponseTimeTypeToString(time);
566 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_TIME) {
567 OHOS::AccessibilityConfig::IGNORE_REPEAT_CLICK_TIME time;
568 callbackInfo->ret_ = instance.GetIgnoreRepeatClickTime(time);
569 callbackInfo->stringConfig_ = ConvertIgnoreRepeatClickTimeTypeToString(time);
570 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_STATE) {
571 callbackInfo->ret_ = instance.GetIgnoreRepeatClickState(callbackInfo->boolConfig_);
572 }
573 }
574
GetConfigExecute(napi_env env,void * data)575 void NAccessibilityConfig::GetConfigExecute(napi_env env, void* data)
576 {
577 NAccessibilityConfigData* callbackInfo = static_cast<NAccessibilityConfigData*>(data);
578 if (callbackInfo == nullptr) {
579 HILOG_ERROR("callbackInfo is nullptr");
580 return;
581 }
582
583 HILOG_DEBUG("callbackInfo->id_ = %{public}d", callbackInfo->id_);
584 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
585 if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_HIGH_CONTRAST_TEXT) {
586 callbackInfo->ret_ = instance.GetHighContrastTextState(callbackInfo->boolConfig_);
587 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_STATE) {
588 callbackInfo->ret_ = instance.GetDaltonizationState(callbackInfo->boolConfig_);
589 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_INVERT_COLOR) {
590 callbackInfo->ret_ = instance.GetInvertColorState(callbackInfo->boolConfig_);
591 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_ANIMATION_OFF) {
592 callbackInfo->ret_ = instance.GetAnimationOffState(callbackInfo->boolConfig_);
593 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SCREEN_MAGNIFICATION) {
594 callbackInfo->ret_ = instance.GetScreenMagnificationState(callbackInfo->boolConfig_);
595 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_MONO) {
596 callbackInfo->ret_ = instance.GetAudioMonoState(callbackInfo->boolConfig_);
597 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_KEY) {
598 callbackInfo->ret_ = instance.GetMouseKeyState(callbackInfo->boolConfig_);
599 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY) {
600 callbackInfo->ret_ = instance.GetShortKeyState(callbackInfo->boolConfig_);
601 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STATE) {
602 callbackInfo->ret_ = instance.GetCaptionsState(callbackInfo->boolConfig_);
603 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_AUTOCLICK) {
604 callbackInfo->ret_ = instance.GetMouseAutoClick(callbackInfo->int32Config_);
605 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_BALANCE) {
606 callbackInfo->ret_ = instance.GetAudioBalance(callbackInfo->floatConfig_);
607 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_BRIGHTNESS_DISCOUNT) {
608 callbackInfo->ret_ = instance.GetBrightnessDiscount(callbackInfo->floatConfig_);
609 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_TARGET) {
610 callbackInfo->ret_ = instance.GetShortkeyTarget(callbackInfo->stringConfig_);
611 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_MULTI_TARGET) {
612 callbackInfo->ret_ = instance.GetShortkeyMultiTarget(callbackInfo->stringVectorConfig_);
613 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STYLE) {
614 callbackInfo->ret_ = instance.GetCaptionsProperty(callbackInfo->captionProperty_);
615 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CONTENT_TIMEOUT) {
616 uint32_t timeout = 0;
617 callbackInfo->ret_ = instance.GetContentTimeout(timeout);
618 callbackInfo->int32Config_ = static_cast<int32_t>(timeout);
619 } else if (callbackInfo->id_ == OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_COLOR_FILTER) {
620 OHOS::AccessibilityConfig::DALTONIZATION_TYPE type;
621 callbackInfo->ret_ = instance.GetDaltonizationColorFilter(type);
622 callbackInfo->stringConfig_ = ConvertDaltonizationTypeToString(type);
623 }
624
625 GetScreenTouchConfigExecute(callbackInfo);
626 }
627
GetCallbackInfo(napi_env env,napi_callback_info info,napi_value * parameters,size_t & argc,NAccessibilityConfigClass * & obj)628 NAccessibilityConfigData* NAccessibilityConfig::GetCallbackInfo(napi_env env, napi_callback_info info,
629 napi_value* parameters, size_t& argc, NAccessibilityConfigClass*& obj)
630 {
631 napi_value jsthis = nullptr;
632 napi_get_cb_info(env, info, &argc, parameters, &jsthis, nullptr);
633
634 napi_status status = napi_unwrap(env, jsthis, reinterpret_cast<void**>(&obj));
635 if (status != napi_ok) {
636 HILOG_ERROR("Failed to get unwrap obj");
637 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_FAILED);
638 napi_throw(env, err);
639 return nullptr;
640 }
641 if (!obj) {
642 HILOG_ERROR("obj is nullptr");
643 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
644 napi_throw(env, err);
645 return nullptr;
646 }
647 HILOG_DEBUG("ConfigID = %{public}d", obj->GetConfigId());
648 NAccessibilityConfigData* callbackInfo = new(std::nothrow) NAccessibilityConfigData();
649 if (callbackInfo == nullptr) {
650 HILOG_ERROR("callbackInfo is nullptr");
651 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
652 napi_throw(env, err);
653 return nullptr;
654 }
655 return callbackInfo;
656 }
657
ParseConnectTimeoutData(napi_env env,NAccessibilityConfigData * callbackInfo,napi_value * parameters)658 bool NAccessibilityConfig::ParseConnectTimeoutData(napi_env env, NAccessibilityConfigData* callbackInfo,
659 napi_value* parameters)
660 {
661 int32_t timeout = 0;
662 bool ret = ParseInt32(env, timeout, parameters[PARAM0]);
663 callbackInfo->uint32Config_ = static_cast<uint32_t>(timeout);
664 return ret;
665 }
666
ParseMouseAutoClickData(napi_env env,NAccessibilityConfigData * callbackInfo,napi_value * parameters)667 bool NAccessibilityConfig::ParseMouseAutoClickData(napi_env env, NAccessibilityConfigData* callbackInfo,
668 napi_value* parameters)
669 {
670 int32_t time = 0;
671 bool ret = ParseInt32(env, time, parameters[PARAM0]);
672 callbackInfo->int32Config_ = time;
673 return ret;
674 }
675
SetConfigParseBoolData(napi_env env,NAccessibilityConfigData * callbackInfo,napi_value * parameters)676 bool NAccessibilityConfig::SetConfigParseBoolData(napi_env env, NAccessibilityConfigData* callbackInfo,
677 napi_value* parameters)
678 {
679 bool state = false;
680 bool ret = ParseBool(env, state, parameters[PARAM0]);
681 callbackInfo->boolConfig_ = state;
682 return ret;
683 }
684
SetConfigParseData(napi_env env,NAccessibilityConfigClass * obj,NAccessibilityConfigData * callbackInfo,napi_value * parameters,size_t argc)685 bool NAccessibilityConfig::SetConfigParseData(napi_env env, NAccessibilityConfigClass* obj,
686 NAccessibilityConfigData* callbackInfo, napi_value* parameters, size_t argc)
687 {
688 bool ret = false;
689 switch (obj->GetConfigId()) {
690 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_HIGH_CONTRAST_TEXT:
691 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_INVERT_COLOR:
692 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_ANIMATION_OFF:
693 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SCREEN_MAGNIFICATION:
694 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_MONO:
695 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_KEY:
696 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY:
697 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STATE:
698 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_STATE:
699 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_STATE:
700 return SetConfigParseBoolData(env, callbackInfo, parameters);
701 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CONTENT_TIMEOUT:
702 return ParseConnectTimeoutData(env, callbackInfo, parameters);
703 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_MOUSE_AUTOCLICK:
704 return ParseMouseAutoClickData(env, callbackInfo, parameters);
705 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_AUDIO_BALANCE:
706 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_BRIGHTNESS_DISCOUNT:
707 {
708 double doubleTemp = 0;
709 ret = ParseDouble(env, doubleTemp, parameters[PARAM0]);
710 callbackInfo->floatConfig_ = static_cast<float>(doubleTemp);
711 }
712 break;
713 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_DALTONIZATION_COLOR_FILTER:
714 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_TARGET:
715 case OHOS::AccessibilityConfig::CONFIG_ID::CONIFG_CLICK_RESPONSE_TIME:
716 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_IGNORE_REPEAT_CLICK_TIME:
717 {
718 std::string target = "";
719 ret = ParseString(env, target, parameters[PARAM0]) && target.length() > 0;
720 callbackInfo->stringConfig_ = target;
721 }
722 break;
723 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_SHORT_KEY_MULTI_TARGET:
724 {
725 std::vector<std::string> stringArray;
726 ConvertStringArrayJSToNAPICommon(env, parameters[PARAM0], stringArray);
727 callbackInfo->stringVectorConfig_ = stringArray;
728 return true;
729 }
730 case OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_CAPTION_STYLE:
731 return ConvertObjToCaptionProperty(env, parameters[PARAM0], &callbackInfo->captionProperty_);
732 default:
733 break;
734 }
735 return ret;
736 }
737
SetConfig(napi_env env,napi_callback_info info)738 napi_value NAccessibilityConfig::SetConfig(napi_env env, napi_callback_info info)
739 {
740 HILOG_DEBUG();
741 NAccessibilityConfigClass* obj;
742 size_t argc = ARGS_SIZE_TWO;
743 napi_value parameters[ARGS_SIZE_TWO] = {0};
744 NAccessibilityConfigData* callbackInfo = GetCallbackInfo(env, info, parameters, argc, obj);
745 if (callbackInfo == nullptr) {
746 return nullptr;
747 }
748
749 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
750 if (argc < ARGS_SIZE_TWO - 1) {
751 HILOG_ERROR("argc is invalid: %{public}zu", argc);
752 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
753 }
754
755 if (errCode == OHOS::Accessibility::RET_OK) {
756 if (!SetConfigParseData(env, obj, callbackInfo, parameters, argc)) {
757 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
758 }
759 }
760
761 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
762 delete callbackInfo;
763 callbackInfo = nullptr;
764 napi_value err = CreateBusinessError(env, errCode);
765 HILOG_ERROR("SetConfig invalid param");
766 napi_throw(env, err);
767 return nullptr;
768 }
769 callbackInfo->id_ = obj->GetConfigId();
770
771 // parse function if it needs
772 napi_value promise = nullptr;
773 if (argc >= ARGS_SIZE_TWO && CheckJsFunction(env, parameters[PARAM1])) {
774 napi_create_reference(env, parameters[PARAM1], 1, &callbackInfo->callback_);
775 napi_get_undefined(env, &promise);
776 } else {
777 napi_create_promise(env, &callbackInfo->deferred_, &promise);
778 }
779 napi_value resource = nullptr;
780 napi_create_string_utf8(env, "SetConfig", NAPI_AUTO_LENGTH, &resource);
781
782 napi_create_async_work(env, nullptr, resource,
783 // Execute async to call c++ function
784 NAccessibilityConfig::SetConfigExecute,
785 // Execute the complete function
786 NAccessibilityConfig::AsyncWorkComplete,
787 reinterpret_cast<void*>(callbackInfo),
788 &callbackInfo->work_);
789 napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
790 return promise;
791 }
792
GetConfig(napi_env env,napi_callback_info info)793 napi_value NAccessibilityConfig::GetConfig(napi_env env, napi_callback_info info)
794 {
795 HILOG_DEBUG();
796 size_t argc = ARGS_SIZE_ONE;
797 napi_value parameters[ARGS_SIZE_ONE] = {0};
798 napi_value jsthis = nullptr;
799 napi_get_cb_info(env, info, &argc, parameters, &jsthis, nullptr);
800
801 NAccessibilityConfigClass* obj;
802 napi_status status = napi_unwrap(env, jsthis, reinterpret_cast<void**>(&obj));
803 if (status != napi_ok) {
804 HILOG_ERROR("Failed to get unwrap obj");
805 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_FAILED);
806 napi_throw(env, err);
807 return nullptr;
808 }
809 if (!obj) {
810 HILOG_ERROR("obj is nullptr");
811 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
812 napi_throw(env, err);
813 return nullptr;
814 }
815 HILOG_DEBUG("ConfigID = %{public}d", obj->GetConfigId());
816
817 NAccessibilityConfigData* callbackInfo = new(std::nothrow) NAccessibilityConfigData();
818 if (callbackInfo == nullptr) {
819 HILOG_ERROR("callbackInfo is nullptr");
820 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
821 napi_throw(env, err);
822 return nullptr;
823 }
824 callbackInfo->id_ = obj->GetConfigId();
825
826 // parse function if it needs
827 napi_value promise = nullptr;
828 if (argc >= ARGS_SIZE_ONE && CheckJsFunction(env, parameters[PARAM0])) {
829 napi_create_reference(env, parameters[PARAM0], 1, &callbackInfo->callback_);
830 napi_get_undefined(env, &promise);
831 } else {
832 napi_create_promise(env, &callbackInfo->deferred_, &promise);
833 }
834 napi_value resource = nullptr;
835 napi_create_string_utf8(env, "GetConfig", NAPI_AUTO_LENGTH, &resource);
836
837 napi_create_async_work(env, nullptr, resource,
838 // Execute async to call c++ function
839 NAccessibilityConfig::GetConfigExecute,
840 // Execute the complete function
841 NAccessibilityConfig::GetConfigComplete,
842 reinterpret_cast<void*>(callbackInfo),
843 &callbackInfo->work_);
844 napi_queue_async_work_with_qos(env, callbackInfo->work_, napi_qos_user_initiated);
845 return promise;
846 }
847
SubscribeConfigObserver(napi_env env,napi_callback_info info)848 napi_value NAccessibilityConfig::SubscribeConfigObserver(napi_env env, napi_callback_info info)
849 {
850 HILOG_DEBUG();
851 if (!IsAvailable(env, info)) {
852 return nullptr;
853 }
854 size_t argc = ARGS_SIZE_ONE;
855 napi_value parameters[ARGS_SIZE_ONE] = {0};
856 napi_value jsthis = nullptr;
857 napi_get_cb_info(env, info, &argc, parameters, &jsthis, nullptr);
858 NAccessibilityConfigClass* obj;
859 napi_status status = napi_unwrap(env, jsthis, reinterpret_cast<void**>(&obj));
860 if (status != napi_ok) {
861 HILOG_ERROR("Failed to get unwrap obj");
862 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_FAILED);
863 napi_throw(env, err);
864 return nullptr;
865 }
866 if (!obj) {
867 HILOG_ERROR("obj is nullptr");
868 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
869 napi_throw(env, err);
870 return nullptr;
871 }
872
873 OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK;
874 if (argc < ARGS_SIZE_ONE) {
875 HILOG_ERROR("argc is invalid: %{public}zu", argc);
876 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
877 }
878
879 if (errCode == OHOS::Accessibility::RET_OK) {
880 napi_valuetype valueType = napi_null;
881 napi_typeof(env, parameters[PARAM0], &valueType);
882 if (valueType != napi_function) {
883 HILOG_ERROR("parameters[PARAM1] format is wrong");
884 errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM;
885 }
886 }
887
888 if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) {
889 napi_value err = CreateBusinessError(env, errCode);
890 HILOG_ERROR("invalid param");
891 napi_throw(env, err);
892 return nullptr;
893 }
894
895 configObservers_->SubscribeObserver(env, obj->GetConfigId(), parameters[PARAM0]);
896 return nullptr;
897 }
898
UnSubscribeConfigObserver(napi_env env,napi_callback_info info)899 napi_value NAccessibilityConfig::UnSubscribeConfigObserver(napi_env env, napi_callback_info info)
900 {
901 HILOG_DEBUG();
902 if (!IsAvailable(env, info)) {
903 return nullptr;
904 }
905 napi_value jsthis = nullptr;
906 size_t argc = ARGS_SIZE_ONE;
907 napi_value parameters[ARGS_SIZE_ONE] = {0};
908 napi_get_cb_info(env, info, &argc, parameters, &jsthis, nullptr);
909 NAccessibilityConfigClass* obj;
910 napi_status status = napi_unwrap(env, jsthis, reinterpret_cast<void**>(&obj));
911 if (status != napi_ok) {
912 HILOG_ERROR("Failed to get unwrap obj");
913 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_FAILED);
914 napi_throw(env, err);
915 return nullptr;
916 }
917 if (!obj) {
918 HILOG_ERROR("obj is nullptr");
919 napi_value err = CreateBusinessError(env, OHOS::Accessibility::RET_ERR_NULLPTR);
920 napi_throw(env, err);
921 return nullptr;
922 }
923 if (argc >= ARGS_SIZE_ONE && CheckJsFunction(env, parameters[PARAM0])) {
924 configObservers_->UnsubscribeObserver(env, obj->GetConfigId(), parameters[PARAM0]);
925 } else {
926 configObservers_->UnsubscribeObservers(obj->GetConfigId());
927 }
928
929 return nullptr;
930 }
931
OnEnableAbilityListsStateChanged()932 void EnableAbilityListsObserver::OnEnableAbilityListsStateChanged()
933 {
934 HILOG_DEBUG();
935
936 AccessibilityCallbackInfo *callbackInfo = new(std::nothrow) AccessibilityCallbackInfo();
937 if (callbackInfo == nullptr) {
938 HILOG_ERROR("callbackInfo is nullptr");
939 return;
940 }
941
942 uv_work_t *work = new(std::nothrow) uv_work_t;
943 if (!work) {
944 HILOG_ERROR("Failed to create work.");
945 delete callbackInfo;
946 callbackInfo = nullptr;
947 return;
948 }
949
950 callbackInfo->env_ = env_;
951 callbackInfo->ref_ = callback_;
952 work->data = static_cast<void*>(callbackInfo);
953
954 int ret = OnEnableAbilityListsStateChangedWork(work);
955 if (ret != 0) {
956 HILOG_ERROR("Failed to execute OnEnableAbilityListsStateChanged work queue");
957 delete callbackInfo;
958 callbackInfo = nullptr;
959 delete work;
960 work = nullptr;
961 }
962 }
963
OnEnableAbilityListsStateChangedWork(uv_work_t * work)964 int EnableAbilityListsObserver::OnEnableAbilityListsStateChangedWork(uv_work_t *work)
965 {
966 uv_loop_s *loop = nullptr;
967 napi_get_uv_event_loop(env_, &loop);
968 if (loop == nullptr || work == nullptr) {
969 HILOG_ERROR("loop or work is nullptr.");
970 return RET_ERR_FAILED;
971 }
972 int ret = uv_queue_work_with_qos(
973 loop,
974 work,
975 [](uv_work_t *work) {},
976 [](uv_work_t *work, int status) {
977 AccessibilityCallbackInfo *callbackInfo = static_cast<AccessibilityCallbackInfo*>(work->data);
978 napi_env env = callbackInfo->env_;
979 auto closeScope = [env](napi_handle_scope scope) {
980 napi_close_handle_scope(env, scope);
981 };
982 std::unique_ptr<napi_handle_scope__, decltype(closeScope)> scopes(
983 OHOS::Accessibility::TmpOpenScope(callbackInfo->env_), closeScope);
984 napi_value handler = nullptr;
985 napi_value callResult = nullptr;
986 napi_value jsEvent = nullptr;
987 napi_value undefined = nullptr;
988 napi_get_reference_value(callbackInfo->env_, callbackInfo->ref_, &handler);
989 napi_get_undefined(callbackInfo->env_, &undefined);
990 napi_call_function(callbackInfo->env_, undefined, handler, 1, &jsEvent, &callResult);
991 delete callbackInfo;
992 callbackInfo = nullptr;
993 delete work;
994 work = nullptr;
995 },
996 uv_qos_default);
997 return ret;
998 }
999
SubscribeToFramework()1000 void EnableAbilityListsObserverImpl::SubscribeToFramework()
1001 {
1002 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1003 instance.SubscribeEnableAbilityListsObserver(shared_from_this());
1004 }
1005
UnsubscribeFromFramework()1006 void EnableAbilityListsObserverImpl::UnsubscribeFromFramework()
1007 {
1008 HILOG_INFO("UnsubscribeFromFramework");
1009 auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1010 instance.UnsubscribeEnableAbilityListsObserver(shared_from_this());
1011 }
1012
OnEnableAbilityListsStateChanged()1013 void EnableAbilityListsObserverImpl::OnEnableAbilityListsStateChanged()
1014 {
1015 HILOG_DEBUG();
1016 std::lock_guard<ffrt::mutex> lock(mutex_);
1017 for (auto &observer : enableAbilityListsObservers_) {
1018 observer->OnEnableAbilityListsStateChanged();
1019 }
1020 }
1021
OnInstallAbilityListsStateChanged()1022 void EnableAbilityListsObserverImpl::OnInstallAbilityListsStateChanged()
1023 {
1024 HILOG_DEBUG();
1025 std::lock_guard<ffrt::mutex> lock(mutex_);
1026 for (auto &observer : installAbilityListsObservers_) {
1027 if (observer) {
1028 observer->OnEnableAbilityListsStateChanged();
1029 } else {
1030 HILOG_ERROR("observer is null");
1031 }
1032 }
1033 }
1034
SubscribeObserver(napi_env env,napi_value observer)1035 void EnableAbilityListsObserverImpl::SubscribeObserver(napi_env env, napi_value observer)
1036 {
1037 HILOG_DEBUG();
1038 std::lock_guard<ffrt::mutex> lock(mutex_);
1039 for (auto iter = enableAbilityListsObservers_.begin(); iter != enableAbilityListsObservers_.end();) {
1040 if (CheckObserverEqual(env, observer, (*iter)->env_, (*iter)->callback_)) {
1041 HILOG_DEBUG("Observer exist");
1042 return;
1043 } else {
1044 iter++;
1045 }
1046 }
1047
1048 napi_ref callback = nullptr;
1049 napi_create_reference(env, observer, 1, &callback);
1050 std::shared_ptr<EnableAbilityListsObserver> observerPtr =
1051 std::make_shared<EnableAbilityListsObserver>(env, callback);
1052
1053 enableAbilityListsObservers_.emplace_back(observerPtr);
1054 HILOG_DEBUG("observer size%{public}zu", enableAbilityListsObservers_.size());
1055 }
1056
SubscribeInstallObserver(napi_env env,napi_value observer)1057 void EnableAbilityListsObserverImpl::SubscribeInstallObserver(napi_env env, napi_value observer)
1058 {
1059 HILOG_DEBUG();
1060 std::lock_guard<ffrt::mutex> lock(mutex_);
1061 for (auto iter = installAbilityListsObservers_.begin(); iter != installAbilityListsObservers_.end(); iter++) {
1062 if (CheckObserverEqual(env, observer, (*iter)->env_, (*iter)->callback_)) {
1063 HILOG_DEBUG("Observer exist");
1064 return;
1065 }
1066 }
1067
1068 napi_ref callback = nullptr;
1069 napi_create_reference(env, observer, 1, &callback);
1070 std::shared_ptr<EnableAbilityListsObserver> observerPtr =
1071 std::make_shared<EnableAbilityListsObserver>(env, callback);
1072
1073 installAbilityListsObservers_.emplace_back(observerPtr);
1074 HILOG_DEBUG("observer size%{public}zu", installAbilityListsObservers_.size());
1075 }
1076
UnsubscribeObserver(napi_env env,napi_value observer)1077 void EnableAbilityListsObserverImpl::UnsubscribeObserver(napi_env env, napi_value observer)
1078 {
1079 HILOG_DEBUG();
1080 std::lock_guard<ffrt::mutex> lock(mutex_);
1081 for (auto iter = enableAbilityListsObservers_.begin(); iter != enableAbilityListsObservers_.end();) {
1082 if (CheckObserverEqual(env, observer, (*iter)->env_, (*iter)->callback_)) {
1083 enableAbilityListsObservers_.erase(iter);
1084 return;
1085 } else {
1086 iter++;
1087 }
1088 }
1089 }
1090
UnsubscribeObservers()1091 void EnableAbilityListsObserverImpl::UnsubscribeObservers()
1092 {
1093 HILOG_DEBUG();
1094 std::lock_guard<ffrt::mutex> lock(mutex_);
1095 enableAbilityListsObservers_.clear();
1096 }
1097
UnsubscribeInstallObserver(napi_env env,napi_value observer)1098 void EnableAbilityListsObserverImpl::UnsubscribeInstallObserver(napi_env env, napi_value observer)
1099 {
1100 HILOG_DEBUG();
1101 std::lock_guard<ffrt::mutex> lock(mutex_);
1102 for (auto iter = installAbilityListsObservers_.begin(); iter != installAbilityListsObservers_.end(); iter++) {
1103 if (CheckObserverEqual(env, observer, (*iter)->env_, (*iter)->callback_)) {
1104 installAbilityListsObservers_.erase(iter);
1105 return;
1106 }
1107 }
1108 }
1109
UnsubscribeInstallObservers()1110 void EnableAbilityListsObserverImpl::UnsubscribeInstallObservers()
1111 {
1112 HILOG_DEBUG();
1113 std::lock_guard<ffrt::mutex> lock(mutex_);
1114 installAbilityListsObservers_.clear();
1115 }
1116