• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023-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 <string>
17 #ifdef OHOS_BUILD_ENABLE_HITRACE
18 #include <hitrace_meter.h>
19 #endif // OHOS_BUILD_ENABLE_HITRACE
20 #include "accessibility_account_data.h"
21 #include "accessible_ability_manager_service.h"
22 #include "accessibility_settings.h"
23 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
24 #include "accessibility_power_manager.h"
25 #endif
26 #include "hilog_wrapper.h"
27 #include "parameter.h"
28 #include "accessibility_notification_helper.h"
29 
30 namespace OHOS {
31 namespace Accessibility {
32 namespace {
33     const std::string GRAPHIC_ANIMATION_SCALE_NAME = "persist.sys.graphic.animationscale";
34     const std::string ARKUI_ANIMATION_SCALE_NAME = "persist.sys.arkui.animationscale";
35     const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.ohos.screenreader/AccessibilityExtAbility";
36     const int32_t SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
37     const int32_t SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
38     const int32_t DATASHARE_DEFAULT_TIMEOUT = 2 * 1000; // ms
39     const int32_t INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE = 2;
40 }
41 
RegisterSettingsHandler(const std::shared_ptr<AppExecFwk::EventHandler> & handler)42 void AccessibilitySettings::RegisterSettingsHandler(const std::shared_ptr<AppExecFwk::EventHandler> &handler)
43 {
44     HILOG_DEBUG();
45     handler_ = handler;
46 }
47 
OnParameterChanged(const char * key,const char * value,void * context)48 void AccessibilitySettings::OnParameterChanged(const char *key, const char *value, void *context)
49 {
50     if (!key || !value || !context) {
51         return;
52     }
53     std::string strKey(key);
54     std::string strValue(value);
55     if (strKey != GRAPHIC_ANIMATION_SCALE_NAME && strKey != ARKUI_ANIMATION_SCALE_NAME) {
56         return;
57     }
58     AccessibilitySettings *settingsPtr = static_cast<AccessibilitySettings *>(context);
59     if (!settingsPtr) {
60         return;
61     }
62     sptr<AccessibilityAccountData> accountData =
63         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
64     if (!accountData) {
65         return;
66     }
67     bool state = accountData->GetConfig()->GetAnimationOffState();
68     HILOG_INFO("on param changed, %{public}s %{public}d", strValue.c_str(), state);
69     if (strValue == "0" && !state) {
70         accountData->GetConfig()->SetAnimationOffState(true);
71         settingsPtr->UpdateConfigState();
72     } else if (strValue != "0" && state) {
73         accountData->GetConfig()->SetAnimationOffState(false);
74         settingsPtr->UpdateConfigState();
75     }
76 }
77 
RegisterParamWatcher()78 void AccessibilitySettings::RegisterParamWatcher()
79 {
80     WatchParameter(GRAPHIC_ANIMATION_SCALE_NAME.c_str(), &OnParameterChanged, this);
81     WatchParameter(ARKUI_ANIMATION_SCALE_NAME.c_str(), &OnParameterChanged, this);
82 }
83 
SetScreenMagnificationState(const bool state)84 RetError AccessibilitySettings::SetScreenMagnificationState(const bool state)
85 {
86     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
87 #ifdef OHOS_BUILD_ENABLE_HITRACE
88     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetScreenMagnificationState:" + std::to_string(state));
89 #endif // OHOS_BUILD_ENABLE_HITRACE
90 
91     sptr<AccessibilityAccountData> accountData =
92         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
93     if (!accountData) {
94         HILOG_ERROR("accountData is nullptr.");
95         return RET_ERR_NULLPTR;
96     }
97     RetError ret = accountData->GetConfig()->SetScreenMagnificationState(state);
98     UpdateConfigState();
99     Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
100     return ret;
101 }
102 
SetShortKeyState(const bool state)103 RetError AccessibilitySettings::SetShortKeyState(const bool state)
104 {
105     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
106 #ifdef OHOS_BUILD_ENABLE_HITRACE
107     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetShortKeyState:" + std::to_string(state));
108 #endif // OHOS_BUILD_ENABLE_HITRACE
109 
110     if (!handler_) {
111         HILOG_ERROR("handler_ is nullptr.");
112         return RET_ERR_NULLPTR;
113     }
114 
115     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
116     if (syncPromise == nullptr) {
117         HILOG_ERROR("syncPromise is nullptr.");
118         return RET_ERR_NULLPTR;
119     }
120     ffrt::future syncFuture = syncPromise->get_future();
121     handler_->PostTask([this, syncPromise, state]() {
122         sptr<AccessibilityAccountData> accountData =
123             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
124         if (!accountData) {
125             HILOG_ERROR("accountData is nullptr.");
126             syncPromise->set_value(RET_ERR_NULLPTR);
127             return;
128         }
129         RetError ret = accountData->GetConfig()->SetShortKeyState(state);
130         syncPromise->set_value(ret);
131         UpdateConfigState();
132         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateShortKeyRegister();
133         }, "TASK_SET_SHORTKEY_STATE");
134 
135     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
136     if (wait != ffrt::future_status::ready) {
137         HILOG_ERROR("SetShortKeyState Failed to wait result");
138         return RET_ERR_TIME_OUT;
139     }
140     return syncFuture.get();
141 }
142 
SetMouseKeyState(const bool state)143 RetError AccessibilitySettings::SetMouseKeyState(const bool state)
144 {
145     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
146 
147     sptr<AccessibilityAccountData> accountData =
148         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
149     if (!accountData) {
150         HILOG_ERROR("accountData is nullptr.");
151         return RET_ERR_NULLPTR;
152     }
153     RetError ret = accountData->GetConfig()->SetMouseKeyState(state);
154     UpdateConfigState();
155     Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
156     return ret;
157 }
158 
SetMouseAutoClick(const int32_t time)159 RetError AccessibilitySettings::SetMouseAutoClick(const int32_t time)
160 {
161     HILOG_INFO("time = [%{public}d]", time);
162     if (!handler_) {
163         HILOG_ERROR("handler_ is nullptr.");
164         return RET_ERR_NULLPTR;
165     }
166 
167     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
168     if (syncPromise == nullptr) {
169         HILOG_ERROR("syncPromise is nullptr.");
170         return RET_ERR_NULLPTR;
171     }
172     ffrt::future syncFuture = syncPromise->get_future();
173     handler_->PostTask([this, syncPromise, time]() {
174         sptr<AccessibilityAccountData> accountData =
175             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
176         if (!accountData) {
177             HILOG_ERROR("accountData is nullptr.");
178             syncPromise->set_value(RET_ERR_NULLPTR);
179             return;
180         }
181         RetError ret = accountData->GetConfig()->SetMouseAutoClick(time);
182         syncPromise->set_value(ret);
183         UpdateMouseAutoClick();
184         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
185         }, "TASK_SET_MOUSE_AUTOCLICK");
186 
187     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
188     if (wait != ffrt::future_status::ready) {
189         HILOG_ERROR("SetMouseAutoClick Failed to wait result");
190         return RET_ERR_TIME_OUT;
191     }
192     return syncFuture.get();
193 }
194 
SetShortkeyTarget(const std::string & name)195 RetError AccessibilitySettings::SetShortkeyTarget(const std::string &name)
196 {
197     HILOG_INFO("name = [%{public}s]", name.c_str());
198 #ifdef OHOS_BUILD_ENABLE_HITRACE
199     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetShortkeyTarget:" + name);
200 #endif // OHOS_BUILD_ENABLE_HITRACE
201 
202     if (!handler_) {
203         HILOG_ERROR("handler_ is nullptr.");
204         return RET_ERR_NULLPTR;
205     }
206 
207     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
208     if (syncPromise == nullptr) {
209         HILOG_ERROR("syncPromise is nullptr.");
210         return RET_ERR_NULLPTR;
211     }
212     ffrt::future syncFuture = syncPromise->get_future();
213     handler_->PostTask([this, syncPromise, name]() {
214         sptr<AccessibilityAccountData> accountData =
215             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
216         if (!accountData) {
217             HILOG_ERROR("accountData is nullptr.");
218             syncPromise->set_value(RET_ERR_NULLPTR);
219             return;
220         }
221         RetError ret = accountData->GetConfig()->SetShortkeyTarget(name);
222         syncPromise->set_value(ret);
223         UpdateShortkeyTarget();
224         }, "TASK_SET_SHORTKEY_TARGET");
225 
226     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
227     if (wait != ffrt::future_status::ready) {
228         HILOG_ERROR("SetShortkeyTarget Failed to wait result");
229         return RET_ERR_TIME_OUT;
230     }
231     return syncFuture.get();
232 }
233 
SetShortkeyMultiTarget(const std::vector<std::string> & name)234 RetError AccessibilitySettings::SetShortkeyMultiTarget(const std::vector<std::string> &name)
235 {
236     HILOG_DEBUG();
237 #ifdef OHOS_BUILD_ENABLE_HITRACE
238     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetShortkeyMultiTarget");
239 #endif // OHOS_BUILD_ENABLE_HITRACE
240 
241     if (!handler_) {
242         HILOG_ERROR("handler_ is nullptr.");
243         return RET_ERR_NULLPTR;
244     }
245     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
246     if (syncPromise == nullptr) {
247         HILOG_ERROR("syncPromise is nullptr.");
248         return RET_ERR_NULLPTR;
249     }
250     ffrt::future syncFuture = syncPromise->get_future();
251     handler_->PostTask([this, syncPromise, name]() {
252         sptr<AccessibilityAccountData> accountData =
253             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
254         if (!accountData) {
255             HILOG_ERROR("accountData is nullptr.");
256             syncPromise->set_value(RET_ERR_NULLPTR);
257             return;
258         }
259         RetError ret = accountData->GetConfig()->SetShortkeyMultiTarget(name);
260         syncPromise->set_value(ret);
261         UpdateShortkeyMultiTarget();
262         }, "TASK_SET_SHORTKEY_MULTI_TARGET");
263 
264     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
265     if (wait != ffrt::future_status::ready) {
266         HILOG_ERROR("SetShortkeyMultiTarget Failed to wait result");
267         return RET_ERR_TIME_OUT;
268     }
269     return syncFuture.get();
270 }
271 
SetHighContrastTextState(const bool state)272 RetError AccessibilitySettings::SetHighContrastTextState(const bool state)
273 {
274     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
275 #ifdef OHOS_BUILD_ENABLE_HITRACE
276     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetHighContrastTextState:" + std::to_string(state));
277 #endif // OHOS_BUILD_ENABLE_HITRACE
278 
279     sptr<AccessibilityAccountData> accountData =
280         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
281     if (!accountData) {
282         HILOG_ERROR("accountData is nullptr.");
283         return RET_ERR_NULLPTR;
284     }
285     RetError ret = accountData->GetConfig()->SetHighContrastTextState(state);
286     UpdateConfigState();
287     return ret;
288 }
289 
SetDaltonizationState(const bool state)290 RetError AccessibilitySettings::SetDaltonizationState(const bool state)
291 {
292     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
293 #ifdef OHOS_BUILD_ENABLE_HITRACE
294     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetDaltonizationState:" + std::to_string(state));
295 #endif // OHOS_BUILD_ENABLE_HITRACE
296 
297     sptr<AccessibilityAccountData> accountData =
298         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
299     if (!accountData) {
300         HILOG_ERROR("accountData is nullptr.");
301         return RET_ERR_NULLPTR;
302     }
303     RetError ret = accountData->GetConfig()->SetDaltonizationState(state);
304     UpdateConfigState();
305     return ret;
306 }
307 
SetInvertColorState(const bool state)308 RetError AccessibilitySettings::SetInvertColorState(const bool state)
309 {
310     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
311 #ifdef OHOS_BUILD_ENABLE_HITRACE
312     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetInvertColorState:" + std::to_string(state));
313 #endif // OHOS_BUILD_ENABLE_HITRACE
314 
315     sptr<AccessibilityAccountData> accountData =
316         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
317     if (!accountData) {
318         HILOG_ERROR("accountData is nullptr.");
319         return RET_ERR_NULLPTR;
320     }
321     RetError ret = accountData->GetConfig()->SetInvertColorState(state);
322     UpdateConfigState();
323     return ret;
324 }
325 
SetAnimationOffState(const bool state)326 RetError AccessibilitySettings::SetAnimationOffState(const bool state)
327 {
328     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
329 
330     sptr<AccessibilityAccountData> accountData =
331         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
332     if (!accountData) {
333         HILOG_ERROR("accountData is nullptr.");
334         return RET_ERR_NULLPTR;
335     }
336     RetError ret = accountData->GetConfig()->SetAnimationOffState(state);
337     UpdateConfigState();
338     int setGraphicParamRes = -1;
339     int setArkuiParamRes = -1;
340     if (state) {
341         setGraphicParamRes = SetParameter(GRAPHIC_ANIMATION_SCALE_NAME.c_str(), "0");
342         setArkuiParamRes = SetParameter(ARKUI_ANIMATION_SCALE_NAME.c_str(), "0");
343     } else {
344         setGraphicParamRes = SetParameter(GRAPHIC_ANIMATION_SCALE_NAME.c_str(), "1");
345         setArkuiParamRes = SetParameter(ARKUI_ANIMATION_SCALE_NAME.c_str(), "1");
346     }
347     HILOG_INFO("SetParameter results are %{public}d and %{public}d", setGraphicParamRes, setArkuiParamRes);
348     return ret;
349 }
350 
SetAudioMonoState(const bool state)351 RetError AccessibilitySettings::SetAudioMonoState(const bool state)
352 {
353     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
354 #ifdef OHOS_BUILD_ENABLE_HITRACE
355     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetAudioMonoState:" + std::to_string(state));
356 #endif // OHOS_BUILD_ENABLE_HITRACE
357 
358     sptr<AccessibilityAccountData> accountData =
359         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
360     if (!accountData) {
361         HILOG_ERROR("accountData is nullptr.");
362         return RET_ERR_NULLPTR;
363     }
364     RetError ret = accountData->GetConfig()->SetAudioMonoState(state);
365     UpdateConfigState();
366     return ret;
367 }
368 
SetDaltonizationColorFilter(const uint32_t filter)369 RetError AccessibilitySettings::SetDaltonizationColorFilter(const uint32_t filter)
370 {
371     HILOG_INFO("filter = [%{public}u]", filter);
372 #ifdef OHOS_BUILD_ENABLE_HITRACE
373     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetDaltonizationColorFilter:" + std::to_string(filter));
374 #endif // OHOS_BUILD_ENABLE_HITRACE
375     if (!handler_) {
376         HILOG_ERROR("handler_ is nullptr.");
377         return RET_ERR_NULLPTR;
378     }
379 
380     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
381     if (syncPromise == nullptr) {
382         HILOG_ERROR("syncPromise is nullptr.");
383         return RET_ERR_NULLPTR;
384     }
385     ffrt::future syncFuture = syncPromise->get_future();
386     handler_->PostTask([this, syncPromise, filter]() {
387         sptr<AccessibilityAccountData> accountData =
388             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
389         if (!accountData) {
390             HILOG_ERROR("accountData is nullptr.");
391             syncPromise->set_value(RET_ERR_NULLPTR);
392             return;
393         }
394         RetError ret = accountData->GetConfig()->SetDaltonizationColorFilter(filter);
395         syncPromise->set_value(ret);
396         UpdateDaltonizationColorFilter();
397         }, "TASK_SET_DALTONIZATION_COLORFILTER");
398 
399     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
400     if (wait != ffrt::future_status::ready) {
401         HILOG_ERROR("SetDaltonizationColorFilter Failed to wait result");
402         return RET_ERR_TIME_OUT;
403     }
404     return syncFuture.get();
405 }
406 
SetContentTimeout(const uint32_t time)407 RetError AccessibilitySettings::SetContentTimeout(const uint32_t time)
408 {
409     HILOG_INFO("time = [%{public}u]", time);
410     if (!handler_) {
411         HILOG_ERROR("handler_ is nullptr.");
412         return RET_ERR_NULLPTR;
413     }
414 
415     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
416     if (syncPromise == nullptr) {
417         HILOG_ERROR("syncPromise is nullptr.");
418         return RET_ERR_NULLPTR;
419     }
420     ffrt::future syncFuture = syncPromise->get_future();
421     handler_->PostTask([this, syncPromise, time]() {
422         sptr<AccessibilityAccountData> accountData =
423             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
424         if (!accountData) {
425             HILOG_ERROR("accountData is nullptr.");
426             syncPromise->set_value(RET_ERR_NULLPTR);
427             return;
428         }
429         RetError ret = accountData->GetConfig()->SetContentTimeout(time);
430         syncPromise->set_value(ret);
431         UpdateContentTimeout();
432         }, "TASK_SET_CONTENT_TIMEOUT");
433 
434     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
435     if (wait != ffrt::future_status::ready) {
436         HILOG_ERROR("SetContentTimeout Failed to wait result");
437         return RET_ERR_TIME_OUT;
438     }
439     return syncFuture.get();
440 }
441 
SetBrightnessDiscount(const float discount)442 RetError AccessibilitySettings::SetBrightnessDiscount(const float discount)
443 {
444     HILOG_INFO("discount = [%{public}f]", discount);
445     if (!handler_) {
446         HILOG_ERROR("handler_ is nullptr.");
447         return RET_ERR_NULLPTR;
448     }
449 
450 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
451     if (!Singleton<AccessibilityPowerManager>::GetInstance().DiscountBrightness(discount)) {
452         HILOG_ERROR("Failed to set brightness discount");
453         return Accessibility::RET_ERR_FAILED;
454     }
455 #endif
456     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
457     if (syncPromise == nullptr) {
458         HILOG_ERROR("syncPromise is nullptr.");
459         return RET_ERR_NULLPTR;
460     }
461     ffrt::future syncFuture = syncPromise->get_future();
462     handler_->PostTask([this, syncPromise, discount]() {
463         sptr<AccessibilityAccountData> accountData =
464             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
465         if (!accountData) {
466             HILOG_ERROR("accountData is nullptr.");
467             syncPromise->set_value(RET_ERR_NULLPTR);
468             return;
469         }
470         RetError ret = accountData->GetConfig()->SetBrightnessDiscount(discount);
471         syncPromise->set_value(ret);
472         UpdateBrightnessDiscount();
473         }, "TASK_SET_BRIGHTNESS_DISCOUNT");
474 
475     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
476     if (wait != ffrt::future_status::ready) {
477         HILOG_ERROR("SetBrightnessDiscount Failed to wait result");
478         return RET_ERR_TIME_OUT;
479     }
480     return syncFuture.get();
481 }
482 
SetAudioBalance(const float balance)483 RetError AccessibilitySettings::SetAudioBalance(const float balance)
484 {
485     HILOG_INFO("balance = [%{public}f]", balance);
486 #ifdef OHOS_BUILD_ENABLE_HITRACE
487     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetAudioBalance:" + std::to_string(balance));
488 #endif // OHOS_BUILD_ENABLE_HITRACE
489 
490     if (!handler_) {
491         HILOG_ERROR("handler_ is nullptr.");
492         return RET_ERR_NULLPTR;
493     }
494 
495     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
496     if (syncPromise == nullptr) {
497         HILOG_ERROR("syncPromise is nullptr.");
498         return RET_ERR_NULLPTR;
499     }
500     ffrt::future syncFuture = syncPromise->get_future();
501     handler_->PostTask([this, syncPromise, balance]() {
502         sptr<AccessibilityAccountData> accountData =
503             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
504         if (!accountData) {
505             HILOG_ERROR("accountData is nullptr.");
506             syncPromise->set_value(RET_ERR_NULLPTR);
507             return;
508         }
509         RetError ret = accountData->GetConfig()->SetAudioBalance(balance);
510         syncPromise->set_value(ret);
511         UpdateAudioBalance();
512         }, "TASK_SET_AUDIO_BALANCE");
513 
514     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
515     if (wait != ffrt::future_status::ready) {
516         HILOG_ERROR("SetAudioBalance Failed to wait result");
517         return RET_ERR_TIME_OUT;
518     }
519     return syncFuture.get();
520 }
521 
SetClickResponseTime(const uint32_t time)522 RetError AccessibilitySettings::SetClickResponseTime(const uint32_t time)
523 {
524     HILOG_INFO("click response time = [%{public}u]", time);
525 #ifdef OHOS_BUILD_ENABLE_HITRACE
526     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetClickResponseTime:" + std::to_string(time));
527 #endif // OHOS_BUILD_ENABLE_HITRACE
528 
529     if (!handler_) {
530         HILOG_ERROR("handler_ is nullptr.");
531         return RET_ERR_NULLPTR;
532     }
533 
534     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
535     if (syncPromise == nullptr) {
536         HILOG_ERROR("syncPromise is nullptr.");
537         return RET_ERR_NULLPTR;
538     }
539     ffrt::future syncFuture = syncPromise->get_future();
540     handler_->PostTask([this, syncPromise, time]() {
541         sptr<AccessibilityAccountData> accountData =
542             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
543         if (!accountData) {
544             HILOG_ERROR("accountData is nullptr.");
545             syncPromise->set_value(RET_ERR_NULLPTR);
546             return;
547         }
548         RetError ret = accountData->GetConfig()->SetClickResponseTime(time);
549         syncPromise->set_value(ret);
550         UpdateClickResponseTime();
551         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
552         }, "TASK_SET_CLICK_RESPONSE_TIME");
553 
554     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
555     if (wait != ffrt::future_status::ready) {
556         HILOG_ERROR("SetClickResponseTime Failed to wait result");
557         return RET_ERR_TIME_OUT;
558     }
559     return syncFuture.get();
560 }
561 
SetIgnoreRepeatClickState(const bool state)562 RetError AccessibilitySettings::SetIgnoreRepeatClickState(const bool state)
563 {
564     HILOG_INFO("ignore repeat click state = [%{public}s]", state ? "True" : "False");
565 #ifdef OHOS_BUILD_ENABLE_HITRACE
566     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetIgnoreRepeatClickState:" + std::to_string(state));
567 #endif // OHOS_BUILD_ENABLE_HITRACE
568 
569     if (!handler_) {
570         HILOG_ERROR("handler_ is nullptr.");
571         return RET_ERR_NULLPTR;
572     }
573 
574     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
575     if (syncPromise == nullptr) {
576         HILOG_ERROR("syncPromise is nullptr.");
577         return RET_ERR_NULLPTR;
578     }
579     ffrt::future syncFuture = syncPromise->get_future();
580     handler_->PostTask([this, syncPromise, state]() {
581         sptr<AccessibilityAccountData> accountData =
582             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
583         if (!accountData) {
584             HILOG_ERROR("accountData is nullptr.");
585             syncPromise->set_value(RET_ERR_NULLPTR);
586             return;
587         }
588         RetError ret = accountData->GetConfig()->SetIgnoreRepeatClickState(state);
589         syncPromise->set_value(ret);
590         UpdateConfigState();
591         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
592         }, "TASK_SET_IGNORE_REPEAT_CLICK_STATE");
593 
594     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
595     if (wait != ffrt::future_status::ready) {
596         HILOG_ERROR("SetIgnoreRepeatClickState Failed to wait result");
597         return RET_ERR_TIME_OUT;
598     }
599     RetError ret = syncFuture.get();
600     if (ret == RET_OK) {
601         if (state) {
602             IgnoreRepeatClickNotification::PublishIgnoreRepeatClickReminder();
603         } else {
604             IgnoreRepeatClickNotification::DestoryTimers();
605         }
606     }
607     return ret;
608 }
609 
SetIgnoreRepeatClickTime(const uint32_t time)610 RetError AccessibilitySettings::SetIgnoreRepeatClickTime(const uint32_t time)
611 {
612     HILOG_INFO("click response time = [%{public}u]", time);
613 #ifdef OHOS_BUILD_ENABLE_HITRACE
614     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "SetIgnoreRepeatClickTime:" + std::to_string(time));
615 #endif // OHOS_BUILD_ENABLE_HITRACE
616 
617     if (!handler_) {
618         HILOG_ERROR("handler_ is nullptr.");
619         return RET_ERR_NULLPTR;
620     }
621 
622     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
623     if (syncPromise == nullptr) {
624         HILOG_ERROR("syncPromise is nullptr.");
625         return RET_ERR_NULLPTR;
626     }
627     ffrt::future syncFuture = syncPromise->get_future();
628     handler_->PostTask([this, syncPromise, time]() {
629         sptr<AccessibilityAccountData> accountData =
630             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
631         if (!accountData) {
632             HILOG_ERROR("accountData is nullptr.");
633             syncPromise->set_value(RET_ERR_NULLPTR);
634             return;
635         }
636         RetError ret = accountData->GetConfig()->SetIgnoreRepeatClickTime(time);
637         syncPromise->set_value(ret);
638         UpdateIgnoreRepeatClickTime();
639         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
640         }, "TASK_SET_IGNORE_REPEAT_CLICK_TIME");
641 
642     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
643     if (wait != ffrt::future_status::ready) {
644         HILOG_ERROR("SetIgnoreRepeatClickTime Failed to wait result");
645         return RET_ERR_TIME_OUT;
646     }
647     return syncFuture.get();
648 }
649 
UpdateSettingsInAtoHosStatePart(ConfigValueAtoHosUpdate & atoHosValue)650 void AccessibilitySettings::UpdateSettingsInAtoHosStatePart(ConfigValueAtoHosUpdate &atoHosValue)
651 {
652     sptr<AccessibilityAccountData> accountData =
653         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
654     // set
655     if (atoHosValue.daltonizationState) {
656         accountData->GetConfig()->SetDaltonizationState(atoHosValue.daltonizationState);
657     }
658     if (atoHosValue.invertColor) {
659         accountData->GetConfig()->SetInvertColorState(atoHosValue.invertColor);
660     }
661     if (atoHosValue.audioMono) {
662         accountData->GetConfig()->SetAudioMonoState(atoHosValue.audioMono);
663     }
664     if (atoHosValue.highContrastText) {
665         accountData->GetConfig()->SetHighContrastTextState(atoHosValue.highContrastText);
666     }
667     if (atoHosValue.ignoreRepeatClickState) {
668         accountData->GetConfig()->SetIgnoreRepeatClickState(atoHosValue.ignoreRepeatClickState);
669         accountData->GetConfig()->SetIgnoreRepeatClickReconfirm(true);
670     }
671     if (atoHosValue.shortcutEnabled) {
672         accountData->GetConfig()->SetShortKeyState(atoHosValue.shortcutEnabled);
673     }
674     bool shortKeyOnLockScreenAutoOn = false;
675     if (atoHosValue.shortcutTimeout == 1) {
676         accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
677         if (atoHosValue.shortcutOnLockScreen == INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE) {
678             shortKeyOnLockScreenAutoOn = true;
679             accountData->GetConfig()->SetShortKeyOnLockScreenState(true);
680         }
681     } else if (atoHosValue.shortcutTimeout == 0) {
682         accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_BEFORE_USE);
683     }
684     if (atoHosValue.shortcutOnLockScreen != INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE) {
685         accountData->GetConfig()->SetShortKeyOnLockScreenState(atoHosValue.shortcutOnLockScreen == 1);
686     } else if (!shortKeyOnLockScreenAutoOn) {
687         accountData->GetConfig()->SetShortKeyOnLockScreenState(atoHosValue.shortcutEnabledOnLockScreen);
688     }
689     if (atoHosValue.screenMagnificationState) {
690         accountData->GetConfig()->SetScreenMagnificationState(atoHosValue.screenMagnificationState);
691         accountData->GetConfig()->SetZoomGestureEnabledReconfirm(true);
692     }
693     UpdateConfigState();
694 }
695 
UpdateSettingsInAtoHos()696 void AccessibilitySettings::UpdateSettingsInAtoHos()
697 {
698     sptr<AccessibilityAccountData> accountData =
699         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
700     ConfigValueAtoHosUpdate atoHosValue;
701     accountData->GetConfigValueAtoHos(atoHosValue);
702 
703     HILOG_INFO("daltonizationState(%{public}d), invertColor(%{public}d), \
704         audioMono(%{public}d), audioBalance(%{public}f), highContrastText(%{public}d), \
705         isScreenReaderEnabled(%{public}d), ignoreRepeatClickState(%{public}d), \
706         clickResponseTime(%{public}d), ignoreRepeatClickTime(%{public}d), displayDaltonizer(%{public}d), \
707         shortcutEnabled(%{public}d), shortcutEnabledOnLockScreen(%{public}d), shortcutTimeout(%{public}d), \
708         screenMagnificationState(%{public}d).",
709         atoHosValue.daltonizationState, atoHosValue.invertColor, atoHosValue.audioMono, atoHosValue.audioBalance,
710         atoHosValue.highContrastText, atoHosValue.isScreenReaderEnabled, atoHosValue.ignoreRepeatClickState,
711         atoHosValue.clickResponseTime, atoHosValue.ignoreRepeatClickTime, atoHosValue.displayDaltonizer,
712         atoHosValue.shortcutEnabled, atoHosValue.shortcutEnabledOnLockScreen, atoHosValue.shortcutTimeout,
713         atoHosValue.screenMagnificationState);
714 
715     UpdateSettingsInAtoHosStatePart(atoHosValue);
716 
717     if (atoHosValue.audioBalance != 0.0) {
718         accountData->GetConfig()->SetAudioBalance(atoHosValue.audioBalance);
719         UpdateAudioBalance();
720     }
721     if (atoHosValue.clickResponseTime != 0) {
722         accountData->GetConfig()->SetClickResponseTime(static_cast<uint32_t>(atoHosValue.clickResponseTime));
723         UpdateClickResponseTime();
724     }
725     if (atoHosValue.ignoreRepeatClickTime != 0) {
726         accountData->GetConfig()->SetIgnoreRepeatClickTime(static_cast<uint32_t>(atoHosValue.ignoreRepeatClickTime));
727         UpdateIgnoreRepeatClickTime();
728     }
729     if (atoHosValue.displayDaltonizer != 0) {
730         accountData->GetConfig()->SetDaltonizationColorFilter(static_cast<uint32_t>(atoHosValue.displayDaltonizer));
731         UpdateDaltonizationColorFilter();
732     }
733 
734     if (atoHosValue.isScreenReaderEnabled) {
735         uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
736             CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
737         accountData->EnableAbility(SCREEN_READER_BUNDLE_ABILITY_NAME, capabilities);
738     }
739     accountData->GetConfig()->CloneShortkeyService(atoHosValue.isScreenReaderEnabled);
740     accountData->GetConfig()->SetDefaultShortcutKeyService();
741 
742     accountData->GetConfig()->SetStartToHosState(false);
743 }
744 
GetScreenMagnificationState(bool & state)745 RetError AccessibilitySettings::GetScreenMagnificationState(bool &state)
746 {
747     HILOG_DEBUG();
748     if (!handler_) {
749         HILOG_ERROR("handler_ is nullptr.");
750         return RET_ERR_NULLPTR;
751     }
752 
753     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
754     if (syncPromise == nullptr) {
755         HILOG_ERROR("syncPromise is nullptr.");
756         return RET_ERR_NULLPTR;
757     }
758 
759     ffrt::future syncFuture = syncPromise->get_future();
760     auto tmpState = std::make_shared<bool>(state);
761     handler_->PostTask([this, syncPromise, tmpState]() {
762         HILOG_DEBUG();
763         sptr<AccessibilityAccountData> accountData =
764             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
765         if (!accountData) {
766             HILOG_ERROR("accountData is nullptr");
767             syncPromise->set_value(RET_ERR_NULLPTR);
768             return;
769         }
770         *tmpState = accountData->GetConfig()->GetScreenMagnificationState();
771         syncPromise->set_value(RET_OK);
772         }, "TASK_GET_SCREENMAGNIFIER_STATE");
773 
774     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
775     if (wait != ffrt::future_status::ready) {
776         HILOG_ERROR("GetScreenMagnificationState Failed to wait result");
777         return RET_ERR_TIME_OUT;
778     }
779     state = *tmpState;
780     return syncFuture.get();
781 }
782 
GetShortKeyState(bool & state)783 RetError AccessibilitySettings::GetShortKeyState(bool &state)
784 {
785     HILOG_DEBUG();
786     if (!handler_) {
787         HILOG_ERROR("handler_ is nullptr.");
788         return RET_ERR_NULLPTR;
789     }
790 
791     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
792     if (syncPromise == nullptr) {
793         HILOG_ERROR("syncPromise is nullptr.");
794         return RET_ERR_NULLPTR;
795     }
796     ffrt::future syncFuture = syncPromise->get_future();
797     auto tmpState = std::make_shared<bool>(state);
798     handler_->PostTask([this, syncPromise, tmpState]() {
799         HILOG_DEBUG();
800         sptr<AccessibilityAccountData> accountData =
801             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
802         if (!accountData) {
803             HILOG_ERROR("accountData is nullptr");
804             syncPromise->set_value(RET_ERR_NULLPTR);
805             return;
806         }
807         *tmpState = accountData->GetConfig()->GetShortKeyState();
808         syncPromise->set_value(RET_OK);
809         }, "TASK_GET_SHORTKEY_STATE");
810 
811     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
812     if (wait != ffrt::future_status::ready) {
813         HILOG_ERROR("GetShortKeyState Failed to wait result");
814         return RET_ERR_TIME_OUT;
815     }
816     state = *tmpState;
817     return syncFuture.get();
818 }
819 
GetMouseKeyState(bool & state)820 RetError AccessibilitySettings::GetMouseKeyState(bool &state)
821 {
822     HILOG_DEBUG();
823     if (!handler_) {
824         HILOG_ERROR("handler_ is nullptr.");
825         return RET_ERR_NULLPTR;
826     }
827 
828     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
829     if (syncPromise == nullptr) {
830         HILOG_ERROR("syncPromise is nullptr.");
831         return RET_ERR_NULLPTR;
832     }
833     ffrt::future syncFuture = syncPromise->get_future();
834     auto tmpState = std::make_shared<bool>(state);
835     handler_->PostTask([this, syncPromise, tmpState]() {
836         HILOG_DEBUG();
837         sptr<AccessibilityAccountData> accountData =
838             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
839         if (!accountData) {
840             HILOG_ERROR("accountData is nullptr");
841             syncPromise->set_value(RET_ERR_NULLPTR);
842             return;
843         }
844         *tmpState = accountData->GetConfig()->GetMouseKeyState();
845         syncPromise->set_value(RET_OK);
846         }, "TASK_GET_MOUSEKEY_STATE");
847 
848     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
849     if (wait != ffrt::future_status::ready) {
850         HILOG_ERROR("GetMouseKeyState Failed to wait result");
851         return RET_ERR_TIME_OUT;
852     }
853     state = *tmpState;
854     return syncFuture.get();
855 }
856 
GetMouseAutoClick(int32_t & time)857 RetError AccessibilitySettings::GetMouseAutoClick(int32_t &time)
858 {
859     HILOG_DEBUG();
860     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
861     if (syncPromise == nullptr) {
862         HILOG_ERROR("syncPromise is nullptr.");
863         return RET_ERR_NULLPTR;
864     }
865     ffrt::future syncFuture = syncPromise->get_future();
866     auto tmpTime = std::make_shared<int32_t>(time);
867     handler_->PostTask([this, syncPromise, tmpTime]() {
868         HILOG_DEBUG();
869         sptr<AccessibilityAccountData> accountData =
870             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
871         if (!accountData) {
872             HILOG_ERROR("accountData is nullptr");
873             syncPromise->set_value(RET_ERR_NULLPTR);
874             return;
875         }
876         *tmpTime = accountData->GetConfig()->GetMouseAutoClick();
877         syncPromise->set_value(RET_OK);
878         }, "TASK_GET_MOUSE_AUTOCLICK");
879 
880     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
881     if (wait != ffrt::future_status::ready) {
882         HILOG_ERROR("GetMouseAutoClick Failed to wait result");
883         return RET_ERR_TIME_OUT;
884     }
885     time = *tmpTime;
886     return syncFuture.get();
887 }
888 
GetShortkeyTarget(std::string & name)889 RetError AccessibilitySettings::GetShortkeyTarget(std::string &name)
890 {
891     HILOG_DEBUG();
892     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
893     if (syncPromise == nullptr) {
894         HILOG_ERROR("syncPromise is nullptr.");
895         return RET_ERR_NULLPTR;
896     }
897     ffrt::future syncFuture = syncPromise->get_future();
898     auto tmpName = std::make_shared<std::string>(name);
899     handler_->PostTask([this, syncPromise, tmpName]() {
900         HILOG_DEBUG();
901         sptr<AccessibilityAccountData> accountData =
902             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
903         if (!accountData) {
904             HILOG_ERROR("accountData is nullptr");
905             syncPromise->set_value(RET_ERR_NULLPTR);
906             return;
907         }
908         *tmpName = accountData->GetConfig()->GetShortkeyTarget();
909         syncPromise->set_value(RET_OK);
910         }, "TASK_GET_SHORTKEY_TARGET");
911 
912     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
913     if (wait != ffrt::future_status::ready) {
914         HILOG_ERROR("GetShortkeyTarget Failed to wait result");
915         return RET_ERR_TIME_OUT;
916     }
917     name = *tmpName;
918     return syncFuture.get();
919 }
920 
GetShortkeyMultiTarget(std::vector<std::string> & name)921 RetError AccessibilitySettings::GetShortkeyMultiTarget(std::vector<std::string> &name)
922 {
923     HILOG_DEBUG();
924     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
925     if (syncPromise == nullptr) {
926         HILOG_ERROR("syncPromise is nullptr.");
927         return RET_ERR_NULLPTR;
928     }
929     ffrt::future syncFuture = syncPromise->get_future();
930     auto tmpName = std::make_shared<std::vector<std::string>>(name);
931     handler_->PostTask([this, syncPromise, tmpName]() {
932         HILOG_DEBUG();
933         sptr<AccessibilityAccountData> accountData =
934             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
935         if (!accountData) {
936             HILOG_ERROR("accountData is nullptr");
937             syncPromise->set_value(RET_ERR_NULLPTR);
938             return;
939         }
940         *tmpName = accountData->GetConfig()->GetShortkeyMultiTarget();
941         syncPromise->set_value(RET_OK);
942         }, "TASK_GET_SHORTKEY_MULTI_TARGET");
943 
944     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
945     if (wait != ffrt::future_status::ready) {
946         HILOG_ERROR("GetShortkeyMultiTarget Failed to wait result");
947         return RET_ERR_TIME_OUT;
948     }
949     name = *tmpName;
950     return syncFuture.get();
951 }
952 
GetHighContrastTextState(bool & state)953 RetError AccessibilitySettings::GetHighContrastTextState(bool &state)
954 {
955     HILOG_DEBUG();
956     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
957     if (syncPromise == nullptr) {
958         HILOG_ERROR("syncPromise is nullptr.");
959         return RET_ERR_NULLPTR;
960     }
961     ffrt::future syncFuture = syncPromise->get_future();
962     auto tmpState = std::make_shared<bool>(state);
963     handler_->PostTask([this, syncPromise, tmpState]() {
964         HILOG_DEBUG();
965         sptr<AccessibilityAccountData> accountData =
966             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
967         if (!accountData) {
968             HILOG_ERROR("accountData is nullptr");
969             syncPromise->set_value(RET_ERR_NULLPTR);
970             return;
971         }
972         *tmpState = accountData->GetConfig()->GetHighContrastTextState();
973         syncPromise->set_value(RET_OK);
974         }, "TASK_GET_HIGHCONTRASTTEXT_STATE");
975 
976     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
977     if (wait != ffrt::future_status::ready) {
978         HILOG_ERROR("GetHighContrastTextState Failed to wait result");
979         return RET_ERR_TIME_OUT;
980     }
981     state = *tmpState;
982     return syncFuture.get();
983 }
984 
GetDaltonizationState(bool & state)985 RetError AccessibilitySettings::GetDaltonizationState(bool &state)
986 {
987     HILOG_DEBUG();
988     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
989     if (syncPromise == nullptr) {
990         HILOG_ERROR("syncPromise is nullptr.");
991         return RET_ERR_NULLPTR;
992     }
993     ffrt::future syncFuture = syncPromise->get_future();
994     auto tmpState = std::make_shared<bool>(state);
995     handler_->PostTask([this, syncPromise, tmpState]() {
996         HILOG_DEBUG();
997         sptr<AccessibilityAccountData> accountData =
998             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
999         if (!accountData) {
1000             HILOG_ERROR("accountData is nullptr");
1001             syncPromise->set_value(RET_ERR_NULLPTR);
1002             return;
1003         }
1004         *tmpState = accountData->GetConfig()->GetDaltonizationState();
1005         syncPromise->set_value(RET_OK);
1006         }, "TASK_GET_DALTONIZATIONSTATE_STATE");
1007 
1008     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1009     if (wait != ffrt::future_status::ready) {
1010         HILOG_ERROR("GetDaltonizationState Failed to wait result");
1011         return RET_ERR_TIME_OUT;
1012     }
1013     state = *tmpState;
1014     return syncFuture.get();
1015 }
1016 
GetInvertColorState(bool & state)1017 RetError AccessibilitySettings::GetInvertColorState(bool &state)
1018 {
1019     HILOG_DEBUG();
1020 
1021     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1022     if (syncPromise == nullptr) {
1023         HILOG_ERROR("syncPromise is nullptr.");
1024         return RET_ERR_NULLPTR;
1025     }
1026     ffrt::future syncFuture = syncPromise->get_future();
1027     auto tmpState = std::make_shared<bool>(state);
1028     handler_->PostTask([this, syncPromise, tmpState]() {
1029         HILOG_DEBUG();
1030         sptr<AccessibilityAccountData> accountData =
1031             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1032         if (!accountData) {
1033             HILOG_ERROR("accountData is nullptr");
1034             syncPromise->set_value(RET_ERR_NULLPTR);
1035             return;
1036         }
1037         *tmpState = accountData->GetConfig()->GetInvertColorState();
1038         syncPromise->set_value(RET_OK);
1039         }, "TASK_GET_INVERTCOLOR_STATE");
1040 
1041     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1042     if (wait != ffrt::future_status::ready) {
1043         HILOG_ERROR("GetInvertColorState Failed to wait result");
1044         return RET_ERR_TIME_OUT;
1045     }
1046     state = *tmpState;
1047     return syncFuture.get();
1048 }
1049 
GetAnimationOffState(bool & state)1050 RetError AccessibilitySettings::GetAnimationOffState(bool &state)
1051 {
1052     HILOG_DEBUG();
1053     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1054     if (syncPromise == nullptr) {
1055         HILOG_ERROR("syncPromise is nullptr.");
1056         return RET_ERR_NULLPTR;
1057     }
1058     ffrt::future syncFuture = syncPromise->get_future();
1059     auto tmpState = std::make_shared<bool>(state);
1060     handler_->PostTask([this, syncPromise, tmpState]() {
1061         HILOG_DEBUG();
1062         sptr<AccessibilityAccountData> accountData =
1063             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1064         if (!accountData) {
1065             HILOG_ERROR("accountData is nullptr");
1066             syncPromise->set_value(RET_ERR_NULLPTR);
1067             return;
1068         }
1069         *tmpState = accountData->GetConfig()->GetAnimationOffState();
1070         syncPromise->set_value(RET_OK);
1071         }, "TASK_GET_ANIMATIONOFF_STATE");
1072 
1073     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1074     if (wait != ffrt::future_status::ready) {
1075         HILOG_ERROR("GetAnimationOffState Failed to wait result");
1076         return RET_ERR_TIME_OUT;
1077     }
1078     state = *tmpState;
1079     return syncFuture.get();
1080 }
1081 
GetAudioMonoState(bool & state)1082 RetError AccessibilitySettings::GetAudioMonoState(bool &state)
1083 {
1084     HILOG_DEBUG();
1085     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1086     if (syncPromise == nullptr) {
1087         HILOG_ERROR("syncPromise is nullptr.");
1088         return RET_ERR_NULLPTR;
1089     }
1090     ffrt::future syncFuture = syncPromise->get_future();
1091     auto tmpState = std::make_shared<bool>(state);
1092     handler_->PostTask([this, syncPromise, tmpState]() {
1093         HILOG_DEBUG();
1094         sptr<AccessibilityAccountData> accountData =
1095             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1096         if (!accountData) {
1097             HILOG_ERROR("accountData is nullptr");
1098             syncPromise->set_value(RET_ERR_NULLPTR);
1099             return;
1100         }
1101         *tmpState = accountData->GetConfig()->GetAudioMonoState();
1102         syncPromise->set_value(RET_OK);
1103         }, "TASK_GET_AUDIOMONO_STATE");
1104 
1105     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1106     if (wait != ffrt::future_status::ready) {
1107         HILOG_ERROR("GetAudioMonoState Failed to wait result");
1108         return RET_ERR_TIME_OUT;
1109     }
1110     state = *tmpState;
1111     return syncFuture.get();
1112 }
1113 
GetDaltonizationColorFilter(uint32_t & type)1114 RetError AccessibilitySettings::GetDaltonizationColorFilter(uint32_t &type)
1115 {
1116     HILOG_DEBUG();
1117 
1118     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1119     if (syncPromise == nullptr) {
1120         HILOG_ERROR("syncPromise is nullptr.");
1121         return RET_ERR_NULLPTR;
1122     }
1123     ffrt::future syncFuture = syncPromise->get_future();
1124     auto tmpType = std::make_shared<uint32_t>(type);
1125     handler_->PostTask([this, syncPromise, tmpType]() {
1126         HILOG_DEBUG();
1127         sptr<AccessibilityAccountData> accountData =
1128             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1129         if (!accountData) {
1130             HILOG_ERROR("accountData is nullptr");
1131             syncPromise->set_value(RET_ERR_NULLPTR);
1132             return;
1133         }
1134         *tmpType = accountData->GetConfig()->GetDaltonizationColorFilter();
1135         syncPromise->set_value(RET_OK);
1136         }, "TASK_GET_DALTONIZATION_COLORFILTER");
1137 
1138     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1139     if (wait != ffrt::future_status::ready) {
1140         HILOG_ERROR("GetDaltonizationColorFilter Failed to wait result");
1141         return RET_ERR_TIME_OUT;
1142     }
1143     type = *tmpType;
1144     return syncFuture.get();
1145 }
1146 
GetContentTimeout(uint32_t & timer)1147 RetError AccessibilitySettings::GetContentTimeout(uint32_t &timer)
1148 {
1149     HILOG_DEBUG();
1150     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1151     if (syncPromise == nullptr) {
1152         HILOG_ERROR("syncPromise is nullptr.");
1153         return RET_ERR_NULLPTR;
1154     }
1155     ffrt::future syncFuture = syncPromise->get_future();
1156     auto tmpTimer = std::make_shared<uint32_t>(timer);
1157     handler_->PostTask([this, syncPromise, tmpTimer]() {
1158         HILOG_DEBUG();
1159         sptr<AccessibilityAccountData> accountData =
1160             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1161         if (!accountData) {
1162             HILOG_ERROR("accountData is nullptr");
1163             syncPromise->set_value(RET_ERR_NULLPTR);
1164             return;
1165         }
1166         *tmpTimer = accountData->GetConfig()->GetContentTimeout();
1167         syncPromise->set_value(RET_OK);
1168         }, "TASK_GET_CONTENT_TIMEOUT");
1169 
1170     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1171     if (wait != ffrt::future_status::ready) {
1172         HILOG_ERROR("GetContentTimeout Failed to wait result");
1173         return RET_ERR_TIME_OUT;
1174     }
1175     timer = *tmpTimer;
1176     return syncFuture.get();
1177 }
1178 
GetBrightnessDiscount(float & brightness)1179 RetError AccessibilitySettings::GetBrightnessDiscount(float &brightness)
1180 {
1181     HILOG_DEBUG();
1182     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1183     if (syncPromise == nullptr) {
1184         HILOG_ERROR("syncPromise is nullptr.");
1185         return RET_ERR_NULLPTR;
1186     }
1187     ffrt::future syncFuture = syncPromise->get_future();
1188     auto tmpBrightness = std::make_shared<float>(brightness);
1189     handler_->PostTask([this, syncPromise, tmpBrightness]() {
1190         HILOG_DEBUG();
1191         sptr<AccessibilityAccountData> accountData =
1192             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1193         if (!accountData) {
1194             HILOG_ERROR("accountData is nullptr");
1195             syncPromise->set_value(RET_ERR_NULLPTR);
1196             return;
1197         }
1198         *tmpBrightness = accountData->GetConfig()->GetBrightnessDiscount();
1199         syncPromise->set_value(RET_OK);
1200         }, "TASK_GET_BRIGHTNESS_DISCOUNT");
1201 
1202     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1203     if (wait != ffrt::future_status::ready) {
1204         HILOG_ERROR("GetBrightnessDiscount Failed to wait result");
1205         return RET_ERR_TIME_OUT;
1206     }
1207     brightness = *tmpBrightness;
1208     return syncFuture.get();
1209 }
1210 
GetAudioBalance(float & balance)1211 RetError AccessibilitySettings::GetAudioBalance(float &balance)
1212 {
1213     HILOG_DEBUG();
1214     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1215     if (syncPromise == nullptr) {
1216         HILOG_ERROR("syncPromise is nullptr.");
1217         return RET_ERR_NULLPTR;
1218     }
1219     ffrt::future syncFuture = syncPromise->get_future();
1220     auto tmpBalance = std::make_shared<float>(balance);
1221     handler_->PostTask([this, syncPromise, tmpBalance]() {
1222         HILOG_DEBUG();
1223         sptr<AccessibilityAccountData> accountData =
1224             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1225         if (!accountData) {
1226             HILOG_ERROR("accountData is nullptr");
1227             syncPromise->set_value(RET_ERR_NULLPTR);
1228             return;
1229         }
1230         *tmpBalance = accountData->GetConfig()->GetAudioBalance();
1231         syncPromise->set_value(RET_OK);
1232         }, "TASK_GET_AUDIO_BALANCE");
1233 
1234     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1235     if (wait != ffrt::future_status::ready) {
1236         HILOG_ERROR("GetAudioBalance Failed to wait result");
1237         return RET_ERR_TIME_OUT;
1238     }
1239     balance = *tmpBalance;
1240     return syncFuture.get();
1241 }
1242 
GetClickResponseTime(uint32_t & time)1243 RetError AccessibilitySettings::GetClickResponseTime(uint32_t &time)
1244 {
1245     HILOG_DEBUG();
1246     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1247     if (syncPromise == nullptr) {
1248         HILOG_ERROR("syncPromise is nullptr.");
1249         return RET_ERR_NULLPTR;
1250     }
1251     ffrt::future syncFuture = syncPromise->get_future();
1252     auto tmpTime = std::make_shared<uint32_t>(time);
1253     handler_->PostTask([this, syncPromise, tmpTime]() {
1254         HILOG_DEBUG();
1255         sptr<AccessibilityAccountData> accountData =
1256             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1257         if (!accountData) {
1258             HILOG_ERROR("accountData is nullptr");
1259             syncPromise->set_value(RET_ERR_NULLPTR);
1260             return;
1261         }
1262         *tmpTime = accountData->GetConfig()->GetClickResponseTime();
1263         syncPromise->set_value(RET_OK);
1264         }, "TASK_GET_CLICK_RESPONSE_TIME");
1265 
1266     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1267     if (wait != ffrt::future_status::ready) {
1268         HILOG_ERROR("GetClickResponseTime Failed to wait result");
1269         return RET_ERR_TIME_OUT;
1270     }
1271     time = *tmpTime;
1272     return syncFuture.get();
1273 }
1274 
GetIgnoreRepeatClickState(bool & state)1275 RetError AccessibilitySettings::GetIgnoreRepeatClickState(bool &state)
1276 {
1277     HILOG_DEBUG();
1278     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1279     if (syncPromise == nullptr) {
1280         HILOG_ERROR("syncPromise is nullptr.");
1281         return RET_ERR_NULLPTR;
1282     }
1283     ffrt::future syncFuture = syncPromise->get_future();
1284     auto tmpState = std::make_shared<bool>(state);
1285     handler_->PostTask([this, syncPromise, tmpState]() {
1286         HILOG_DEBUG();
1287         sptr<AccessibilityAccountData> accountData =
1288             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1289         if (!accountData) {
1290             HILOG_ERROR("accountData is nullptr");
1291             syncPromise->set_value(RET_ERR_NULLPTR);
1292             return;
1293         }
1294         *tmpState = accountData->GetConfig()->GetIgnoreRepeatClickState();
1295         syncPromise->set_value(RET_OK);
1296         }, "TASK_GET_IGNORE_REPEAT_CLICK_STATE");
1297 
1298     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1299     if (wait != ffrt::future_status::ready) {
1300         HILOG_ERROR("GetIgnoreRepeatClickState Failed to wait result");
1301         return RET_ERR_TIME_OUT;
1302     }
1303     state = *tmpState;
1304     return syncFuture.get();
1305 }
1306 
GetIgnoreRepeatClickTime(uint32_t & time)1307 RetError AccessibilitySettings::GetIgnoreRepeatClickTime(uint32_t &time)
1308 {
1309     HILOG_DEBUG();
1310     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1311     if (syncPromise == nullptr) {
1312         HILOG_ERROR("syncPromise is nullptr.");
1313         return RET_ERR_NULLPTR;
1314     }
1315     ffrt::future syncFuture = syncPromise->get_future();
1316     auto tmpTime = std::make_shared<uint32_t>(time);
1317     handler_->PostTask([this, syncPromise, tmpTime]() {
1318         HILOG_DEBUG();
1319         sptr<AccessibilityAccountData> accountData =
1320             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1321         if (!accountData) {
1322             HILOG_ERROR("accountData is nullptr");
1323             syncPromise->set_value(RET_ERR_NULLPTR);
1324             return;
1325         }
1326         *tmpTime = accountData->GetConfig()->GetIgnoreRepeatClickTime();
1327         syncPromise->set_value(RET_OK);
1328         }, "TASK_GET_IGNORE_REPEAT_CLICK_TIME");
1329 
1330     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1331     if (wait != ffrt::future_status::ready) {
1332         HILOG_ERROR("GetIgnoreRepeatClickTime Failed to wait result");
1333         return RET_ERR_TIME_OUT;
1334     }
1335     time = *tmpTime;
1336     return syncFuture.get();
1337 }
1338 
UpdateConfigState()1339 void AccessibilitySettings::UpdateConfigState()
1340 {
1341     handler_->PostTask([this]() {
1342         HILOG_INFO("UpdateConfigState.");
1343         sptr<AccessibilityAccountData> accountData =
1344             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1345         if (!accountData) {
1346             HILOG_ERROR("Account data is null");
1347             return;
1348         }
1349 
1350         uint32_t state = accountData->GetConfig()->GetConfigState();
1351         for (auto &callback : accountData->GetConfigCallbacks()) {
1352             if (callback) {
1353                 callback->OnConfigStateChanged(state);
1354             }
1355         }
1356         }, "UpdateConfigState");
1357 }
1358 
UpdateAudioBalance()1359 void AccessibilitySettings::UpdateAudioBalance()
1360 {
1361     handler_->PostTask([this]() {
1362         HILOG_INFO("UpdateAudioBalance.");
1363         sptr<AccessibilityAccountData> accountData =
1364             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1365         if (!accountData) {
1366             HILOG_ERROR("Account data is null");
1367             return;
1368         }
1369 
1370         float audioBalance = accountData->GetConfig()->GetAudioBalance();
1371         for (auto &callback : accountData->GetConfigCallbacks()) {
1372             if (callback) {
1373                 callback->OnAudioBalanceChanged(audioBalance);
1374             }
1375         }
1376         }, "UpdateAudioBalance");
1377 }
1378 
UpdateBrightnessDiscount()1379 void AccessibilitySettings::UpdateBrightnessDiscount()
1380 {
1381     handler_->PostTask([this]() {
1382         HILOG_INFO("UpdateBrightnessDiscount.");
1383         sptr<AccessibilityAccountData> accountData =
1384             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1385         if (!accountData) {
1386             HILOG_ERROR("Account data is null");
1387             return;
1388         }
1389 
1390         float brightnessDiscount = accountData->GetConfig()->GetBrightnessDiscount();
1391         for (auto &callback : accountData->GetConfigCallbacks()) {
1392             if (callback) {
1393                 callback->OnBrightnessDiscountChanged(brightnessDiscount);
1394             }
1395         }
1396         }, "UpdateBrightnessDiscount");
1397 }
1398 
UpdateContentTimeout()1399 void AccessibilitySettings::UpdateContentTimeout()
1400 {
1401     handler_->PostTask([this]() {
1402         HILOG_INFO("UpdateContentTimeout.");
1403         sptr<AccessibilityAccountData> accountData =
1404             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1405         if (!accountData) {
1406             HILOG_ERROR("Account data is null");
1407             return;
1408         }
1409 
1410         uint32_t contentTimeout = accountData->GetConfig()->GetContentTimeout();
1411         for (auto &callback : accountData->GetConfigCallbacks()) {
1412             if (callback) {
1413                 callback->OnContentTimeoutChanged(contentTimeout);
1414             }
1415         }
1416         }, "UpdateContentTimeout");
1417 }
1418 
UpdateDaltonizationColorFilter()1419 void AccessibilitySettings::UpdateDaltonizationColorFilter()
1420 {
1421     handler_->PostTask([this]() {
1422         HILOG_INFO("UpdateDaltonizationColorFilter.");
1423         sptr<AccessibilityAccountData> accountData =
1424             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1425         if (!accountData) {
1426             HILOG_ERROR("Account data is null");
1427             return;
1428         }
1429 
1430         uint32_t daltonizationColorFilter = accountData->GetConfig()->GetDaltonizationColorFilter();
1431         for (auto &callback : accountData->GetConfigCallbacks()) {
1432             if (callback) {
1433                 callback->OnDaltonizationColorFilterChanged(daltonizationColorFilter);
1434             }
1435         }
1436         }, "UpdateDaltonizationColorFilter");
1437 }
1438 
UpdateMouseAutoClick()1439 void AccessibilitySettings::UpdateMouseAutoClick()
1440 {
1441     handler_->PostTask([this]() {
1442         HILOG_INFO("UpdateMouseAutoClick.");
1443         sptr<AccessibilityAccountData> accountData =
1444             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1445         if (!accountData) {
1446             HILOG_ERROR("Account data is null");
1447             return;
1448         }
1449 
1450         int32_t mouseAutoClick = accountData->GetConfig()->GetMouseAutoClick();
1451         for (auto &callback : accountData->GetConfigCallbacks()) {
1452             if (callback) {
1453                 callback->OnMouseAutoClickChanged(mouseAutoClick);
1454             }
1455         }
1456         }, "UpdateMouseAutoClick");
1457 }
1458 
UpdateShortkeyTarget()1459 void AccessibilitySettings::UpdateShortkeyTarget()
1460 {
1461     handler_->PostTask([this]() {
1462         HILOG_INFO("UpdateShortkeyTarget.");
1463         sptr<AccessibilityAccountData> accountData =
1464             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1465         if (!accountData) {
1466             HILOG_ERROR("Account data is null");
1467             return;
1468         }
1469 
1470         std::string shortkeyTarget = accountData->GetConfig()->GetShortkeyTarget();
1471         for (auto &callback : accountData->GetConfigCallbacks()) {
1472             if (callback) {
1473                 callback->OnShortkeyTargetChanged(shortkeyTarget);
1474             }
1475         }
1476         }, "UpdateShortkeyTarget");
1477 }
1478 
UpdateShortkeyMultiTarget()1479 void AccessibilitySettings::UpdateShortkeyMultiTarget()
1480 {
1481     handler_->PostTask([this]() {
1482         HILOG_INFO("UpdateShortkeyMultiTarget.");
1483         sptr<AccessibilityAccountData> accountData =
1484             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1485         if (!accountData) {
1486             HILOG_ERROR("Account data is null");
1487             return;
1488         }
1489 
1490         std::vector<std::string> shortkeyMultiTarget = accountData->GetConfig()->GetShortkeyMultiTarget();
1491         for (auto &callback : accountData->GetConfigCallbacks()) {
1492             if (callback) {
1493                 callback->OnShortkeyMultiTargetChanged(shortkeyMultiTarget);
1494             }
1495         }
1496         }, "UpdateShortkeyMultiTarget");
1497 }
1498 
UpdateClickResponseTime()1499 void AccessibilitySettings::UpdateClickResponseTime()
1500 {
1501     handler_->PostTask([this]() {
1502         HILOG_INFO("UpdateClickResponseTime.");
1503         sptr<AccessibilityAccountData> accountData =
1504             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1505         if (!accountData) {
1506             HILOG_ERROR("Account data is null");
1507             return;
1508         }
1509 
1510         uint32_t time = accountData->GetConfig()->GetClickResponseTime();
1511         for (auto &callback : accountData->GetConfigCallbacks()) {
1512             if (callback) {
1513                 callback->OnClickResponseTimeChanged(time);
1514             }
1515         }
1516         }, "UpdateClickResponseTime");
1517 }
1518 
UpdateIgnoreRepeatClickTime()1519 void AccessibilitySettings::UpdateIgnoreRepeatClickTime()
1520 {
1521     handler_->PostTask([this]() {
1522         HILOG_INFO("UpdateIgnoreRepeatClickTime.");
1523         sptr<AccessibilityAccountData> accountData =
1524             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1525         if (!accountData) {
1526             HILOG_ERROR("Account data is null");
1527             return;
1528         }
1529 
1530         uint32_t time = accountData->GetConfig()->GetIgnoreRepeatClickTime();
1531         for (auto &callback : accountData->GetConfigCallbacks()) {
1532             if (callback) {
1533                 callback->OnIgnoreRepeatClickTimeChanged(time);
1534             }
1535         }
1536         }, "UpdateIgnoreRepeatClickTime");
1537 }
1538 
GetCaptionProperty(AccessibilityConfig::CaptionProperty & caption)1539 RetError AccessibilitySettings::GetCaptionProperty(AccessibilityConfig::CaptionProperty &caption)
1540 {
1541     HILOG_DEBUG();
1542     if (!handler_) {
1543         HILOG_ERROR("handler_ is nullptr.");
1544         return RET_ERR_NULLPTR;
1545     }
1546 
1547     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1548     if (syncPromise == nullptr) {
1549         HILOG_ERROR("syncPromise is nullptr.");
1550         return RET_ERR_NULLPTR;
1551     }
1552 
1553     ffrt::future syncFuture = syncPromise->get_future();
1554     auto tmpCaption = std::make_shared<AccessibilityConfig::CaptionProperty>(caption);
1555     handler_->PostTask([this, syncPromise, tmpCaption]() {
1556         HILOG_DEBUG();
1557         sptr<AccessibilityAccountData> accountData =
1558             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1559         if (!accountData) {
1560             HILOG_ERROR("accountData is nullptr.");
1561             syncPromise->set_value(RET_ERR_NULLPTR);
1562             return;
1563         }
1564         *tmpCaption = accountData->GetConfig()->GetCaptionProperty();
1565         syncPromise->set_value(RET_OK);
1566         }, "TASK_GET_CAPTION_PROPERTY");
1567 
1568     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1569     if (wait != ffrt::future_status::ready) {
1570         HILOG_ERROR("GetCaptionProperty Failed to wait result");
1571         return RET_ERR_TIME_OUT;
1572     }
1573     caption = *tmpCaption;
1574     return syncFuture.get();
1575 }
1576 
SetCaptionProperty(const AccessibilityConfig::CaptionProperty & caption)1577 RetError AccessibilitySettings::SetCaptionProperty(const AccessibilityConfig::CaptionProperty &caption)
1578 {
1579     HILOG_DEBUG();
1580     if (!handler_) {
1581         HILOG_ERROR("handler_ is nullptr.");
1582         return RET_ERR_NULLPTR;
1583     }
1584 
1585     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1586     if (syncPromise == nullptr) {
1587         HILOG_ERROR("syncPromise is nullptr.");
1588         return RET_ERR_NULLPTR;
1589     }
1590 
1591     ffrt::future syncFuture = syncPromise->get_future();
1592     handler_->PostTask([this, syncPromise, caption]() {
1593         HILOG_DEBUG();
1594         sptr<AccessibilityAccountData> accountData =
1595             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1596         if (!accountData) {
1597             HILOG_ERROR("accountData is nullptr.");
1598             syncPromise->set_value(RET_ERR_NULLPTR);
1599             return;
1600         }
1601         RetError ret = accountData->GetConfig()->SetCaptionProperty(caption);
1602         syncPromise->set_value(ret);
1603         UpdateCaptionProperty();
1604         }, "TASK_SET_CAPTION_PROPERTY");
1605 
1606     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1607     if (wait != ffrt::future_status::ready) {
1608         HILOG_ERROR("SetCaptionProperty Failed to wait result");
1609         return RET_ERR_TIME_OUT;
1610     }
1611     return syncFuture.get();
1612 }
1613 
SetCaptionState(const bool state)1614 RetError AccessibilitySettings::SetCaptionState(const bool state)
1615 {
1616     HILOG_DEBUG();
1617     sptr<AccessibilityAccountData> accountData =
1618         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1619     if (!accountData) {
1620         HILOG_ERROR("accountData is nullptr.");
1621         return RET_ERR_NULLPTR;
1622     }
1623     RetError ret = accountData->GetConfig()->SetCaptionState(state);
1624     UpdateConfigState();
1625     return ret;
1626 }
1627 
GetCaptionState(bool & state)1628 RetError AccessibilitySettings::GetCaptionState(bool &state)
1629 {
1630     HILOG_DEBUG();
1631     if (!handler_) {
1632         HILOG_ERROR("handler_ is nullptr.");
1633         return RET_ERR_NULLPTR;
1634     }
1635 
1636     auto syncPromise = std::make_shared<ffrt::promise<RetError>>();
1637     if (syncPromise == nullptr) {
1638         HILOG_ERROR("syncPromise is nullptr.");
1639         return RET_ERR_NULLPTR;
1640     }
1641 
1642     ffrt::future syncFuture = syncPromise->get_future();
1643     auto tmpState = std::make_shared<bool>(state);
1644     handler_->PostTask([this, syncPromise, tmpState]() {
1645         HILOG_DEBUG();
1646         sptr<AccessibilityAccountData> accountData =
1647             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1648         if (!accountData) {
1649             HILOG_ERROR("accountData is nullptr");
1650             syncPromise->set_value(RET_ERR_NULLPTR);
1651             return;
1652         }
1653         *tmpState = accountData->GetConfig()->GetCaptionState();
1654         syncPromise->set_value(RET_OK);
1655         }, "TASK_GET_CAPTION_STATE");
1656 
1657     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(DATASHARE_DEFAULT_TIMEOUT));
1658     if (wait != ffrt::future_status::ready) {
1659         HILOG_ERROR("GetCaptionState Failed to wait result");
1660         return RET_ERR_TIME_OUT;
1661     }
1662     state = *tmpState;
1663     return syncFuture.get();
1664 }
1665 
UpdateCaptionProperty()1666 void AccessibilitySettings::UpdateCaptionProperty()
1667 {
1668     handler_->PostTask([this]() {
1669         HILOG_DEBUG("UpdateCaptionProperty.");
1670         sptr<AccessibilityAccountData> accountData =
1671             Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1672         if (!accountData) {
1673             HILOG_ERROR("Account data is null");
1674             return;
1675         }
1676 
1677         AccessibilityConfig::CaptionProperty caption = accountData->GetConfig()->GetCaptionProperty();
1678         for (auto &callback : accountData->GetCaptionPropertyCallbacks()) {
1679             if (callback) {
1680                 callback->OnPropertyChanged(caption);
1681             }
1682         }
1683         }, "UpdateCaptionProperty");
1684 }
1685 
UpdateAllSetting()1686 void AccessibilitySettings::UpdateAllSetting()
1687 {
1688     HILOG_DEBUG();
1689     if (!handler_) {
1690         HILOG_ERROR("UpdateAllSetting: handler is nullptr!");
1691         return;
1692     }
1693     handler_->PostTask([this]() {
1694         UpdateConfigState();
1695         UpdateShortkeyTarget();
1696         UpdateShortkeyMultiTarget();
1697         UpdateMouseAutoClick();
1698         UpdateDaltonizationColorFilter();
1699         UpdateContentTimeout();
1700         UpdateBrightnessDiscount();
1701         UpdateAudioBalance();
1702         UpdateClickResponseTime();
1703         UpdateIgnoreRepeatClickTime();
1704         }, "UPDATE_ALL_SETTING");
1705 }
1706 } // namespace Accessibility
1707 } // namespace OHOS
1708