• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "accessibility_settings_config.h"
17 #include "hilog_wrapper.h"
18 #include "system_ability_definition.h"
19 #include "utils.h"
20 #include "accessibility_setting_provider.h"
21 #include "accessible_ability_manager_service.h"
22 
23 namespace OHOS {
24 namespace Accessibility {
25 namespace {
26     constexpr uint32_t DEFAULT_COLOR = 0xff000000;
27     const int32_t DEFAULT_SCALE = 100;
28     const int32_t SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
29     const int32_t SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
30     const int32_t DEFAULT_ACCOUNT_ID = 100;
31     const std::string ACCESSIBILITY = "accessibility";
32     const std::string TOUCH_GUIDE_STATE = "touch_guide_state";
33     const std::string GESTURE_KEY = "gesture_state";
34     const std::string CAPTION_KEY = "caption_state";
35     const std::string KEYEVENT_OBSERVER = "keyevent_observer";
36     const std::string SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
37     const std::string SCREEN_MAGNIFICATION_TYPE = "accessibility_magnification_capability";
38     const std::string MOUSEKEY = "mousekey";
39     const std::string HIGH_CONTRAST_TEXT_KEY = "high_text_contrast_enabled";
40     const std::string DALTONIZATION_STATE = "accessibility_display_daltonizer_enabled";
41     const std::string INVERT_COLOR_KEY = "accessibility_display_inversion_enabled";
42     const std::string ANIMATION_OFF_KEY = "animation_off";
43     const std::string AUDIO_MONO_KEY = "master_mono";
44     const std::string IGNORE_REPEAT_CLICK_SWITCH = "ignore_repeat_click_switch";
45     const std::string SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
46     const std::string SHORTCUT_SERVICE = "accessibility_shortcut_target_service";
47     const std::string CLICK_RESPONCE_TIME = "click_response_time";
48     const std::string IGNORE_REPEAT_CLICK_TIME = "ignore_repeat_click_time";
49     const std::string DALTONIZATION_COLOR_FILTER_KEY = "accessibility_display_daltonizer";
50     const std::string CONTENT_TIMEOUT_KEY = "accessibility_content_timeout";
51     const std::string BRIGHTNESS_DISCOUNT_KEY = "accessibility_brightness_discount";
52     const std::string AUDIO_BALANCE_KEY = "master_balance";
53     const std::string FONT_FAMILY = "accessibility_font_family";
54     const std::string FONT_COLOR = "accessibility_font_color";
55     const std::string FONT_EDGE_TYPE = "accessibility_font_edge_type";
56     const std::string BACKGROUND_COLOR = "accessibility_background_color";
57     const std::string WINDOW_COLOR = "accessibility_window_color";
58     const std::string FONT_SCALE = "accessibility_font_scale";
59     const std::string ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
60     const std::string SHORTCUT_ENABLED_ON_LOCK_SCREEN = "accessibility_shortcut_enabled_on_lock_screen";
61     const std::string SHORTCUT_TIMEOUT = "accessibility_shortcut_timeout";
62     const std::string ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
63     const std::string SCREENREADER_TAG = "screenreader";
64     const std::string INVERT_COLOR_AOS_TAG = "ColorInversion";
65     const std::string INVERT_COLOR_HMOS_TAG = "INVERT_COLOR";
66     const std::string AUDIO_MONO_HMOS_TAG = "AUDIO_MONO";
67     const std::string HIGH_CONTRAST_TEXT_HMOS_TAG = "HIGH_CONTRAST_TEXT";
68     const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.huawei.hmos.screenreader/AccessibilityExtAbility";
69     const std::string ACCESSIBILITY_SCREENREADER_ENABLED = "accessibility_screenreader_enabled";
70     const std::string ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE = "accessibility_privacy_clone_or_upgrade";
71     constexpr int DOUBLE_CLICK_RESPONSE_TIME_MEDIUM = 300;
72     constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORTEST = 100;
73     constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORT = 400;
74     constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_MEDIUM = 700;
75     constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG = 1000;
76     constexpr int DISPLAY_DALTONIZER_INVALID = -1;
77     constexpr int DISPLAY_DALTONIZER_GREEN = 12;
78     constexpr int DISPLAY_DALTONIZER_RED = 11;
79     constexpr int DISPLAY_DALTONIZER_BLUE = 13;
80     constexpr int INVALID_MASTER_MONO_VALUE = -1;
81     constexpr int AUDIO_BALANCE_STEP = 5;
82     constexpr float INVALID_MASTER_BALANCE_VALUE = 2.0;
83     constexpr float EPS = 1e-6;
84 } // namespace
AccessibilitySettingsConfig(int32_t id)85 AccessibilitySettingsConfig::AccessibilitySettingsConfig(int32_t id)
86 {
87     HILOG_DEBUG("id = [%{public}d]", id);
88     accountId_ = id;
89 }
90 
SetEnabled(const bool state)91 RetError AccessibilitySettingsConfig::SetEnabled(const bool state)
92 {
93     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
94     auto ret = SetConfigState(ACCESSIBILITY, state);
95     if (ret != RET_OK) {
96         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetEnabled");
97         HILOG_ERROR("set accessibility failed");
98         return ret;
99     }
100     enabled_ = state;
101     return ret;
102 }
103 
SetTouchGuideState(const bool state)104 RetError AccessibilitySettingsConfig::SetTouchGuideState(const bool state)
105 {
106     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
107     auto ret = SetConfigState(TOUCH_GUIDE_STATE, state);
108     if (ret != RET_OK) {
109         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetTouchGuideState");
110         HILOG_ERROR("set eventTouchGuideState_ failed");
111         return ret;
112     }
113     eventTouchGuideState_ = state;
114     return ret;
115 }
116 
SetGestureState(const bool state)117 RetError AccessibilitySettingsConfig::SetGestureState(const bool state)
118 {
119     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
120     auto ret = SetConfigState(GESTURE_KEY, state);
121     if (ret != RET_OK) {
122         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetGestureState");
123         HILOG_ERROR("set gesturesSimulation_ failed");
124         return ret;
125     }
126     gesturesSimulation_ = state;
127     return ret;
128 }
129 
SetKeyEventObserverState(const bool state)130 RetError AccessibilitySettingsConfig::SetKeyEventObserverState(const bool state)
131 {
132     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
133     auto ret = SetConfigState(KEYEVENT_OBSERVER, state);
134     if (ret != RET_OK) {
135         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetKeyEventObserverState");
136         HILOG_ERROR("set filteringKeyEvents_ failed");
137         return ret;
138     }
139     filteringKeyEvents_ = state;
140     return ret;
141 }
142 
SetCaptionState(const bool state)143 RetError AccessibilitySettingsConfig::SetCaptionState(const bool state)
144 {
145     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
146     auto ret = SetConfigState(CAPTION_KEY, state);
147     if (ret != RET_OK) {
148         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionState");
149         HILOG_ERROR("set isCaptionState_ failed");
150         return ret;
151     }
152     isCaptionState_ = state;
153     return ret;
154 }
155 
SetScreenMagnificationState(const bool state)156 RetError AccessibilitySettingsConfig::SetScreenMagnificationState(const bool state)
157 {
158     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
159     isScreenMagnificationState_ = state;
160     return RET_OK;
161 }
162 
SetScreenMagnificationType(const uint32_t type)163 RetError AccessibilitySettingsConfig::SetScreenMagnificationType(const uint32_t type)
164 {
165     HILOG_DEBUG("screenMagnificationType = [%{public}u]", type);
166     screenMagnificationType_ = type;
167     return RET_OK;
168 }
169 
SetShortKeyState(const bool state)170 RetError AccessibilitySettingsConfig::SetShortKeyState(const bool state)
171 {
172     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
173     auto ret = SetConfigState(SHORTCUT_ENABLED, state);
174     if (ret != RET_OK) {
175         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyState");
176         HILOG_ERROR("set isShortKeyState_ failed");
177         return ret;
178     }
179     isShortKeyState_ = state;
180     return ret;
181 }
182 
SetShortKeyOnLockScreenState(const bool state)183 RetError AccessibilitySettingsConfig::SetShortKeyOnLockScreenState(const bool state)
184 {
185     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
186     auto ret = SetConfigState(SHORTCUT_ENABLED_ON_LOCK_SCREEN, state);
187     if (ret != RET_OK) {
188         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyOnLockScreenState");
189         HILOG_ERROR("set isShortKeyEnabledOnLockScreen_ failed");
190         return ret;
191     }
192     isShortKeyEnabledOnLockScreen_ = state;
193     return ret;
194 }
195 
SetShortKeyTimeout(const int32_t time)196 RetError AccessibilitySettingsConfig::SetShortKeyTimeout(const int32_t time)
197 {
198     HILOG_DEBUG("time = [%{public}u]", time);
199     if (!datashare_) {
200         HILOG_ERROR("helper is nullptr");
201         return RET_ERR_NULLPTR;
202     }
203 
204     auto ret = datashare_->PutIntValue(SHORTCUT_TIMEOUT, static_cast<int32_t>(time));
205     if (ret != RET_OK) {
206         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyTimeout");
207         HILOG_ERROR("set shortKeyTimeout_ failed");
208         return ret;
209     }
210     shortKeyTimeout_ = time;
211     return ret;
212 }
213 
SetStartToHosState(const bool state)214 RetError AccessibilitySettingsConfig::SetStartToHosState(const bool state)
215 {
216     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
217     if (!datashare_) {
218         HILOG_ERROR("helper is nullptr");
219         return RET_ERR_NULLPTR;
220     }
221     auto ret = datashare_->PutBoolValue("AccessibilityStartFromAtoHos", state);
222     if (ret != RET_OK) {
223         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetStartToHosState");
224         HILOG_ERROR("set startToHosState failed");
225     }
226     return ret;
227 }
228 
SetMouseKeyState(const bool state)229 RetError AccessibilitySettingsConfig::SetMouseKeyState(const bool state)
230 {
231     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
232     auto ret = SetConfigState(MOUSEKEY, state);
233     if (ret != RET_OK) {
234         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetMouseKeyState");
235         HILOG_ERROR("set isMouseKeyState_ failed");
236         return ret;
237     }
238     isMouseKeyState_ = state;
239     return ret;
240 }
241 
SetMouseAutoClick(const int32_t time)242 RetError AccessibilitySettingsConfig::SetMouseAutoClick(const int32_t time)
243 {
244     HILOG_DEBUG("time = [%{public}d]", time);
245     if (!datashare_) {
246         HILOG_ERROR("helper is nullptr");
247         return RET_ERR_NULLPTR;
248     }
249 
250     auto ret = datashare_->PutIntValue("MouseAutoClick", time);
251     if (ret != RET_OK) {
252         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetMouseAutoClick");
253         HILOG_ERROR("set mouseAutoClick_ failed");
254         return ret;
255     }
256     mouseAutoClick_ = time;
257     return ret;
258 }
259 
SetShortkeyTarget(const std::string & name)260 RetError AccessibilitySettingsConfig::SetShortkeyTarget(const std::string &name)
261 {
262     HILOG_DEBUG("name = [%{public}s]", name.c_str());
263     if (!datashare_) {
264         HILOG_ERROR("helper is nullptr");
265         return RET_ERR_NULLPTR;
266     }
267 
268     auto ret = datashare_->PutStringValue("ShortkeyTarget", name);
269     if (ret != RET_OK) {
270         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyTarget");
271         HILOG_ERROR("set shortkeyTarget_ failed");
272         return ret;
273     }
274     shortkeyTarget_ = name;
275     return ret;
276 }
277 
SetShortkeyMultiTarget(const std::vector<std::string> & name)278 RetError AccessibilitySettingsConfig::SetShortkeyMultiTarget(const std::vector<std::string> &name)
279 {
280     HILOG_DEBUG();
281     std::set<std::string> targets;
282     std::copy_if(name.begin(), name.end(), std::inserter(targets, targets.end()),
283         [&targets](const std::string &target) {
284             if (targets.find(target) == targets.end()) {
285                 targets.insert(target);
286                 return true;
287             }
288             return false;
289         });
290     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
291     if (!datashare_) {
292         HILOG_ERROR("helper is nullptr");
293         return RET_ERR_NULLPTR;
294     }
295 
296     std::string stringOut = "";
297     Utils::VectorToString(std::vector<std::string>(targets.begin(), targets.end()), stringOut);
298     auto ret = datashare_->PutStringValue(SHORTCUT_SERVICE, stringOut);
299     if (ret != RET_OK) {
300         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyMultiTarget");
301         HILOG_ERROR("set shortkeyMultiTarget_ failed");
302         return ret;
303     }
304     shortkeyMultiTarget_ = std::vector<std::string>(targets.begin(), targets.end());
305     return ret;
306 }
307 
SetShortkeyMultiTargetInPkgRemove(const std::string & name)308 RetError AccessibilitySettingsConfig::SetShortkeyMultiTargetInPkgRemove(const std::string &name)
309 {
310     HILOG_DEBUG();
311     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
312     if (!datashare_) {
313         HILOG_ERROR("helper is nullptr");
314         return RET_ERR_NULLPTR;
315     }
316     RetError rtn = RET_OK;
317 
318     for (auto iter = shortkeyMultiTarget_.begin(); iter != shortkeyMultiTarget_.end(); ++iter) {
319         if (*iter == name) {
320             shortkeyMultiTarget_.erase(iter);
321             std::string stringOut = "";
322             Utils::VectorToString(shortkeyMultiTarget_, stringOut);
323             rtn = datashare_->PutStringValue(SHORTCUT_SERVICE, stringOut);
324             break;
325         }
326     }
327     if (rtn != RET_OK) {
328         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyMultiTargetInPkgRemove");
329         HILOG_ERROR("set shortkeyMultiTarget_ failed");
330         shortkeyMultiTarget_.push_back(name);
331     }
332     return rtn;
333 }
334 
SetHighContrastTextState(const bool state)335 RetError AccessibilitySettingsConfig::SetHighContrastTextState(const bool state)
336 {
337     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
338     auto ret = SetConfigState(HIGH_CONTRAST_TEXT_KEY, state);
339     if (ret != RET_OK) {
340         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetHighContrastTextState");
341         HILOG_ERROR("set highContrastTextState_ failed");
342         return ret;
343     }
344     highContrastTextState_ = state;
345     return ret;
346 }
347 
SetInvertColorState(const bool state)348 RetError AccessibilitySettingsConfig::SetInvertColorState(const bool state)
349 {
350     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
351     auto ret = SetConfigState(INVERT_COLOR_KEY, state);
352     if (ret != RET_OK) {
353         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetInvertColorState");
354         HILOG_ERROR("set invertColorState_ failed");
355         return ret;
356     }
357     invertColorState_ = state;
358     return ret;
359 }
360 
SetAnimationOffState(const bool state)361 RetError AccessibilitySettingsConfig::SetAnimationOffState(const bool state)
362 {
363     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
364     auto ret = SetConfigState(ANIMATION_OFF_KEY, state);
365     if (ret != RET_OK) {
366         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAnimationOffState");
367         HILOG_ERROR("set animationOffState_ failed");
368         return ret;
369     }
370     animationOffState_ = state;
371     return ret;
372 }
373 
SetAudioMonoState(const bool state)374 RetError AccessibilitySettingsConfig::SetAudioMonoState(const bool state)
375 {
376     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
377     auto ret = SetConfigState(AUDIO_MONO_KEY, state);
378     if (ret != RET_OK) {
379         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAudioMonoState");
380         HILOG_ERROR("set audioMonoState_ failed");
381         return ret;
382     }
383     audioMonoState_ = state;
384     return ret;
385 }
386 
SetDaltonizationState(const bool state)387 RetError AccessibilitySettingsConfig::SetDaltonizationState(const bool state)
388 {
389     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
390     auto ret = SetConfigState(DALTONIZATION_STATE, state);
391     if (ret != RET_OK) {
392         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetDaltonizationState");
393         HILOG_ERROR("set daltonizationState_ failed");
394         return ret;
395     }
396     daltonizationState_ = state;
397     return ret;
398 }
399 
SetDaltonizationColorFilter(const uint32_t filter)400 RetError AccessibilitySettingsConfig::SetDaltonizationColorFilter(const uint32_t filter)
401 {
402     HILOG_DEBUG("filter = [%{public}u]", filter);
403     if (!datashare_) {
404         HILOG_ERROR("helper is nullptr");
405         return RET_ERR_NULLPTR;
406     }
407 
408     uint32_t daltonizationColorFilter = filter;
409     if (filter == DISPLAY_DALTONIZER_GREEN) {
410         daltonizationColorFilter = AccessibilityConfig::Deuteranomaly;
411     } else if (filter == DISPLAY_DALTONIZER_RED) {
412         daltonizationColorFilter = AccessibilityConfig::Protanomaly;
413     } else if (filter == DISPLAY_DALTONIZER_BLUE) {
414         daltonizationColorFilter = AccessibilityConfig::Tritanomaly;
415     } else if (filter == static_cast<uint32_t>(DISPLAY_DALTONIZER_INVALID)) {
416         daltonizationColorFilter = 0;
417     }
418     auto ret = datashare_->PutIntValue(DALTONIZATION_COLOR_FILTER_KEY, static_cast<int32_t>(daltonizationColorFilter));
419     if (ret != RET_OK) {
420         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetDaltonizationColorFilter");
421         HILOG_ERROR("set daltonizationColorFilter_ failed");
422         return ret;
423     }
424     daltonizationColorFilter_ = daltonizationColorFilter;
425     return ret;
426 }
427 
428 
SetContentTimeout(const uint32_t time)429 RetError AccessibilitySettingsConfig::SetContentTimeout(const uint32_t time)
430 {
431     HILOG_DEBUG("time = [%{public}u]", time);
432     if (!datashare_) {
433         HILOG_ERROR("helper is nullptr");
434         return RET_ERR_NULLPTR;
435     }
436 
437     auto ret = datashare_->PutIntValue(CONTENT_TIMEOUT_KEY, static_cast<int32_t>(time));
438     if (ret != RET_OK) {
439         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetContentTimeout");
440         HILOG_ERROR("set contentTimeout_ failed");
441         return ret;
442     }
443     contentTimeout_ = time;
444     return ret;
445 }
446 
SetBrightnessDiscount(const float discount)447 RetError AccessibilitySettingsConfig::SetBrightnessDiscount(const float discount)
448 {
449     HILOG_DEBUG("discount = [%{public}f]", discount);
450     if (!datashare_) {
451         HILOG_ERROR("helper is nullptr");
452         return RET_ERR_NULLPTR;
453     }
454 
455     auto ret = datashare_->PutFloatValue(BRIGHTNESS_DISCOUNT_KEY, discount);
456     if (ret != RET_OK) {
457         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetBrightnessDiscount");
458         HILOG_ERROR("set brightnessDiscount_ failed");
459         return ret;
460     }
461     brightnessDiscount_ = discount;
462     return ret;
463 }
464 
SetAudioBalance(const float balance)465 RetError AccessibilitySettingsConfig::SetAudioBalance(const float balance)
466 {
467     HILOG_DEBUG("balance = [%{public}f]", balance);
468     if (!datashare_) {
469         HILOG_ERROR("helper is nullptr");
470         return RET_ERR_NULLPTR;
471     }
472 
473     float audioBalance = round(balance * AUDIO_BALANCE_STEP) / AUDIO_BALANCE_STEP;
474     auto ret = datashare_->PutFloatValue(AUDIO_BALANCE_KEY, audioBalance);
475     if (ret != RET_OK) {
476         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAudioBalance");
477         HILOG_ERROR("set audioBalance_ failed");
478         return ret;
479     }
480     audioBalance_ = audioBalance;
481     return ret;
482 }
483 
SetClickResponseTime(const uint32_t time)484 RetError AccessibilitySettingsConfig::SetClickResponseTime(const uint32_t time)
485 {
486     HILOG_DEBUG("clickResponseTime = [%{public}u]", time);
487     if (!datashare_) {
488         HILOG_ERROR("helper is nullptr");
489         return RET_ERR_NULLPTR;
490     }
491 
492     uint32_t clickResponseTime = time;
493     if (time == DOUBLE_CLICK_RESPONSE_TIME_MEDIUM) {
494         clickResponseTime = AccessibilityConfig::ResponseDelayMedium;
495     } else if (time > DOUBLE_CLICK_RESPONSE_TIME_MEDIUM) {
496         clickResponseTime = AccessibilityConfig::ResponseDelayLong;
497     }
498     auto ret = datashare_->PutIntValue(CLICK_RESPONCE_TIME, clickResponseTime);
499     if (ret != RET_OK) {
500         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetClickResponseTime");
501         HILOG_ERROR("set clickResponseTime_ failed");
502         return ret;
503     }
504     clickResponseTime_ = clickResponseTime;
505     return ret;
506 }
507 
SetIgnoreRepeatClickState(const bool state)508 RetError AccessibilitySettingsConfig::SetIgnoreRepeatClickState(const bool state)
509 {
510     HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
511     auto ret = SetConfigState(IGNORE_REPEAT_CLICK_SWITCH, state);
512     if (ret != RET_OK) {
513         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetIgnoreRepeatClickState");
514         HILOG_ERROR("set ignoreRepeatClickState_ failed");
515         return ret;
516     }
517     ignoreRepeatClickState_ = state;
518     return ret;
519 }
520 
SetIgnoreRepeatClickTime(const uint32_t time)521 RetError AccessibilitySettingsConfig::SetIgnoreRepeatClickTime(const uint32_t time)
522 {
523     HILOG_DEBUG("ignoreRepeatClickTime = [%{public}u]", time);
524     if (!datashare_) {
525         HILOG_ERROR("helper is nullptr");
526         return RET_ERR_NULLPTR;
527     }
528 
529     uint32_t ignoreRepeatClickTime = time;
530     if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORTEST) {
531         ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutShortest;
532     } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORT) {
533         ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutShort;
534     } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_MEDIUM) {
535         ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutMedium;
536     } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG) {
537         ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutLong;
538     } else if (time > DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG) {
539         ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutLongest;
540     }
541     auto ret = datashare_->PutIntValue(IGNORE_REPEAT_CLICK_TIME, ignoreRepeatClickTime);
542     if (ret != RET_OK) {
543         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetIgnoreRepeatClickTime");
544         HILOG_ERROR("set ignoreRepeatClickTime_ failed");
545         return ret;
546     }
547     ignoreRepeatClickTime_ = ignoreRepeatClickTime;
548     return ret;
549 }
550 
SetCaptionProperty(const AccessibilityConfig::CaptionProperty & caption)551 RetError AccessibilitySettingsConfig::SetCaptionProperty(const AccessibilityConfig::CaptionProperty& caption)
552 {
553     HILOG_DEBUG();
554     captionProperty_ = caption;
555     if (!datashare_) {
556         return RET_ERR_NULLPTR;
557     }
558 
559     auto fontFamilyRet = datashare_->PutStringValue(FONT_FAMILY, captionProperty_.GetFontFamily());
560     if (fontFamilyRet != RET_OK) {
561         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontFamily");
562     }
563     auto fontColorRet = datashare_->PutIntValue(FONT_COLOR, static_cast<int32_t>(captionProperty_.GetFontColor()));
564     if (fontColorRet != RET_OK) {
565         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontColor");
566     }
567     auto fontEdgeTypeRet = datashare_->PutStringValue(FONT_EDGE_TYPE, captionProperty_.GetFontEdgeType());
568     if (fontEdgeTypeRet != RET_OK) {
569         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontEdgeType");
570     }
571     auto backgroundColorRet = datashare_->PutIntValue(BACKGROUND_COLOR, static_cast<int32_t>(
572         captionProperty_.GetBackgroundColor()));
573     if (backgroundColorRet != RET_OK) {
574         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.backgroundColor");
575     }
576     auto windowColorRet = datashare_->PutIntValue(WINDOW_COLOR, static_cast<int32_t>(
577         captionProperty_.GetWindowColor()));
578     if (windowColorRet != RET_OK) {
579         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.windowColor");
580     }
581     auto fontScaleRet = datashare_->PutIntValue(FONT_SCALE, captionProperty_.GetFontScale());
582     if (fontScaleRet != RET_OK) {
583         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontScale");
584     }
585     return RET_OK;
586 }
587 
GetCaptionState() const588 bool AccessibilitySettingsConfig::GetCaptionState() const
589 {
590     return isCaptionState_;
591 }
592 
GetScreenMagnificationState() const593 bool AccessibilitySettingsConfig::GetScreenMagnificationState() const
594 {
595     return isScreenMagnificationState_;
596 }
597 
GetShortKeyState() const598 bool AccessibilitySettingsConfig::GetShortKeyState() const
599 {
600     return isShortKeyState_;
601 }
602 
GetShortKeyOnLockScreenState() const603 bool AccessibilitySettingsConfig::GetShortKeyOnLockScreenState() const
604 {
605     return isShortKeyEnabledOnLockScreen_;
606 }
607 
GetShortKeyTimeout() const608 int32_t AccessibilitySettingsConfig::GetShortKeyTimeout() const
609 {
610     return shortKeyTimeout_;
611 }
612 
GetMouseKeyState() const613 bool AccessibilitySettingsConfig::GetMouseKeyState() const
614 {
615     return isMouseKeyState_;
616 }
617 
GetMouseAutoClick() const618 int32_t AccessibilitySettingsConfig::GetMouseAutoClick() const
619 {
620     return mouseAutoClick_;
621 }
622 
GetShortkeyTarget() const623 const std::string &AccessibilitySettingsConfig::GetShortkeyTarget() const
624 {
625     return shortkeyTarget_;
626 }
627 
GetShortkeyMultiTarget()628 const std::vector<std::string> AccessibilitySettingsConfig::GetShortkeyMultiTarget()
629 {
630     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
631     std::vector<std::string> rtnVec = shortkeyMultiTarget_;
632     return rtnVec;
633 }
634 
GetHighContrastTextState() const635 bool AccessibilitySettingsConfig::GetHighContrastTextState() const
636 {
637     return highContrastTextState_;
638 }
639 
GetInvertColorState() const640 bool AccessibilitySettingsConfig::GetInvertColorState() const
641 {
642     return invertColorState_;
643 }
644 
GetAnimationOffState() const645 bool AccessibilitySettingsConfig::GetAnimationOffState() const
646 {
647     return animationOffState_;
648 }
649 
GetAudioMonoState() const650 bool AccessibilitySettingsConfig::GetAudioMonoState() const
651 {
652     return audioMonoState_;
653 }
654 
GetDaltonizationState() const655 bool AccessibilitySettingsConfig::GetDaltonizationState() const
656 {
657     return daltonizationState_;
658 }
659 
GetDaltonizationColorFilter() const660 uint32_t AccessibilitySettingsConfig::GetDaltonizationColorFilter() const
661 {
662     return daltonizationColorFilter_;
663 }
664 
GetContentTimeout() const665 uint32_t AccessibilitySettingsConfig::GetContentTimeout() const
666 {
667     return contentTimeout_;
668 }
669 
GetBrightnessDiscount() const670 float AccessibilitySettingsConfig::GetBrightnessDiscount() const
671 {
672     return brightnessDiscount_;
673 }
674 
GetAudioBalance() const675 float AccessibilitySettingsConfig::GetAudioBalance() const
676 {
677     return audioBalance_;
678 }
679 
GetEnabledState() const680 bool AccessibilitySettingsConfig::GetEnabledState() const
681 {
682     return enabled_;
683 }
684 
GetTouchGuideState() const685 bool AccessibilitySettingsConfig::GetTouchGuideState() const
686 {
687     return eventTouchGuideState_;
688 }
689 
GetGestureState() const690 bool AccessibilitySettingsConfig::GetGestureState() const
691 {
692     return gesturesSimulation_;
693 }
694 
GetKeyEventObserverState() const695 bool AccessibilitySettingsConfig::GetKeyEventObserverState() const
696 {
697     return filteringKeyEvents_;
698 }
699 
GetCaptionProperty() const700 const AccessibilityConfig::CaptionProperty &AccessibilitySettingsConfig::GetCaptionProperty() const
701 {
702     return captionProperty_;
703 };
704 
GetClickResponseTime() const705 uint32_t AccessibilitySettingsConfig::GetClickResponseTime() const
706 {
707     return clickResponseTime_;
708 }
709 
GetScreenMagnificationType() const710 uint32_t AccessibilitySettingsConfig::GetScreenMagnificationType() const
711 {
712     return screenMagnificationType_;
713 }
714 
GetIgnoreRepeatClickState() const715 bool AccessibilitySettingsConfig::GetIgnoreRepeatClickState() const
716 {
717     return ignoreRepeatClickState_;
718 }
719 
GetIgnoreRepeatClickTime() const720 uint32_t AccessibilitySettingsConfig::GetIgnoreRepeatClickTime() const
721 {
722     return ignoreRepeatClickTime_;
723 }
724 
SetEnabledAccessibilityServices(const std::vector<std::string> & services)725 RetError AccessibilitySettingsConfig::SetEnabledAccessibilityServices(const std::vector<std::string> &services)
726 {
727     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
728     enabledAccessibilityServices_ = services;
729     if (datashare_ == nullptr) {
730         HILOG_WARN("datashare_ is null.");
731         return RET_ERR_NULLPTR;
732     }
733     std::string stringOut = "";
734     Utils::VectorToString(enabledAccessibilityServices_, stringOut);
735     auto ret = datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
736     if (ret != RET_OK) {
737         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetEnabledAccessibilityServices");
738         HILOG_ERROR("set enabledAccessibilityServices failed");
739     }
740     return ret;
741 }
742 
GetEnabledAccessibilityServices()743 const std::vector<std::string> AccessibilitySettingsConfig::GetEnabledAccessibilityServices()
744 {
745     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
746     std::vector<std::string> rtnVec = enabledAccessibilityServices_;
747     return rtnVec;
748 }
749 
AddEnabledAccessibilityService(const std::string & serviceName)750 RetError AccessibilitySettingsConfig::AddEnabledAccessibilityService(const std::string &serviceName)
751 {
752     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
753     auto iter = std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(), serviceName);
754     if (iter != enabledAccessibilityServices_.end()) {
755         return RET_OK;
756     }
757 
758     if (!datashare_) {
759         return RET_ERR_NULLPTR;
760     }
761     enabledAccessibilityServices_.push_back(serviceName);
762     std::string stringOut = "";
763     Utils::VectorToString(enabledAccessibilityServices_, stringOut);
764     return datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
765 }
766 
RemoveEnabledAccessibilityService(const std::string & serviceName)767 RetError AccessibilitySettingsConfig::RemoveEnabledAccessibilityService(const std::string &serviceName)
768 {
769     std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
770     auto iter = std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(), serviceName);
771     if (iter == enabledAccessibilityServices_.end()) {
772         return RET_OK;
773     }
774 
775     if (!datashare_) {
776         return RET_ERR_NULLPTR;
777     }
778     enabledAccessibilityServices_.erase(iter);
779     std::string stringOut = "";
780     Utils::VectorToString(enabledAccessibilityServices_, stringOut);
781     return datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
782 }
783 
GetStartToHosState()784 bool AccessibilitySettingsConfig::GetStartToHosState()
785 {
786     HILOG_DEBUG();
787     if (!datashare_) {
788         return false;
789     }
790 
791     bool value = true;
792     value = datashare_->GetBoolValue("AccessibilityStartFromAtoHos", true);
793     return value;
794 }
795 
GetConfigState()796 uint32_t AccessibilitySettingsConfig::GetConfigState()
797 {
798     HILOG_DEBUG();
799     uint32_t state = 0;
800     if (isCaptionState_) {
801         state |= STATE_CAPTION_ENABLED;
802     }
803 
804     if (isScreenMagnificationState_) {
805         state |= STATE_SCREENMAGNIFIER_ENABLED;
806     }
807 
808     if (isMouseKeyState_) {
809         state |= STATE_MOUSEKEY_ENABLED;
810     }
811 
812     if (isShortKeyState_) {
813         state |= STATE_SHORTKEY_ENABLED;
814     }
815 
816     if (highContrastTextState_) {
817         state |= STATE_HIGHCONTRAST_ENABLED;
818     }
819 
820     if (daltonizationState_) {
821         state |= STATE_DALTONIZATION_STATE_ENABLED;
822     }
823 
824     if (invertColorState_) {
825         state |= STATE_INVETRTCOLOR_ENABLED;
826     }
827 
828     if (animationOffState_) {
829         state |= STATE_ANIMATIONOFF_ENABLED;
830     }
831 
832     if (audioMonoState_) {
833         state |= STATE_AUDIOMONO_ENABLED;
834     }
835 
836     if (ignoreRepeatClickState_) {
837         state |= STATE_IGNORE_REPEAT_CLICK_ENABLED;
838     }
839     return state;
840 }
841 
InitCaption()842 void AccessibilitySettingsConfig::InitCaption()
843 {
844     HILOG_DEBUG();
845     if (datashare_ == nullptr) {
846         return;
847     }
848 
849     std::string strValue = datashare_->GetStringValue(CAPTION_KEY, "");
850     HILOG_DEBUG(" pref_->GetString() = %{public}s.", strValue.c_str());
851     if (!std::strcmp(strValue.c_str(), "on")) {
852         isCaptionState_ = true;
853     } else {
854         isCaptionState_ = false;
855     }
856 
857     std::string fontFamliy = datashare_->GetStringValue(FONT_FAMILY, "default");
858     HILOG_DEBUG("fontFamily = %{public}s.", fontFamliy.c_str());
859 
860     int32_t fontScale =  static_cast<int32_t>(datashare_->GetIntValue(FONT_SCALE, DEFAULT_SCALE));
861     HILOG_DEBUG("fontScale = %{public}d.", fontScale);
862 
863     uint32_t fontColor = static_cast<uint32_t>(datashare_->GetIntValue(FONT_COLOR, DEFAULT_COLOR));
864     HILOG_DEBUG("fontColor = 0x%{public}x.", fontColor);
865 
866     std::string fontEdgeType = datashare_->GetStringValue(FONT_EDGE_TYPE, "none");
867     HILOG_DEBUG("fontEdgeType = 0x%{public}s.", fontEdgeType.c_str());
868 
869     uint32_t backgroundColor = static_cast<uint32_t>(datashare_->GetIntValue(BACKGROUND_COLOR, DEFAULT_COLOR));
870     HILOG_DEBUG("backgroundColor = 0x%{public}x.", backgroundColor);
871 
872     uint32_t windowColor = static_cast<uint32_t>(datashare_->GetIntValue(WINDOW_COLOR, DEFAULT_COLOR));
873     HILOG_DEBUG("windowColor = 0x%{public}x.", windowColor);
874 
875     captionProperty_.SetFontFamily(fontFamliy);
876     captionProperty_.SetFontScale(fontScale);
877     captionProperty_.SetFontColor(fontColor);
878     captionProperty_.SetFontEdgeType(fontEdgeType);
879     captionProperty_.SetBackgroundColor(backgroundColor);
880     captionProperty_.SetWindowColor(windowColor);
881 }
882 
InitShortKeyConfig()883 void AccessibilitySettingsConfig::InitShortKeyConfig()
884 {
885     isShortKeyState_ = datashare_->GetBoolValue(SHORTCUT_ENABLED, true);
886     bool isShortKeyEnabledOnLockScreen = datashare_->GetBoolValue(SHORTCUT_ENABLED_ON_LOCK_SCREEN, true);
887     shortKeyTimeout_ = static_cast<int32_t>(datashare_->GetIntValue(SHORTCUT_TIMEOUT, SHORT_KEY_TIMEOUT_BEFORE_USE));
888     // for AOS to HMOS
889     if (shortKeyTimeout_ == 1) {
890         SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
891     } else if (shortKeyTimeout_ == 0) {
892         SetShortKeyTimeout(SHORT_KEY_TIMEOUT_BEFORE_USE);
893     }
894 
895     shortkeyTarget_ = datashare_->GetStringValue("ShortkeyTarget", "none");
896 
897     std::string tmpString = datashare_->GetStringValue(SHORTCUT_SERVICE, SCREEN_READER_BUNDLE_ABILITY_NAME);
898     shortkeyMultiTarget_ = {};
899     Utils::StringToVector(tmpString, shortkeyMultiTarget_);
900 
901     bool isScreenReaderEnabledOriginal =
902         (std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(),
903         SCREEN_READER_BUNDLE_ABILITY_NAME) != enabledAccessibilityServices_.end());
904     tmpString = datashare_->GetStringValue(ENABLED_ACCESSIBILITY_SERVICES, "");
905     enabledAccessibilityServices_ = {};
906     Utils::StringToVector(tmpString, enabledAccessibilityServices_);
907     CloneShortkeyService(isScreenReaderEnabledOriginal);
908 
909     // Initialization of the private space after cloning or upgrade
910     std::shared_ptr<AccessibilitySettingProvider> service = AccessibilitySettingProvider::GetInstance(
911         POWER_MANAGER_SERVICE_ID);
912     if (service == nullptr) {
913         HILOG_ERROR("service is nullptr");
914         return;
915     }
916     bool cloneOrUpgradeFlag = false;
917     service->GetBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, cloneOrUpgradeFlag);
918     if (cloneOrUpgradeFlag && (accountId_ != DEFAULT_ACCOUNT_ID)) {
919         if (isShortKeyState_) {
920             SetShortKeyOnLockScreenState(true);
921         } else {
922             SetShortKeyOnLockScreenState(false);
923         }
924         SetDefaultShortcutKeyService();
925         service->PutBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, false);
926     }
927 }
928 
InitSetting()929 void AccessibilitySettingsConfig::InitSetting()
930 {
931     HILOG_DEBUG();
932     if (datashare_ == nullptr) {
933         return;
934     }
935 
936     InitShortKeyConfig();
937     CloneAudioState();
938     isScreenMagnificationState_ = datashare_->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
939     isMouseKeyState_= datashare_->GetBoolValue(MOUSEKEY, false);
940     animationOffState_ = datashare_->GetBoolValue(ANIMATION_OFF_KEY, false);
941     invertColorState_ = datashare_->GetBoolValue(INVERT_COLOR_KEY, false);
942     highContrastTextState_ = datashare_->GetBoolValue(HIGH_CONTRAST_TEXT_KEY, false);
943     daltonizationState_ = datashare_->GetBoolValue(DALTONIZATION_STATE, false);
944     audioMonoState_ = datashare_->GetBoolValue(AUDIO_MONO_KEY, false);
945     ignoreRepeatClickState_ = datashare_->GetBoolValue(IGNORE_REPEAT_CLICK_SWITCH, false);
946     mouseAutoClick_ = static_cast<int32_t>(datashare_->GetIntValue("MouseAutoClick", -1));
947     daltonizationColorFilter_ = static_cast<uint32_t>(datashare_->GetIntValue(DALTONIZATION_COLOR_FILTER_KEY, 0));
948     SetDaltonizationColorFilter(daltonizationColorFilter_);
949     contentTimeout_ = static_cast<uint32_t>(datashare_->GetIntValue(CONTENT_TIMEOUT_KEY, 0));
950     brightnessDiscount_ = static_cast<float>(datashare_->GetFloatValue(BRIGHTNESS_DISCOUNT_KEY, 1.0));
951     audioBalance_ = static_cast<float>(datashare_->GetFloatValue(AUDIO_BALANCE_KEY, 0));
952     SetAudioBalance(audioBalance_);
953     screenMagnificationType_ = static_cast<uint32_t>(datashare_->GetIntValue(SCREEN_MAGNIFICATION_TYPE, 0));
954     clickResponseTime_ = static_cast<uint32_t>(datashare_->GetIntValue(CLICK_RESPONCE_TIME, 0));
955     SetClickResponseTime(clickResponseTime_);
956     ignoreRepeatClickTime_ = static_cast<uint32_t>(datashare_->GetIntValue(IGNORE_REPEAT_CLICK_TIME, 0));
957     SetIgnoreRepeatClickTime(ignoreRepeatClickTime_);
958 }
959 
InitCapability()960 void AccessibilitySettingsConfig::InitCapability()
961 {
962     HILOG_DEBUG();
963     if (datashare_ == nullptr) {
964         return;
965     }
966 
967     enabled_ = datashare_->GetBoolValue(ACCESSIBILITY, false);
968     eventTouchGuideState_ = datashare_->GetBoolValue(TOUCH_GUIDE_STATE, false);
969     gesturesSimulation_ = datashare_->GetBoolValue(GESTURE_KEY, false);
970     filteringKeyEvents_ = datashare_->GetBoolValue(KEYEVENT_OBSERVER, false);
971 }
972 
SetConfigState(const std::string & key,bool value)973 RetError AccessibilitySettingsConfig::SetConfigState(const std::string& key, bool value)
974 {
975     if (!datashare_) {
976         return RET_ERR_NULLPTR;
977     }
978     auto ret = datashare_->PutBoolValue(key, value);
979     if (ret != RET_OK) {
980         HILOG_ERROR("set configState failed");
981     }
982     return ret;
983 }
984 
Init()985 void AccessibilitySettingsConfig::Init()
986 {
987     HILOG_DEBUG();
988     datashare_ = std::make_shared<AccessibilityDatashareHelper>(DATASHARE_TYPE::SECURE, accountId_);
989     if (datashare_ == nullptr) {
990         return;
991     }
992     datashare_->Initialize(POWER_MANAGER_SERVICE_ID);
993     InitCaption();
994     InitSetting();
995 
996     systemDatashare_ = std::make_shared<AccessibilityDatashareHelper>(DATASHARE_TYPE::SYSTEM, accountId_);
997     if (systemDatashare_ == nullptr) {
998         return;
999     }
1000     systemDatashare_->Initialize(POWER_MANAGER_SERVICE_ID);
1001 }
1002 
ClearData()1003 void AccessibilitySettingsConfig::ClearData()
1004 {
1005     HILOG_DEBUG();
1006 }
1007 
CloneAudioState()1008 void AccessibilitySettingsConfig::CloneAudioState()
1009 {
1010     HILOG_DEBUG();
1011     if (systemDatashare_ == nullptr) {
1012         return;
1013     }
1014 
1015     RetError ret = RET_OK;
1016     int32_t monoValue = static_cast<int32_t>(systemDatashare_->GetIntValue(AUDIO_MONO_KEY, INVALID_MASTER_MONO_VALUE));
1017     if (monoValue != INVALID_MASTER_MONO_VALUE) {
1018         SetAudioMonoState(monoValue == 1);
1019         ret = systemDatashare_->PutIntValue(AUDIO_MONO_KEY, INVALID_MASTER_MONO_VALUE);
1020         if (ret != RET_OK) {
1021             Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "CloneAudioState.monoValue");
1022             HILOG_ERROR("reset monoValue in system table failed");
1023         }
1024     }
1025 
1026     float audioBalance = static_cast<float>(systemDatashare_->GetFloatValue(AUDIO_BALANCE_KEY,
1027         INVALID_MASTER_BALANCE_VALUE));
1028     if (abs(audioBalance - INVALID_MASTER_BALANCE_VALUE) > EPS) {
1029         SetAudioBalance(audioBalance);
1030         ret = systemDatashare_->PutFloatValue(AUDIO_BALANCE_KEY, INVALID_MASTER_BALANCE_VALUE);
1031         if (ret != RET_OK) {
1032             Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "CloneAudioState.audioBalance");
1033             HILOG_ERROR("reset audioBalance in system table failed");
1034         }
1035     }
1036 }
1037 
GetShortKeyService(std::vector<std::string> & services)1038 uint32_t AccessibilitySettingsConfig::GetShortKeyService(std::vector<std::string> &services)
1039 {
1040     uint32_t serviceFlag = 0;
1041 
1042     auto screenReader = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
1043         return service.find(SCREENREADER_TAG) != std::string::npos;
1044     });
1045     serviceFlag = screenReader != services.end() ? STATE_EXPLORATION_ENABLED : serviceFlag;
1046 
1047     auto invertColor = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
1048         return service.find(INVERT_COLOR_AOS_TAG) != std::string::npos ||
1049             service.find(INVERT_COLOR_HMOS_TAG) != std::string::npos;
1050     });
1051     serviceFlag = invertColor != services.end() ? (serviceFlag | STATE_INVETRTCOLOR_ENABLED) : serviceFlag;
1052 
1053     auto audioMono = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
1054         return service.find(AUDIO_MONO_HMOS_TAG) != std::string::npos;
1055     });
1056     serviceFlag = audioMono != services.end() ? (serviceFlag | STATE_AUDIOMONO_ENABLED) : serviceFlag;
1057 
1058     auto highContrastText = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
1059         return service.find(HIGH_CONTRAST_TEXT_HMOS_TAG) != std::string::npos;
1060     });
1061     serviceFlag = highContrastText != services.end() ? (serviceFlag | STATE_HIGHCONTRAST_ENABLED) : serviceFlag;
1062 
1063     return serviceFlag;
1064 }
1065 
CloneShortkeyService(bool isScreenReaderEnabled)1066 void AccessibilitySettingsConfig::CloneShortkeyService(bool isScreenReaderEnabled)
1067 {
1068     std::vector<std::string> tmpVec = GetShortkeyMultiTarget();
1069     uint32_t shortkeyServiceFlag = GetShortKeyService(tmpVec);
1070     std::vector<std::string> shortkeyService;
1071     if (shortkeyServiceFlag & STATE_EXPLORATION_ENABLED) {
1072         shortkeyService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
1073     }
1074     if (shortkeyServiceFlag & STATE_INVETRTCOLOR_ENABLED) {
1075         shortkeyService.push_back(INVERT_COLOR_HMOS_TAG);
1076     }
1077     if (shortkeyServiceFlag & STATE_AUDIOMONO_ENABLED) {
1078         shortkeyService.push_back(AUDIO_MONO_HMOS_TAG);
1079     }
1080     if (shortkeyServiceFlag & STATE_HIGHCONTRAST_ENABLED) {
1081         shortkeyService.push_back(HIGH_CONTRAST_TEXT_HMOS_TAG);
1082     }
1083     SetShortkeyMultiTarget(shortkeyService);
1084 
1085     tmpVec = GetEnabledAccessibilityServices();
1086     shortkeyServiceFlag = GetShortKeyService(tmpVec);
1087     std::vector<std::string> enabledShortkeyService;
1088     if ((shortkeyServiceFlag & STATE_EXPLORATION_ENABLED) || (isScreenReaderEnabled == true)) {
1089         enabledShortkeyService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
1090     }
1091     SetEnabledAccessibilityServices(enabledShortkeyService);
1092 }
1093 
SetDefaultShortcutKeyService()1094 void AccessibilitySettingsConfig::SetDefaultShortcutKeyService()
1095 {
1096     HILOG_DEBUG();
1097 
1098     if (GetShortkeyMultiTarget().empty()) {
1099         HILOG_INFO("set default shortcut key service.");
1100         std::vector<std::string> defaultService;
1101         defaultService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
1102         SetShortkeyMultiTarget(defaultService);
1103     }
1104 }
1105 
OnDataClone()1106 void AccessibilitySettingsConfig::OnDataClone()
1107 {
1108     HILOG_INFO();
1109 
1110     bool isShortkeyEnabled = GetShortKeyState();
1111     bool isShortkeyEnabledOnLockScreen = GetShortKeyOnLockScreenState();
1112 
1113     InitSetting();
1114     SetDefaultShortcutKeyService();
1115 
1116     if (isShortKeyState_) {
1117         SetShortKeyOnLockScreenState(true);
1118     } else {
1119         SetShortKeyOnLockScreenState(false);
1120     }
1121 
1122     if (isShortkeyEnabled != GetShortKeyState()) {
1123         SetShortKeyState(isShortkeyEnabled);
1124         SetShortKeyState(!isShortkeyEnabled);
1125     }
1126     if (isShortkeyEnabledOnLockScreen != GetShortKeyOnLockScreenState()) {
1127         SetShortKeyOnLockScreenState(isShortkeyEnabledOnLockScreen);
1128         SetShortKeyOnLockScreenState(!isShortkeyEnabledOnLockScreen);
1129     }
1130     Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateShortKeyRegister();
1131 
1132     std::shared_ptr<AccessibilitySettingProvider> service =
1133         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
1134     if (service == nullptr) {
1135         HILOG_ERROR("service is nullptr");
1136         return;
1137     }
1138     bool isScreenReaderEnabled =
1139         (std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(),
1140         SCREEN_READER_BUNDLE_ABILITY_NAME) != enabledAccessibilityServices_.end());
1141     if (isScreenReaderEnabled) {
1142         ErrCode ret = service->PutBoolValue(ACCESSIBILITY_SCREENREADER_ENABLED, true, true);
1143         Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "OnDataClone.screenReader");
1144         HILOG_INFO("set screenReader state, ret = %{public}d", ret);
1145     }
1146     service->PutBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, true);
1147     service->PutBoolValue(ACCESSIBILITY_CLONE_FLAG, false);
1148 }
1149 } // namespace Accessibility
1150 } // namespace OHOS