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