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